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 inserting null 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 an Iterable<T?> and get an Iterable<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 any null elements but just need to cast the elements to a non-nullable type, other options are to use List.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