2017-05-24 13 views
0

今日私のDartコードベースで厳密モードを有効にしています。ほとんどの警告とエラーを修正しました。 私が解決するかどうかはわかりませんこの1 ...引数型 '(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), {...`, 

(これはエラーが消える

_bus.listen(OnRowDoubleClick, (event){ 

が、今私はキャストする必要があります:私は実際には何を返すようにしたくないので)理にかなって、エラーがこれにメソッド呼び出しを変更

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

に変更しますevent as OnRowDoubleClick全体の時間。

ドンの良い方法がありますか?

*ソリューション*

ソリューションは、Tでリスナーをマークすることです:

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

今問題があることであるあなたが_bus.listen<OnRowDoubleClick>(OnRowDoubleClick, (event){を呼び出すことができ、イベントがタイプOnRowDoubleClick

答えて

2

のものであろうlistenは、引数onDataがダートObjectを引数に取る関数であると想定しています。 OnRowDoubleClickだけを引数とする関数を渡しているため、強いモードでエラーが発生します。

listenメソッドをタイプパラメータにするように変更することができます。例としてStream#listenを見てください。

+0

タイプTのようにクラス全体をマーキングすることなく、入力タイプがTであると定義するにはどうすればよいですか?考え方は、タイプTのクラスをマークするとすぐに、同じバスインスタンス上に異なるタイプの複数のリスナーを持つことができるようにすることです。その後、インスタンスごとに1つのタイプしか実行できません。あなたは 'fromJson ()'を呼び出すことができますが、Dartではどのようにしたらいいでしょうか? 'StreamSubscriptionを聞く(無効onDataハンドラ(Tイベント)、{機能のonError、無効onDone()、BOOL cancelOnError})' を参照してくださいにhttp: –

+1

あなたは、あなたの 'listen'関数にたとえば型注釈を追加することができます。 //news.dartlang.org/2016/12/dart-121-generic-method-syntax.html詳細については –

+0

これはとても涼しいです!私はダーツがそのような特徴を持っていなければならないことを知っていた:-D ありがとうハリー! –