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

Dart Bloc开发:on<Event>添加async*后触发事件无响应问题

问题产生原因
  1. flutter_bloc中on<Event>注册的事件处理函数的约定类型为FutureOr<void> Function(E event, Emitter<S> emit),本身不支持返回Stream类型的返回值。
  2. 为回调添加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:06:03