How to conditionally add widgets to a list? How to conditionally add widgets to a list? dart dart

How to conditionally add widgets to a list?


EDIT:

Since Dart 2.2, new syntaxes supports this natively:

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

This problem is currently debated on github here.

But for now, you can use dart sync* functions:

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

where toList is:

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

Not only it solves the conditional addition problem; it also allows for a "spread operator" thanks to yield*. Example:

List<Widget> foo;Row(  children: toList(() sync* {    yield Text("Hello World");    yield* foo;  }),);


The new Dart syntax allows 'if' in lists, which leads to this simple solution:

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


Here's a simpler version I use:

Row(  children: [    Text("always included"),    skipNulls([      icon,      label,    ]),  ],);skipNulls<T>(List<T> items) {  return items..removeWhere((item) => item == null);}