为什么不能将Expanded放在DropdownMenuItem中?

时间:2019-11-01 14:57:25

标签: flutter constraints dropdown

我想在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不提供对其内部填充的控制。

此外,上面的代码并不能证明通过通用类创建每个菜单项都是合理的。在实际的代码中,通用类对图标进行硬编码,因此下拉菜单不需要知道要使用哪个图标。

0 个答案:

没有答案