Flutter - 堆栈中的定位小部件导致异常
Flutter - Positioned Widget in Stack causing Exception
当我尝试使用 Positioned 小部件封装 PandemicCard 时出现以下异常。如果我渲染卡片 lone/no 定位小部件,它工作得很好。
I/flutter ( 7331): ══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞═════════════════════════════════════════════════════════
I/flutter ( 7331): The following assertion was thrown during performLayout():
I/flutter ( 7331): RenderStack object was given an infinite size during layout.
I/flutter ( 7331): This probably means that it is a render object that tries to be as big as possible, but it was put
I/flutter ( 7331): inside another render object that allows its children to pick their own size.
I/flutter ( 7331): The nearest ancestor providing an unbounded height constraint is:
I/flutter ( 7331): RenderFlex#2b18c relayoutBoundary=up2 NEEDS-LAYOUT NEEDS-PAINT OVERFLOWING
I/flutter ( 7331): creator: Column ← Center ← MediaQuery ← LayoutId-[<_ScaffoldSlot.body>] ← CustomMultiChildLayout ←
对于这段代码。谁能帮我弄清楚我做错了什么?
class PandemicCard extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
height: 120.0,
width: 76.0,
decoration: BoxDecoration(
color: Colors.blue,
boxShadow: [
BoxShadow(
blurRadius: 5.0,
color: Colors.grey)
]),
child: Text('Hi'),
);
}
}
class PandemicCardStackState extends State<PandemicCardStack> {
// final _cards = <PandemicCard>[ PandemicCard(), PandemicCard()];
final _cards = <PandemicCard>[ PandemicCard()];
@override
Widget build( BuildContext context) {
return Stack(
// This Bombs!
children: <Widget>[ Positioned( left: 0.0, top: 0.0, child: _cards[0])]
// This works!
// children: <Widget>[ _cards[0]]
);
}
}
class PandemicCardStack extends StatefulWidget {
@override
PandemicCardStackState createState() => PandemicCardStackState();
}
添加一个空的 Container
作为堆栈的 child
:
@override
Widget build( BuildContext context) {
return Stack(
children: <Widget>[
Container(),
Positioned( left: 0.0, top: 0.0, child: _cards[0]),
]
);
}
其他解决方法:
(a) 将堆栈包裹在已知高度的容器上:
Container(
height: 50,
child: Stack(
children: [
Positioned(top: 10, left: 10, child: Text('My child'))
]),
),
(b) 按照建议添加空 Container() 和 Clip.none:
Stack(
clipBehavior: Clip.none,
children: [
Container(),
Positioned(top: 10, left: 10, child: Text('My child'))
]),
当我尝试使用 Positioned 小部件封装 PandemicCard 时出现以下异常。如果我渲染卡片 lone/no 定位小部件,它工作得很好。
I/flutter ( 7331): ══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞═════════════════════════════════════════════════════════
I/flutter ( 7331): The following assertion was thrown during performLayout():
I/flutter ( 7331): RenderStack object was given an infinite size during layout.
I/flutter ( 7331): This probably means that it is a render object that tries to be as big as possible, but it was put
I/flutter ( 7331): inside another render object that allows its children to pick their own size.
I/flutter ( 7331): The nearest ancestor providing an unbounded height constraint is:
I/flutter ( 7331): RenderFlex#2b18c relayoutBoundary=up2 NEEDS-LAYOUT NEEDS-PAINT OVERFLOWING
I/flutter ( 7331): creator: Column ← Center ← MediaQuery ← LayoutId-[<_ScaffoldSlot.body>] ← CustomMultiChildLayout ←
对于这段代码。谁能帮我弄清楚我做错了什么?
class PandemicCard extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
height: 120.0,
width: 76.0,
decoration: BoxDecoration(
color: Colors.blue,
boxShadow: [
BoxShadow(
blurRadius: 5.0,
color: Colors.grey)
]),
child: Text('Hi'),
);
}
}
class PandemicCardStackState extends State<PandemicCardStack> {
// final _cards = <PandemicCard>[ PandemicCard(), PandemicCard()];
final _cards = <PandemicCard>[ PandemicCard()];
@override
Widget build( BuildContext context) {
return Stack(
// This Bombs!
children: <Widget>[ Positioned( left: 0.0, top: 0.0, child: _cards[0])]
// This works!
// children: <Widget>[ _cards[0]]
);
}
}
class PandemicCardStack extends StatefulWidget {
@override
PandemicCardStackState createState() => PandemicCardStackState();
}
添加一个空的 Container
作为堆栈的 child
:
@override
Widget build( BuildContext context) {
return Stack(
children: <Widget>[
Container(),
Positioned( left: 0.0, top: 0.0, child: _cards[0]),
]
);
}
其他解决方法:
(a) 将堆栈包裹在已知高度的容器上:
Container(
height: 50,
child: Stack(
children: [
Positioned(top: 10, left: 10, child: Text('My child'))
]),
),
(b) 按照建议添加空 Container() 和 Clip.none:
Stack(
clipBehavior: Clip.none,
children: [
Container(),
Positioned(top: 10, left: 10, child: Text('My child'))
]),