Flutter: Как создать DropdownMenuItem с ListTile как дочерний - PullRequest
0 голосов
/ 11 марта 2020

Я хочу создать DropDownButton, в котором DropDownMenuItem имеет ListTile () в качестве дочернего элемента вместо обычного виджета Text (). Здесь задается аналогичный вопрос здесь , но, к сожалению, ответ, похоже, не работает.

Вот мой код:

class _MyHomePageState extends State<MyHomePage> {
  String choice = 'Item 1';

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Card(
        child: DropdownButton(
          value: choice,
          items: stringItems.map<DropdownMenuItem<String>>((String value) {
            return DropdownMenuItem<String>(
              value: value,
              child: getListTile(value),
              // child: Text(value),
            );
          }).toList(),
          onChanged: (String newValue) {
            setState(() {
              choice = newValue;
            });
          }
        )
      ),
    );
  }

  Widget getListTile(String value) {
    return ListTile(
      leading: Text('FooBar'),
      title: Text(value),
      trailing: Icon(Icons.euro_symbol),
    );
  }

  List<String> stringItems = ['Item 1', 'Item 2', 'Item 3', 'Item 4'];
}

Выдается следующее исключение :

The following assertion was thrown during performLayout():
BoxConstraints forces an infinite width.
The offending constraints were:
BoxConstraints (w=Infinity, 0.0<=h<=48.0)
The relevant error-causing widget was:
ListTile

Я провел некоторое исследование об этом исключении, но все, что я нашел, это статьи / учебные пособия, касающиеся столбцов и строк. в чем именно проблема?: (Насколько я понимаю, ListTile будет растягиваться по ширине до бесконечности).

Решения, которые я пробовал до сих пор:

  1. Я пытался установить "ширину" "ListTile к указанному c значению, но ListTile не имеет свойства" width ".

  2. Я обернул ListTile-Widget в Expanded-Widget. Но это тоже не сработало.

Есть ли решение?

Заранее спасибо!

1 Ответ

1 голос
/ 11 марта 2020

ListTile не имеет ограничений и будет стараться использовать как можно больше места. Если вы обернетесь ListTile с Container фиксированными height и width, у вас больше не будет проблем:

Widget getListTile(String value) {
  return Container(
    height: 60,
    width: 100,
    child: ListTile(
      leading: Text('FooBar'),
      title: Text(value),
      trailing: Icon(Icons.euro_symbol),
    ),
  );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...