How to convert a List<String?> to List<String> in null safe Dart?
-
Ideally you'd start with a
List<String>
in the first place. If you're building your list like:String? s = maybeNullString(); var list = <String?>[ 'foo', 'bar', someCondition ? 'baz' : null, s, ];
then you instead can use collection-
if
to avoid insertingnull
elements:String? s = maybeNullString(); var list = <String?>[ 'foo', 'bar', if (someCondition) 'baz', if (s != null) s, ];
-
An easy way to filter out
null
values from anIterable<T?>
and get anIterable<T>
result is to use.whereType<T>()
. For example:var list = <String?>['foo', 'bar', null, 'baz', null]; var withoutNulls = list.whereType<String>().toList();
-
Another approach is to use collection-
for
with collection-if
:var list = <String?>['foo', 'bar', null, 'baz', null]; var withoutNulls = <String>[ for (var s in list) if (s != null) s ];
-
Finally, if you already know that your
List
doesn't contain anynull
elements but just need to cast the elements to a non-nullable type, other options are to useList.from
:var list = <String?>['foo', 'bar', null, 'baz', null]; var withoutNulls = List<String>.from(list.where((c) => c != null));
or if you don't want to create a new
List
,Iterable.cast
:var list = <String?>['foo', 'bar', null, 'baz', null]; var withoutNulls = list.where((c) => c != null).cast<String>();
-
Without creating a new
List
void main() { List<String?> list = ['a', null, 'b', 'c', null]; list.removeWhere((e) => e == null); // <-- This is all you need. print(list); // [a, b, c] }
-
Creating a new
List
First create a method,
filter
for example:List<String> filter(List<String?> input) { input.removeWhere((e) => e == null); return List<String>.from(input); }
You can now use it:
void main() { List<String?> list = ['a', null, 'b', 'c', null]; List<String> filteredList = filter(list); // New list print(filteredList); // [a, b, c] }
To use retainWhere
, replace the predicate in removeWhere
with (e) => e != null