如何在空安全Dart中将List<String?>转换为List<String>?

我有一个飞镖列表:

List<String?> vals;

我想删除任何空值并将其转换为List<String>. 我试过了:

List<String> removeNulls(List<String?> list) {
  return list.where((c) => c != null).toList() as List<String>;
}

在运行时,我收到以下错误:

List<String?>' is not a subtype of type 'List<String>?'

解决这个问题的正确方法是什么?

回答

  • 理想情况下,您首先从 a 开始List<String>。如果您正在构建您的列表,例如:

    String? s = maybeNullString();
    var list = <String?>[
      'foo',
      'bar',
      someCondition ? 'baz' : null,
      s,
    ];
    

    那么你可以使用 collection-if来避免插入null元素:

    String? s = maybeNullString();
    var list = <String?>[
      'foo',
      'bar',
      if (someCondition) 'baz',
      if (s != null) s,
    ];
    
  • null从 an 中过滤掉值Iterable<T?> 获得Iterable<T>结果的一种简单方法是使用.whereType<T>(). 例如:

    var list = <String?>['foo', 'bar', null, 'baz', null];
    var withoutNulls = list.whereType<String>().toList();
    
  • 另一种方法是使用 collection-for和 collection- if

    var list = <String?>['foo', 'bar', null, 'baz', null];
    var withoutNulls = <String>[
      for (var s in list)
        if (s != null) s
    ];
    
  • 最后,如果您需要转换 a 的元素,List则可以使用其他选项List.from

    var list = <String?>['foo', 'bar', null, 'baz', null];
    var withoutNulls = List<String>.from(list.where((c) => c != null));
    

    或者如果您不想创建新的List, Iterable.cast:

    var list = <String?>['foo', 'bar', null, 'baz', null];
    var withoutNulls = list.where((c) => c != null).cast<String>();
    

以上是如何在空安全Dart中将List&lt;String?&gt;转换为List&lt;String&gt;?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>