更新評論
- 我發現這個包的行為與我正在嘗試的幾乎相同。試用
event_bus包
原始問題
我正在嘗試制作一個通過單一路徑向聽眾廣播一些價值的國家廣播公司。并想使用泛型來減少重復的邏輯。
以下是我正在嘗試的。
import 'dart:async';
class StateBroadcaster {
final _sinkMap = <Type, StreamController<dynamic>>{
StudyTimerStatus: StreamController<StudyTimerStatus?>.broadcast(),
};
void notify<T>(T value) => _sinkMap[T]?.add(value);
StreamSubscription<T> listen<T>(void Function(T) onData) {
return (_sinkMap[T] as StreamController<T>).stream.listen(onData);
}
}
但是當我運行這段代碼時,運行時錯誤出現了(_sinkMap[T] as StreamController<T>)。
構建 Builder 時拋出了以下 _CastError:type '_AsyncBroadcastStreamController<StudyTimerStatus?>' is not a subtype of type 'StreamController' in type cast
我怎樣才能解決這個問題?
如果可以達到我想要的目標(廣播資料),則可以更改代碼。
我也嘗試如下省略向上轉換,但出現編譯錯誤。
return _sinkMap[T].stream.listen(onData);
A value of type 'StreamSubscription' can't be returned from the method 'listen' because it has a return type of 'StreamSubscription'
The argument type 'void Function(T)' can't be assigned to the parameter type 'void Function(dynamic)?
uj5u.com熱心網友回復:
我認為這應該完成你的要求。
如果您訂閱listen<T>(),那么您應該獲得T傳遞給的相應型別值notify。
import 'dart:async';
class StateBroadcaster {
final _sinkMap = <Type, StreamController<dynamic>>{};
void notify<T>(T value) {
_sinkMap[T] ??= StreamController<T>.broadcast();
_sinkMap[T]?.add(value);
}
StreamSubscription<T> listen<T>(void Function(T) onData) {
_sinkMap[T] ??= StreamController<T>.broadcast();
return (_sinkMap[T] as StreamController<T>).stream.listen(onData);
}
}
void main() {
final broadcaster = StateBroadcaster();
broadcaster.listen<int>((v) => print('int: $v'));
broadcaster.listen<String>((v) => print('String: $v'));
broadcaster.notify(1);
broadcaster.notify('a');
broadcaster.notify(2);
broadcaster.notify('b');
broadcaster.notify(3);
broadcaster.notify('c');
}
如果您想在其中定義鍵值對_sinkMap而不是根據需要創建鍵/值對,這應該是可能的,但是如果您嘗試使用未在映射中預定義的鍵,則會出現運行時例外。
此外,您需要決定流值是否應該為空。如果您希望它們可以為空,那么您需要將 a 添加?到listen.
import 'dart:async';
class StateBroadcaster {
final _sinkMap = <Type, StreamController<dynamic>>{
StudyTimerStatus: StreamController<StudyTimerStatus?>.broadcast(),
};
void notify<T>(T value) => _sinkMap[T]?.add(value);
StreamSubscription<T?> listen<T>(void Function(T) onData) {
return (_sinkMap[T] as StreamController<T?>).stream.listen(onData);
}
}
如果您不希望它們可以為空,那么您需要?從型別中洗掉_sinkMap
import 'dart:async';
class StateBroadcaster {
final _sinkMap = <Type, StreamController<dynamic>>{
StudyTimerStatus: StreamController<StudyTimerStatus>.broadcast(),
};
void notify<T>(T value) => _sinkMap[T]?.add(value);
StreamSubscription<T> listen<T>(void Function(T) onData) {
return (_sinkMap[T] as StreamController<T>).stream.listen(onData);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/437835.html
上一篇:如何在typescript中獲取colcolatedkeyofT的型別作為泛型型別
下一篇:Java泛型作為建構式引數
