2017-05-24 622 views
0

我已經在我的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

回答

2

的問題是, listen預計參數onData是一個函數,它將Dart Object作爲參數。你正在傳遞一個只需要OnRowDoubleClick作爲參數的函數,所以強模式會給出一個錯誤。

您可以更改您的listen方法,使其具有類型參數,請參閱Stream#listen的示例。

+0

我如何定義輸入類型爲T而不將整個類標記爲T類?我的想法是能夠在同一個總線實例中擁有多個不同類型的監聽器,只要我標記T類的類,那麼每個實例只能執行一個類型? Kotlin允許你執行'inline fun <通用T:Any> 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! –

相關問題