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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 22:08:21