Flutter Bloc版本迁移报错:Stream无法赋值给NewsState参数
Flutter Bloc 新版本迁移报错解决:Stream无法分配给NewsState
问题根源
旧版mapEventToState可以通过yield*直接转发Stream<NewsState>类型的状态流,但新版Bloc的emit方法仅接受单个NewsState实例,直接传入Stream就会触发类型不匹配报错。
解决方法
需要手动遍历Repository返回的Stream,逐个发送每个状态:
方案1:分事件处理(推荐,可读性更高)
class NewsBloc extends Bloc<NewsEvent, NewsState> { final NewsRepository _repository = NewsRepository(); NewsBloc() : super(NewsInitialState()) { on<FetchTopAndOtherNewsEvent>((event, emit) async { // 遍历Stream中的每个状态,逐个调用emit发送 await for (final state in _repository.fetchTopAndOtherNews(event)) { emit(state); } }); on<FetchNewsEvent>((event, emit) async { await for (final state in _repository.fetchNews(event)) { emit(state); } }); } }
方案2:单个on处理多事件
如果坚持在同一个回调中处理所有事件,可修改为:
class NewsBloc extends Bloc<NewsEvent, NewsState> { final NewsRepository _repository = NewsRepository(); NewsBloc() : super(NewsInitialState()) { on((event, emit) async { if (event is FetchTopAndOtherNewsEvent) { await for (final state in _repository.fetchTopAndOtherNews(event)) { emit(state); } } else if (event is FetchNewsEvent) { await for (final state in _repository.fetchNews(event)) { emit(state); } } }); } }
补充说明
新版Bloc的事件处理逻辑更偏向异步单状态发送,不再直接支持Stream转发,因此需要通过await for循环拆解Stream,将每个状态单独发送。
内容的提问来源于stack exchange,提问作者Flutter kyoto
相关产品推荐
相关产品推荐

