我想在Flutter应用程序中的几个不同位置放置一个列表项。我认为我会创建一个泛型类,而不是重复的代码。在某些地方,该项目的右侧将有一个按钮,而在某些地方则没有。不会出现的地方之一是DropdownMenuItem。
我正在使用“扩展”将项目的文本左对齐,同时将按钮放在项目的最右侧。但是将Expanded放在DropdownMenuItem中会给我这个错误:
RenderFlex子级的flex为非零值,但传入的宽度限制不受限制。
以下是DropdownButtonFormField的代码:
class MyHomePage extends StatelessWidget {
MyHomePage({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("App Title"),
),
body: Column(
children: <Widget>[
DropdownButtonFormField<int>(
value: null,
items: [
DropdownMenuItem<int>(
value: 1,
child: MultiUseItem2(
leading: Icon(Icons.filter_1), text: "Option 1"),
),
DropdownMenuItem<int>(
value: 2,
child: MultiUseItem2(
leading: Icon(Icons.filter_2), text: "Option 2"),
),
],
),
// more fields...
],
),
);
}
}
这是引发错误的通用列表项:
class MultiUseItem extends StatelessWidget {
MultiUseItem(
{Key key, @required this.leading, @required this.text, this.trailing})
: super(key: key);
final Widget leading;
final String text;
final Widget trailing;
@override
Widget build(BuildContext cx) {
return Row(
children: [
leading,
Expanded(child: Text(text)),
if (trailing != null) trailing,
],
);
}
}
从下拉列表中删除“展开”后,错误消失了:
class MultiUseItem2 extends StatelessWidget {
MultiUseItem2(
{Key key, @required this.leading, @required this.text, this.trailing})
: super(key: key);
final Widget leading;
final String text;
final Widget trailing;
@override
Widget build(BuildContext cx) {
return Row(
children: [
leading,
if (trailing == null)
Text(text)
else
...[
Expanded(child: Text(text)),
trailing,
],
],
);
}
}
但是,由于在MultiUseItem2中没有明显的理由可以实现这种条件,所以这看起来像是黑客。
那我为什么会收到此错误,以及解决该错误的更惯用的方法是什么?
P.S。我要滚动自己的列表项,因为ListTile不提供对其内部填充的控制。
此外,上面的代码并不能证明通过通用类创建每个菜单项都是合理的。在实际的代码中,通用类对图标进行硬编码,因此下拉菜单不需要知道要使用哪个图标。