dart 在启用了空值安全的Iterable.firstWhere中,如何从orElse返回空值?

luaexgnf  于 2022-12-20  发布在  其他
关注(0)|答案(6)|浏览(271)

在null-safe dart之前,以下是有效语法:

final list = [1, 2, 3];
final x = list.firstWhere((element) => element > 3, orElse: () => null);

if (x == null) {
  // do stuff...
}

现在,firstWhere要求orElse返回int,而不是int?,因此我不能返回null。
如何从orElse返回null?

mzillmmw

mzillmmw1#

一个方便的函数firstWhereOrNull解决了这个问题。
导入包含Iterable上的扩展方法的package:collection

import 'package:collection/collection.dart';

final list = [1, 2, 3];
final x = list.firstWhereOrNull((element) => element > 3);

if (x == null) {
  // do stuff...
}
but5z9lq

but5z9lq2#

您不需要外部包,而是可以使用try/catch

int? x;
try {
  x = list.firstWhere((element) => element > 3);
} catch(e) {
  x = null;
}
j0pj023g

j0pj023g3#

有点晚了但我想到了这个

typedef FirstWhereClosure = bool Function(dynamic);

extension FirstWhere on List {
  dynamic frstWhere(FirstWhereClosure closure) {
    int index = this.indexWhere(closure);

    if (index != -1) {
      return this[index];
    }
    return null;
  }
}

使用示例:

class Test{
  String name;
  int code;
  
  Test(code, this.name);
}

Test? test = list.frstWhere(t)=> t.code==123);
mzsu5hc0

mzsu5hc04#

另一种方法是为列表设置一个 nullable 类型。
不只是[1, 2, 3],而是写<int?>[1, 2, 3],允许它为 nullable

void main() {
  final list = <int?>[1, 2, 3];
  final x = list.firstWhere(
      (element) => element != null ? (element > 3) : false,
      orElse: () => null);

  print(x);
}
sq1bmfud

sq1bmfud5#

这应该行得通,而且是一个更好的解决方案:

extension IterableExtensions<T> on Iterable<T> {
  T? firstWhereOrNull(bool Function(T element) comparator) {
    try {
      return firstWhere(comparator);
    } on StateError catch (_) {
      return null;
    }
  }
}
qf9go6mv

qf9go6mv6#

要添加到@Alex Hartfords的答案,对于任何不想仅为此功能导入完整包的人,这是collection包中的firstWhereOrNull的实际实现,您可以将其添加到您的应用程序中。

extension FirstWhereExt<T> on List<T> {
  /// The first element satisfying [test], or `null` if there are none.
  T? firstWhereOrNull(bool Function(T element) test) {
    for (final element in this) {
      if (test(element)) return element;
    }
    return null;
  }
}

相关问题