参数类型'(On ....) - > Null'不能分配给参数类型`(Object) - > void`

问题描述:

我已经在我的Dart代码库中启用了strict模式,并且已经修复了大部分警告和错误。 这一次我不知道如何解决......参数类型'(On ....) - > Null'不能分配给参数类型`(Object) - > void`

这是我的方法签名:

StreamSubscription listen(Type eventType, void onData(Object event), { Function onError, void onDone(), bool cancelOnError}) { 

    ... code here ... 

} 

做当:_bus.listen(OnRowDoubleClick, (OnRowDoubleClick event){ 我越来越

The argument type '(OnRowDoubleClick) -> Null' can't be assigned to the parameter type `(Object) -> void` 

我可以改变方法签名为

StreamSubscription listen(Type eventType, Null onData(Object event), {...`, 

(它没有有意义,因为我真的不希望返回任何东西),误差变为

The argument type '(OnRowDoubleClick) -> Null' can't be assigned to the parameter type `(Object) -> Null` 

方法调用更改为这样:

_bus.listen(OnRowDoubleClick, (event){ 

错误消失,但现在我要投整个时间都是event as OnRowDoubleClick

有没有更好的方法来解决这个问题?

*解*

解决方案是标记有T听众:

StreamSubscription listen<T>(Type eventType, Null onData(T event), { 

现在,您可以拨打_bus.listen<OnRowDoubleClick>(OnRowDoubleClick, (event){和事件将是类型OnRowDoubleClick

的问题是, listen预计参数onData是一个函数,它将Dart Object作为参数。你正在传递一个只需要OnRowDoubleClick作为参数的函数,所以强模式会给出一个错误。

您可以更改您的listen方法,使其具有类型参数,请参阅Stream#listen的示例。

+0

我如何定义输入类型为T而不将整个类标记为T类?我的想法是能够在同一个总线实例中拥有多个不同类型的监听器,只要我标记T类的类,那么每个实例只能执行一个类型? Kotlin允许你执行'inline fun String.fromJson():T {}'在这种情况下,我可以调用'fromJson ()',我将如何在Dart中执行此操作? –

+1

您可以添加类型注释到你的'listen'功能,例如: 'StreamSubscription听(无效昂达(T事件){功能onError的,无效onDone(),布尔cancelOnError})' 请参阅http: //news.dartlang.org/2016/12/dart-121-generic-method-syntax.html更多详情 –

+0

这非常酷!我知道Dart必须拥有这样一个功能:-D 感谢Harry! –