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

Flutter Bloc中如何为两个不同事件绑定同一个回调处理函数

问题原因

报错是因为_onSubmitted方法的第一个参数限定为LoginSubmitted类型,和on<LoginFromSignup>要求的LoginFromSignup事件类型不匹配,两个事件都继承自LoginEvent父类,我们可以通过修改参数类型适配两类事件。

解决方案

方案1:使用父类类型+内部类型判断(最简便)

直接将_onSubmitted的event参数类型改为公共父类LoginEvent,在方法内部根据事件类型获取对应参数即可,修改后代码如下:

// async方法建议返回Future<void>避免隐式警告
Future<void> _onSubmitted(
  LoginEvent event,
  Emitter<LoginState> emit,
) async {
  String? username;
  String? password;
  // 区分事件类型获取账号密码
  if (event is LoginFromSignup) {
    username = event.username;
    password = event.password;
  } else if (event is LoginSubmitted) {
    // 原有LoginSubmitted的逻辑,比如从当前state中取已输入的账号密码
    username = state.username;
    password = state.password;
  }

  // 下方写公共的登录提交逻辑,直接使用上面拿到的username、password即可
  // ... 原有提交代码
}

修改后事件绑定的代码不需要改动,原有的两行绑定逻辑不会再报错:

on<LoginSubmitted>(_onSubmitted);
on<LoginFromSignup>(_onSubmitted);

方案2:公共接口抽象(类型更安全)

如果希望从类型层面限制_onSubmitted只能接收登录提交类的事件,可以给两个事件加公共抽象接口:

  1. 先定义公共接口
abstract class LoginSubmitEvent extends LoginEvent {}
  1. 让两个事件都继承这个接口
class LoginSubmitted extends LoginSubmitEvent {
  const LoginSubmitted();
}

class LoginFromSignup extends LoginSubmitEvent {
  const LoginFromSignup({
    this.username,
    this.password,
  });

  final String username;
  final String password;

  @override
  List<Object> get props => [username, password];
}
  1. 把_onSubmitted的event参数类型改为LoginSubmitEvent即可,内部的类型判断逻辑和方案1一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:15:05