【发布时间】:2019-09-30 01:03:46
【问题描述】:
让我介绍一下为什么会出现这个问题。 (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 更改为动态,并且问题似乎发生在 dart 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>();
}
一种方法在下面起作用
#1 Component<CoolType>(
geneticFunc: (CoolType cool, String keyword){
return false;
},
);
#2
Component<CoolType>(
geneticFunc: (dynamic cool, String keyword){
return false;
},
);
答案 #2 有效,这意味着我甚至不需要通用,只需 动态。如果你使用#1,有时运行时甚至没有错误,你可能会卡在那里一整天。
有一个官方讨论here,说T在运行时总是dynamic,所以#2是唯一的选择.
最后,我不知道什么时候使用generic,现在似乎总是使用dynamic,因为上面的结果。
【问题讨论】:
-
您能否提供导致此错误的调用:
type '(String, String) => bool' is not a subtype of type '(dynamic, String) => bool'?我看到了修复,但是要看到对_filter的调用,我必须在这里重新创建错误:github.com/ianldgs/material_search/issues/11 -
@GazihanAlankus,我认为我最新的示例代码是相同的想法,因为我在那里简化了我的
filter函数:P -
@GazihanAlankus,在
_componentState中,覆盖一个简单的initState,并调用print("the test one"); var a = widget.geneticFunc; print("the test two");。您可以在测试二和测试一之间找到错误。 -
#1 和 #2 在 DartPad 中似乎都对我有用(在去除颤动的东西之后)。 dartpad.dartlang.org/8e054e39063362a360f1b376ab4d6f95 如果您可以创建错误代码,我很乐意提供帮助。使用泛型的原因是具有类型安全性。你可以做任何动态的事情,但你并不比 JavaScript 更好。
-
你应该在这里看到
MaterialSearchResult的类型参数是什么:github.com/ianldgs/material_search/blob/… 你可以在那里设置一个断点来做到这一点。MaterialSearchResult<T>得到的 T 可能与MaterialSearch<T>的 T 不兼容。