dart 用于在Flutter中收听流的通用小部件

x0fgdtte  于 2023-01-22  发布在  Flutter
关注(0)|答案(1)|浏览(113)

我想创建一个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的信息。

wwwo4jvm

wwwo4jvm1#

扩展State<StreamListener>时缺少T。它应该是

class _StreamListenerState<T> extends State<StreamListener<T>>

相关问题