You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter:如何使用Cubit监听流并emit状态?

使用Cubit监听流并发射状态

Cubit本身没有Bloc里的emit.forEach方法,但可以通过手动监听流并管理订阅的方式实现相同逻辑。下面是对应你提供的Bloc代码的Cubit实现:

实现核心思路

  • 在Cubit中定义触发流监听的方法
  • 通过Stream.listen监听目标流,收到数据时调用emit发射新状态
  • 必须管理流订阅,在状态切换或Cubit销毁时取消订阅,避免内存泄漏

代码示例

class VideoStreamCubit extends Cubit<VideoStreamState> {
  final VideoStreamingRepo videoStreamingRepo;
  StreamSubscription? _videoStreamSubscription;

  VideoStreamCubit(this.videoStreamingRepo) : super(VideoStreamState(isPlaying: false));

  void togglePlay(bool play) {
    if (play) {
      // 先取消已有订阅,避免重复监听
      _videoStreamSubscription?.cancel();
      _videoStreamSubscription = videoStreamingRepo.videoDataStream.listen(
        (VideoData videoStreamData) {
          emit(
            VideoStreamState(
              currentFrame: videoStreamData,
              isPlaying: true,
            ),
          );
        },
        // 可选:处理流错误
        onError: (error) {
          // 可在此发射错误状态或处理异常
        },
        // 可选:处理流结束
        onDone: () {
          emit(state.copyWith(isPlaying: false));
        },
      );
    } else {
      _videoStreamSubscription?.cancel();
      emit(state.copyWith(isPlaying: false));
    }
  }

  @override
  Future<void> close() {
    // Cubit销毁时确保取消所有订阅
    _videoStreamSubscription?.cancel();
    return super.close();
  }
}

补充说明

  • 建议给VideoStreamState实现copyWith方法,方便在切换播放状态时复用已有状态数据
  • 如果流是持续推送数据的长连接,务必在不需要监听时及时取消订阅,避免资源浪费

内容的提问来源于stack exchange,提问作者Soliev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 05:10:19