0

Flutterアプリをnull 安全に移行していますが、オプションを同じタイプの非オプションに簡単に取り除くために、欠落しているヘルパーがたくさんあります。

あなたを文脈に入れるために、私はしたいと思います

List<String?> optionalList = ['hi', 'hola', null];

Swiftと同様にcompactMap()、任意のマップを null アイテムを除外し、オプションではないアイテムのリストのみを返すマップに変換できる関数が必要です。例:

final List<String> newNonOptionalList = optionalList.compactMap((item) => item.toUpperCase());
// newNonOptionalList = ['HI', 'HOLA']

Dartにとって価値のある他の多くのケースを含め、この種のケースのヘルパーを作成しようとしています。

なぜそれが機能しないのか、これは私がこれまでに試したことのほんの一部です:

extension ListNullSafetyExtension<T> on List<T?>? {

Iterable<R> compactMap<R>(R Function(T element) convert) sync* {
  for (var element in this.removeNulls()) {
    if (element != null) yield convert(element);
  }
}

  List<T> removeNulls() {
    if (this == null) return [];
    this!.removeWhere((value) => (value == null));
    return List.from(this!).whereType<T>().toList();
  }
}


これにより null が削除され、マップが実行されますが、常に同じオプションの型がリストに返されます。つまり、ラップを解除せず、代わりに aをremoveNulls()返しますList<dynamic>List<the_type_I_used>

このトピックの非常に基本的なジェネリックの投稿しか見つからないため、これら 2 つの関数の型が変更されない理由を理解していただければ幸いです。

4

2 に答える 2

0

これを変える:

final List<String> newNonOptionalList = optionalList.compactMap((item) => item.toUpperCase());

これに

final List<String> newNonOptionalList = optionalList.compactMap((item) => item.toUpperCase()).toList();
于 2021-10-06T00:31:04.817 に答える