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
相关产品推荐
相关产品推荐

