我想创建一个StatefulWidget,我将在整个应用程序中使用它来监听不同类型的流。因为我试图保持所有的小部件无状态,所以我想提取这个功能。
我创造了这个:
class StreamListener<T> extends StatefulWidget {
const StreamListener({
Key? key,
required this.stream,
required this.onNewData,
required this.child,
}) : super(key: key);
final Stream<T?> stream;
final void Function(T data) onNewData;
final Widget child;
@override
State<StreamListener> createState() => _StreamListenerState<T>();
}
class _StreamListenerState<T> extends State<StreamListener> {
late StreamSubscription<T?> streamSubscription;
@override
void initState() {
streamSubscription = (widget.stream as Stream<T?>).listen(
(T? data) {
if (data != null) {
widget.onNewData(data);
}
},
);
super.initState();
}
@override
Widget build(BuildContext context) {
return widget.child;
}
@override
void dispose() {
streamSubscription.cancel();
super.dispose();
}
}
然后在Widget树中的某个位置,我用途:
return StreamListener<int>(
stream: context.read<MyCubit>().toastStream,
onNewData: (int data) {
print("Received: $data");
},
child: SomeStatelessWidget(),
}
将流逻辑添加到Cubit,如下所示:
mixin ToastStreamForCubit<T> {
final StreamController<T> _toastStreamController = StreamController<T>();
get toastStream => _toastStreamController.stream;
void emitToastEvent(T event) {
_toastStreamController.add(event);
}
}
我打电话的时候就说emitToastEvent(1)
。
我在widget.onNewData(data);
线上收到了type '(int) => void' is not a subtype of type '(dynamic) => void'
。
我不确定这是怎么回事,我以为我已经把所有的函数和类Map到了一个特定的泛型类型(T),但是它仍然表示了一些关于dynamic
的信息。
1条答案
按热度按时间wwwo4jvm1#
扩展
State<StreamListener>
时缺少T
。它应该是