考虑下面的类:
@immutable
class Foo<T, R> {
const Foo({
required this.bar,
});
final R Function(T data) bar;
Foo copyWith({
R Function(T data)? bar,
}) {
return Foo(
bar: bar ?? this.bar,
);
}
}
在上面的类中,该行bar: bar ?? this.bar
产生诊断消息:
参数类型“R Function(T)”无法分配给参数类型“dynamic Function(dynamic)”。
不可变泛型类中的泛型函数字段的方法应该如何copyWith
实现?
您的问题是您的
copyWith
实现被声明返回 aFoo
,但这是 的简写Foo<dynamic, dynamic>
。然后,类型推断自上而下流向返回的表达式,导致Foo(bar: bar ?? this.bar)
推断为构造 aFoo<dynamic, dynamic>
而不是构造 aFoo<T, R>
(否则会从自下而上的类型推断中发生)。因此,您应该修复返回类型:
请注意,您可以通过执行以下操作强制自下而上推理:
这也可以避免静态类型错误,但最终会隐式转换 a
Foo<T, R>
toFoo<dynamic, dynamic>
,这可能不是您想要的。我强烈建议
strict-raw-types
在您的文件中启用以捕获意外省略泛型类型参数时隐式使用的analysis_options.yaml
情况。dynamic