【发布时间】:2018-04-25 12:50:43
【问题描述】:
我正在尝试创建一个具有按钮的小部件,只要按下该按钮,就会在其下方打开一个列表,填充按钮下方的所有空间。我用一个简单的Column 实现了它,如下所示:
class _MyCoolWidgetState extends State<MyCoolWidget> {
...
@override
Widget build(BuildContext context) {
return new Column(
children: <Widget>[
new MyButton(...),
isPressed ? new Expanded(
child: new SizedBox(
width: MediaQuery.of(context).size.width,
child: new MyList()
)
) : new Container()
]
)
}
}
这在很多情况下都可以正常工作,但不是全部。
问题我在创建此小部件时遇到的问题是,如果将 MyCoolWidget 放在 Row 内,例如与其他小部件一起使用,那么可以说其他 MyCoolWidgets,列表受Row 所暗示的宽度限制。
我尝试使用OverflowBox 解决此问题,但不幸的是没有运气。
此小部件与选项卡的不同之处在于它们可以放置在小部件树中的任何位置,当按下按钮时,即使这意味着忽略约束,列表也会填满按钮下的所有空间。
下图是我试图在Row 中的“BUTTON1”和“BUTTON2”或MyCoolWidgets 中实现的效果:
编辑:实际代码片段
class _MyCoolWidgetState extends State<MyCoolWidget> {
bool isTapped = false;
@override
Widget build(BuildContext context) {
return new Column(
children: <Widget>[
new SizedBox(
height: 20.0,
width: 55.0,
child: new Material(
color: Colors.red,
child: new InkWell(
onTap: () => setState(() => isTapped = !isTapped),
child: new Text("Surprise"),
),
),
),
bottomList()
],
);
}
Widget comboList() {
if (isTapped) {
return new Expanded(
child: new OverflowBox(
child: new Container(
color: Colors.orange,
width: MediaQuery.of(context).size.width,
child: new ListView( // Random list
children: <Widget>[
new Text("ok"),
new Text("ok"),
new Text("ok"),
new Text("ok"),
new Text("ok"),
new Text("ok"),
new Text("ok"),
new Text("ok"),
new Text("ok"),
new Text("ok"),
new Text("ok"),
new Text("ok"),
new Text("ok"),
],
)
)
),
);
} else {
return new Container();
}
}
}
我是这样使用的:
class Home extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Row(
children: <Widget>[
new Expanded(child: new MyCoolWidget()),
new Expanded(child: new MyCoolWidget()),
]
)
}
}
【问题讨论】:
-
你能链接一个不工作的代码吗?这样我们就可以自己重现错误。
-
@RémiRousselet 已添加!
-
@RémiRousselet 又改了一点,这样你就可以简单地复制粘贴来复制了:)
-
你可以发布包含按钮的“工作”代码而不是溢出的东西吗?溢出不是解决方案。
-
@RémiRousselet 这是我用于我要创建的小部件的代码,唯一的区别是我将按钮代码从单独的类中提取到
Column并创建一个虚拟列表。我连续只有两个这样的小部件,添加行的代码会有帮助吗?