Почему я не могу поместить Expanded в DropdownMenuItem? - PullRequest
0 голосов
/ 01 ноября 2019

Я хочу поместить элемент списка в несколько разных мест в моем приложении Flutter. Вместо того, чтобы дублировать код, я подумал, что создам общий класс. В некоторых местах у элемента будет кнопка справа, а в некоторых - нет. Одно из мест, где это не будет, находится в DropdownMenuItem.

Я использую Expanded, чтобы выровнять текст элемента по левому краю, в то время как кнопка находится на правой стороне элемента. Но добавление Expanded в DropdownMenuItem дает мне эту ошибку:

У дочерних элементов RenderFlex ненулевое сгибание, но входящие ограничения ширины не ограничены.

Вот код для 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,
      ],
    );
  }
}

Ошибка исчезает, когда я удаляю Expanded из выпадающего списка:

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 нет явной причины для этого условия, это выглядит как хак.

Так почему я получаю эту ошибку и какой идиоматичный способ ее устранения?

PS Я перевожу свои собственные элементы списка, потому что ListTile не обеспечивает контроль над его внутренним заполнением.

Кроме того, приведенный выше код не оправдывает создание каждого пункта меню через универсальный класс. В реальном коде универсальный класс жестко кодирует значок, поэтому раскрывающемуся списку не нужно знать, какой значок использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...