失败的断言: 第549行 第12个位置: 'child.hasSize':不为真
失败的断言: 第549行 第12个位置: 'child.hasSize':不为真
我是Flutter的新手,正在使用底部导航视图。在Dashboard类中,有底部导航栏。底部导航的第一个是Home类,它有一个选项卡视图。选项卡视图的第一页是NewRequest类。当应用程序首次运行时,选项卡视图的第一页不会加载,但是当进入其他类并返回Home时,NewRequest会加载。如何在应用程序首次运行时加载选项卡视图的第一页?我已经实现如下:
Dashboard类:
class Dashboard extends StatefulWidget {
@override
State
return _DashboardState();
}
}
class _DashboardState extends State
int _currentIndex = 0;
bool home = true;
final tabs = [
Home(),
Center(child: Text('History')),
Center(child: Text('Wallet')),
Center(child: Text('More')),
];
final _title = [
Center(child: Text("Dashboard"),),
Center(child: Text("History"),),
Center(child: Text("Wallet"),),
Center(child: Text("More"),),
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: home ? null : AppBar(
title: _title[_currentIndex],
automaticallyImplyLeading: false,
),
body: Container(
child: tabs[_currentIndex],
),
bottomNavigationBar: _bottomNavigationBar(),
);
}
Widget _bottomNavigationBar() {
return BottomNavigationBar(
currentIndex: _currentIndex,
type: BottomNavigationBarType.fixed,
backgroundColor: Theme.of(context).primaryColor,
selectedItemColor: Theme.of(context).accentColor,
unselectedItemColor: Colors.white,
items: [
BottomNavigationBarItem(
icon: Icon(Icons.home),
title: Text("Home"),
),
BottomNavigationBarItem(
icon: Icon(Icons.history),
title: Text("History"),
),
BottomNavigationBarItem(
icon: Icon(Icons.account_balance_wallet),
title: Text("Wallet"),
),
BottomNavigationBarItem(
icon: Icon(Icons.menu),
title: Text("More"),
),
],
onTap: (index) {
setState(() {
_currentIndex = index;
if (index == 0) {
home = true;
} else {
home = false;
}
});
},
);
}
}
Home类:
class Home extends StatefulWidget {
@override
State
return _HomeState();
}
}
class _HomeState extends State
int index;
@override
void initState() {
super.initState();
index = 0;
}
final pages = [
NewRequest(),
Column(
children:
),
Column(
children:
),
Column(
children:
),
];
final tabs = [
Text('Request'),
Text('Accepted'),
Text('Cooking'),
Text('Cooked'),
];
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: DefaultTabController(
length: 4,
initialIndex: 0,
child: Scaffold(
appBar: PreferredSize(
preferredSize: Size.fromHeight(56.0),
child: Container(
color: Theme.of(context).primaryColor,
child: SafeArea(
child: Column(
children:
Expanded(
child: Container(
child: TabBar(
unselectedLabelColor: Colors.white,
labelColor: Theme.of(context).accentColor,
indicatorColor: Theme.of(context).accentColor,
isScrollable: true,
tabs: List
return tabs[index];
}),
),
),
),
],
),
),
),
),
body: TabBarView(
children: pages,
),
),
),
);
}
}
NewRequest类:
class NewRequest extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ListView(
shrinkWrap: true,
children:
_CardView(),
_CardView(),
_CardView(),
_CardView(),
],
);
}
}
Widget _CardView() {
return Card(
margin: EdgeInsets.all(15.0),
elevation: 15.0,
child: Container(
height: 185,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children:
Row(
children:
Expanded(
child: FittedBox(
child: Image.asset('assets/images/momo.jpg'),
fit: BoxFit.fill,
),
),
Container(
child: Expanded(
child: Container(
margin: EdgeInsets.only(left: 10.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
mainAxisSize: MainAxisSize.max,
children:
Row(
mainAxisAlignment: MainAxisAlignment.start,
children:
Text("Momo", style: TextStyle(fontSize: 16.0)),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.start,
children:
Text(
"Rs.100",
style: TextStyle(fontSize: 16.0),
),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.start,
children:
Text(
"2 Plate",
style: TextStyle(fontSize: 16.0),
),
],
),
],
),
),
),
),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.end,
children:
Expanded(
child: Container(
margin: EdgeInsets.only(
left: 5.0, right: 5.0, top: 5.0, bottom: 2.0),
child: RaisedButton(
color: Colors.red,
child: Text(
"Reject",
style: TextStyle(color: Colors.white),
),
onPressed: () => null,
),
),
),
Expanded(
child: Container(
margin: EdgeInsets.only(
left: 5.0, right: 5.0, top: 5.0, bottom: 0.0),
child: RaisedButton(
color: Colors.green,
child: Text(
"Approve",
style: TextStyle(color: Colors.white),
),
onPressed: () => null,
),
),
),
],
),
],
),
),
);
}
在开发Flutter应用程序时,有时会遇到错误消息"Failed assertion: line 549 pos 12: 'child.hasSize' is not true"。这个错误消息表示在代码的第549行的第12个位置出现了一个断言错误。这个错误通常是由于某个小部件没有指定尺寸而引起的。
解决这个问题的方法是将出错的小部件包裹在一个指定高度的容器中。通过给小部件设置一个明确的尺寸,可以确保它有一个有效的大小,并避免这个错误的发生。下面是一个示例代码,展示了如何使用Container包装小部件并指定高度:
Container(
height: 200, // 设置容器的高度为200
child: YourWidget(), // 将出错的小部件包裹在Container中
)
在这个示例中,我们创建了一个高度为200的容器,并将出错的小部件作为其子小部件放入其中。通过这样做,我们确保了这个小部件有一个有效的尺寸,并且避免了"Failed assertion: line 549 pos 12: 'child.hasSize' is not true"这个错误的发生。
如果你在开发Flutter应用程序时遇到了类似的错误,可以尝试将出错的小部件包裹在一个指定尺寸的容器中,看看是否能够解决问题。希望这篇文章对你有所帮助!
这是很晚了,但我刚遇到了同样的问题。我不确定如何解决您的具体示例,但我在这里发布我的问题的解决方案,希望能帮助其他人。
return Row(children: [
Container(child: Text('•'), margin: EdgeInsets.only(left: 25*indentLevel.toDouble(), right: 5),),
Expanded(child: TextField(
cursorColor: Colors.black,
autofocus: true,
))
]);
我的问题出在TextField上 - Failed assertion: ... 'hasSize。TextField没有显式的大小选项,而是从其父级继承大小(从sizing a TextField这篇帖子中推测出来)。如果父级也没有特定的大小(例如Row,Column,ListView垂直方向),则可能会发生错误。如您在上面的代码中所看到的,我通过将TextField包装在一个Expanded小部件中来解决此问题,该小部件填充其父级以获取自己的尺寸,然后将其传递给TextField。