Как условно добавить виджеты в список? - PullRequest
0 голосов
/ 28 августа 2018

Во флаттере такие виджеты, как Row / ListView / Stack, не обрабатывают нулевые дочерние элементы. Поэтому, если мы хотим условно добавить виджеты как дети, я обычно делаю следующее:

Row(
  children: <Widget>[
    foo == 42 ? Text("foo") : Container(),
  ],
);

Но кажется странным добавить пустой контейнер.

Другое решение - фильтр where:

Row(
  children: <Widget>[
    foo == 42 ? Text("foo") : null,
  ].where((t) => t != null).toList(),
);

Это решает проблему пустого контейнера, но у нас все еще есть уродливый троичный, и писать его утомительно.

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

Ответы [ 3 ]

0 голосов
/ 07 марта 2019

Вот более простая версия, которую я использую:

Row(
  children: [
    Text("always included"),
    skipNulls([
      icon,
      label,
    ]),
  ],
);

skipNulls<T>(List<T> items) {
  return items..removeWhere((item) => item == null);
}
0 голосов
/ 28 июня 2019

Новый синтаксис Dart разрешает «если» в списках, что приводит к этому простому решению:

Row(
  children: <Widget>[
    if (foo == 42) Text("foo"),
  ],
);
0 голосов
/ 28 августа 2018

EDIT

Начиная с Dart 2.2, новый синтаксис изначально поддерживает это:

Column(
  children: [
    if (foo != null) Text(foo),
    Bar(),
  ],
);

Эта проблема в настоящее время обсуждается на github здесь .

Но сейчас вы можете использовать функции dart sync*:

Row(
  children: toList(() sync* {
    if (foo == 42) {
      yield Text("foo");
    }
  }),
);

, где toList:

typedef Iterable<T> IterableCallback<T>();

List<T> toList<T>(IterableCallback<T> cb) {
  return List.unmodifiable(cb());
}

Не только решает проблему условного сложения; он также позволяет использовать «оператора распространения» благодаря yield*. Пример: * 1 023 *

List<Widget> foo;

Row(
  children: toList(() sync* {
    yield Text("Hello World");
    yield* foo;
  }),
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...