1

我最近用flutter_linter替换了不推荐使用的pedantic包,现在我有数百个这样的警告:

Avoid using `forEach` with a function literal.

它与avoid_function_literals_in_foreach_calls有关

如果您有不可为空的列表,这听起来不错,但如果代码如下所示:

GetIt<SomeService>().someBehaviorSubject.value?.data?.list?.forEach((f) {
  //
});

如何改变它?所以重构后不应该是丑陋的。

4

1 回答 1

4

有趣的问题。我真的没有一个很好的答案,但这是我现在能想到的最好的答案。

第一个解决方案是这可能不是最有效的方法,因为我们正在正确地创建一个新的列表对象:

void main() {
  final Map<String, Iterable<int>> map = {};

  for (final value in [...?map['test']]) {
    // Do something with value
  }
}

更有效但也更长的是:

void main() {
  final Map<String, Iterable<int>> map = {};

  for (final value in map['test'] ?? const <int>[]) {
    // Do something with value
  }
}

最好的解决方案可能是像这样添加扩展方法Iterable<T>?

void main() {
  final Map<String, Iterable<int>> map = {};

  for (final value in map['test'].emptyIfNull) {
    // Do something with value
  }
}

extension EmptyIfNullIterableExtension<T> on Iterable<T>? {
  Iterable<T> get emptyIfNull => this ?? Iterable<T>.empty();
}

这是允许的,因为扩展方法是静态解析的,并且通过在可空类型上添加方法,我们实际上甚至可以在null.

但这也意味着如果最终结果是dynamic因为我们不能对类型为dynamic. 原因是扩展方法实际上不是我们扩展的类的一部分,而是编译器自动插入调用的静态方法。这里的修复是添加一个类型转换。

于 2021-07-06T13:57:31.137 回答