flutter 避免Dart中重复的空类型检查

0yg35tkg  于 2023-01-14  发布在  Flutter
关注(0)|答案(1)|浏览(179)

我当前的目标是删除此代码重复:

final int? myNullableInt = 10;

/// Everywhere I need to do this null verification:
if (myNullableInt == null) return null;

return someOtherMethodThatReceivesANonNullableInt(myNullableInt);

我想转换成像我们在Kotlin中使用的东西:

final int? myNullableInt = 10;

return myNullableInt?.apply((myInt) => someOtherMethodThatReceivesANonNullableInt(myInt));

我做到了:

extension ApplyIfNotNull on Object? {
  T? apply<T extends Object?>(Object? obj, T? Function(Object) fn) {
    if (obj == null) return null;
    return fn(obj);
  }
}

但这给了我一个静态错误:

The argument type 'Object' can't be assigned to the parameter type 'int'.

注意:这应该适用于所有类型,例如int s、String s、doubleMyOwnClassType s。
我能做些什么吗?还是我错过了什么?

xsuvu9jc

xsuvu9jc1#

extension ApplyIfNotNull on Object? {
  T? apply<T extends Object?>(Object? obj, T? Function(Object) fn) {
    if (obj == null) return null;
    return fn(obj);
  }
}

这是不起作用的,因为它声明回调函数能够接受任何Object参数,但您可能试图将其用于只接受int参数的函数,也不清楚为什么要创建扩展方法,因为它根本不涉及接收方(this)。
您还需要在回调的参数类型上使函数泛型化:

R? applyIfNotNull<R, T>(T? obj, R Function(T) f) =>
    (obj == null) ? null : f(obj);

(That与我在www.example.com中提出的建议相同https://github.com/dart-lang/language/issues/360#issuecomment-502423488,但论点相反。)
或者,作为一个扩展方法,这样它就可以在this上工作,而不需要额外的obj参数:

extension ApplyIfNotNull<T> on T? {
  R? apply<R>(R Function(T) f) {
    // Local variable to allow automatic type promotion.  Also see:
    // <https://github.com/dart-lang/language/issues/1397>
    var self = this;
    return (self == null) ? null : f(self);
  }
}

另请参阅https://github.com/dart-lang/language/issues/360以了解现有的语言特性请求以及其他一些建议的解决方法。

相关问题