flutter Blocker不侦听来自Cubit的发射状态

xriantvc  于 2023-10-22  发布在  Flutter
关注(0)|答案(1)|浏览(117)

我正面临着一些问题,从完成的行动发射状态。我想做以下流程:
1.点击登录按钮;
1.通过登录过程;
1.登录成功后,导航到某个页面;
问题是Blocker的侦听器中的代码永远不会到达,即使状态有效(在LoginCubit中,我在发出LoginState.success()后进行了一些检查,如果state == LoginState.success()返回true;)
我还使用冻结库来生成状态。我的问题是--我的实现是否遗漏了什么?
这是我的腕尺:

class LoginCubit extends CubitBase<LoginState>{
  LoginCubit() : super(const LoginState.created());

  Future<void> runLoginFlow() async {
    final isAuthorized = await startAuth();

    if(isAuthorized){
      emit(const LoginState.success());
    }
    emit(const LoginState.failed(failedLogin));
  }

  Future<bool> startAuth() async {
    //doing some stuff
  }
}

状态(使用冻结生成):

@freezed
class LoginState with _$LoginState{
  const factory LoginState.created() = _Created;
  const factory LoginState.failed(String message) = _Failed;
  const factory LoginState.success() = _Success;
}

我的UI:

@RoutePage()
class LoginPage extends StatefulWidget {
  const LoginPage({super.key});

  @override
  State<LoginPage> createState() => _LoginPageState();
}

class _LoginPageState extends State<LoginPage> {
  @override
  Widget build(BuildContext context) {
    return BlocProvider<LoginCubit>(
      create: (context) => LoginCubit(),
      child: Scaffold(
        body: BlocListener<LoginCubit, LoginState>(
          listener: (context, state) {
            if(state == LoginState.success()){
              AutoRouter.of(context).navigate(NextPageRoute())
            }
          },
          bloc: LoginCubit(),
          child: _buildContent(context),
      ),
    ),
    );  
  }
}

提前感谢所有有用的建议!

brccelvz

brccelvz1#

仅当您希望提供一个无法通过BlocProvider和当前BuildContext访问的块时才指定该块。删除块侦听器中的bloc: LoginCubit()字段,因为您在上面提供了它。

return BlocProvider<LoginCubit>(
      create: (context) => LoginCubit(),
      child: Scaffold(
        body: BlocListener<LoginCubit, LoginState>(
          listener: (context, state) {
            if(state == LoginState.success()){
              AutoRouter.of(context).navigate(NextPageRoute())
            }
          },
          bloc: LoginCubit(),// Remove this
          child: _buildContent(context),
      ),
    ),
    );

相关问题