Flutter Bloc登录状态异常:SignInController无法获取邮箱密码
问题原因及修复方案
你的代码存在两个核心问题,导致登录时获取不到Bloc中的邮箱和密码:
1. SignInState未正确实现Equatable的props方法
Equatable依赖props列表判断状态是否变化,当前代码直接抛出未实现错误,导致Bloc无法正确识别状态更新,引发状态不同步问题。
修复代码:
class SignInState extends Equatable { const SignInState({this.email = '', this.password = ''}); final String email; final String password; SignInState copyWith({String? email, String? password}) { return SignInState( email: email ?? this.email, password: password ?? this.password, ); } @override List<Object?> get props => [email, password]; // 返回状态属性列表,用于Equatable比较 }
2. LoginPage每次构建都会创建新的SignInBloc实例
你在BlocBuilder的bloc参数中直接实例化SignInBloc(),导致Widget每次重建都会生成全新的Bloc实例。而context.read<SignInBloc>()获取的是另一个独立实例,最终登录时拿到的是新Bloc的初始空状态。
修复代码:
使用BlocProvider在父级提供单一Bloc实例,确保整个页面共享同一状态:
class LoginPage extends StatelessWidget { const LoginPage({super.key}); @override Widget build(BuildContext context) { return BlocProvider( create: (context) => SignInBloc(), // 在父级提供共享的Bloc实例 child: BlocBuilder<SignInBloc, SignInState>( // 移除bloc参数,自动从context获取共享实例 builder: (context, state) { return Scaffold( backgroundColor: Colors.white, appBar: AppBar(), body: Padding( padding: const EdgeInsets.symmetric(horizontal: 30), child: SingleChildScrollView( // 原有页面内容保持不变 child: Column( // ... ), ), ), ); }, ), ); } }
修复说明
- 修复
props后,Equatable能正确对比状态变化,Bloc会在状态更新时触发UI重建,保证状态与UI同步。 - 通过
BlocProvider提供单一Bloc实例后,页面内所有操作(输入框变更、登录按钮点击)都会作用于同一个Bloc,登录时就能获取到更新后的邮箱和密码。
内容的提问来源于stack exchange,提问作者user25043118
相关产品推荐
相关产品推荐

