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只能接收登录提交类的事件,可以给两个事件加公共抽象接口:
- 先定义公共接口
abstract class LoginSubmitEvent extends LoginEvent {}
- 让两个事件都继承这个接口
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]; }
- 把
_onSubmitted的event参数类型改为LoginSubmitEvent即可,内部的类型判断逻辑和方案1一致。
内容的提问来源于stack exchange,提问作者nyphur
相关产品推荐
相关产品推荐

