让我介绍为什么出现此问题的错误。 (Detail here)
type '(String, String) => bool' is not a subtype of type '(dynamic, String) => bool'
这是来自material_search的错误,而solution是:
- _filter(T v, String c) {
+ _filter(dynamic v, String c) {
- onSelect: (T value) => Navigator.of(context).pop(value),
+ OnSelect: (dynamic value) => Navigator.of(context).pop(value),
将所有T
类型的泛型更改为动态,并且问题似乎在出现飞镖2时发生。
所以,我在这里遇到了这些问题,
编辑: 让我提供一个简单的例子来使问题更清楚:
typedef bool GeneticFunction<T>(T geneticData, String key);
class Component<T> extends StatefulWidget {
Component({this.geneticFunc});
final GeneticFunction<T> geneticFunc;
@override
_componentState<T> createState() => _componentState<T>();
}
Component<CoolType>(
geneticFunc: (CoolType cool, String keyword){
return false;
},
);
#2
Component<CoolType>(
geneticFunc: (dynamic cool, String keyword){
return false;
},
);
答案#2 是有效的,这意味着我甚至不需要通用,只需动态即可。如果您使用#1 ,有时甚至在运行时也不会出错,并且可能一整天都呆在那里。
有一个正式讨论here,它说 T 在运行时总是动态的,因此#2 是只能选择。
最后,由于上述结果,我不知道何时使用泛型,并且现在看来总是使用动态。
答案 0 :(得分:2)
很抱歉,我的问题长时间拖延,此问题的真正问题是在StatefulWidget中使用泛型的正确方法是什么?
让我们看看原始代码:
class Component<T> extends StatefulWidget {
Component({this.data, this.geneticFunc});
final T data;
final GeneticFunction<T> geneticFunc;
void test()
{
var testFunc = geneticFunc;
testFunc(data, "123");
}
@override
_ComponentState<T> createState() {
return _ComponentState<T>();
}
}
class _ComponentState<T> extends State<Component>
{
@override
void initState() {
print("test one");
var a = widget.geneticFunc;
print("test two");
super.initState();
}
@override
Widget build(BuildContext context) {
return Container(width: 20, height: 20,);
}
}
猜猜是什么?只需记住在扩展泛型类时添加一个<T>
,就会引起问题。
class _ComponentState<T> extends State<Component<T>>
因此问题type '(String, String) => bool' is not a subtype of type '(dynamic, String) => bool'
再也不会困扰我。
以下代码现在应该可以工作。
Component<CoolType>(
geneticFunc: (CoolType a, String key){
return false;
},
)