Dart Bloc开发:on<Event>添加async*后触发事件无响应问题
问题产生原因
flutter_bloc中on<Event>注册的事件处理函数的约定类型为FutureOr<void> Function(E event, Emitter<S> emit),本身不支持返回Stream类型的返回值。- 为回调添加
async*关键字后,函数的返回值会变为Stream类型,而Dart语言中async*生成的Stream只有被主动订阅监听时,函数内部的代码才会执行。bloc框架仅会将事件处理函数当做返回FutureOr<void>的函数执行,不会监听你返回的Stream,因此回调内的所有代码都不会运行,自然不会打印日志也不会处理事件逻辑。
解决方法
你可以根据自己的代码需求选择以下任意一种方案:
- 方案一:如果不需要复用返回Stream的旧逻辑,直接去掉
async*关键字即可,若有异步操作需求替换为async关键字,状态直接通过参数传入的emit方法发射。 - 方案二:如果要保留现有返回Stream的
_mapLoginButtonPressed方法,可将事件回调改为async类型,通过emit.forEach或者await for遍历Stream并发射状态,示例代码如下:
on<LoginEvent>((event, emit) async { print("Hello World!"); if (event is LoginButtonPressed) { // 写法1 使用emit.forEach await emit.forEach( _mapLoginButtonPressed(event), onData: (LoginState state) => state, ); // 写法2 使用await for遍历 // await for (final state in _mapLoginButtonPressed(event)) { // emit(state); // } } });
内容的提问来源于stack exchange,提问作者Dev Lulu
相关产品推荐
相关产品推荐

