Я хочу поместить элемент списка в несколько разных мест в моем приложении 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 не обеспечивает контроль над его внутренним заполнением.
Кроме того, приведенный выше код не оправдывает создание каждого пункта меню через универсальный класс. В реальном коде универсальный класс жестко кодирует значок, поэтому раскрывающемуся списку не нужно знать, какой значок использовать.