首页 > 解决方案 > Flutter 初始状态 Cubit

问题描述

启动应用程序时,首先工作 AuthCubit

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiBlocProvider(
      providers: [
        BlocProvider<AuthCubit>(
            create: (context) => getIt<AuthCubit>()..startApp()),
        BlocProvider<CheckRoleCubit>(
            create: (context) => getIt<CheckRoleCubit>()),
      ],
      child: MaterialApp(
        home: InitialScreen(),
      ),
    );
  }
}

它使用简单的功能:

void startApp() async {
    emit(AuthState.splashScreen());
    await Future.delayed(Duration(seconds: 2));
    checkAuthRequest();
  }

  Future<void> checkAuthRequest() async {
    final userOption = await firebaseAuthRepository.getUser();
    emit(
      userOption.fold(
        () => AuthState.unauthenticated(),
        (_) => AuthState.authenticated(),
      ),
    );
  } 

在 InitialScreen 我使用 BlocConsumer:

 return BlocConsumer<AuthCubit, AuthState>(
      listener: (context, state) {
        state.maybeMap(
          orElse: () {},
          authenticated: (_) {
            context.read<CheckRoleCubit>().checkRole();
          },
        );
      },
      builder: (context, state) {
        return state.maybeMap(
          authenticated: (_) => CheckRole(),
          unauthenticated: (_) => HomeScreen(),
          orElse: () => Container(),
        );
      },
    );

在 CheckRoleScreen 中:

 return BlocBuilder<CheckRoleCubit, CheckRoleState>(
      builder: (context, state) {
        return state.map(
          initial: (_) => Container(color: Colors.amberAccent),
          admin: (_) => Admin(),
          user: (_) => HomeScreen(),
          loadFailure: (_) => Container(),
        );
      },
    );

在 CheckRoleCubit 中,我正在创建一个简单的函数,它从 Firestore 获取 userData。

StreamSubscription userDataStreamSubscription;
  Future<void> checkRole() async {
    userDataStreamSubscription = userDataRepository.fetchUserData().listen(
      (failureOrFetch) {
        emit(
          failureOrFetch.fold(
            (failure) => CheckRoleState.loadFailure(failure),
            (userData) {
              if (userData.role == 'admin') {
                return CheckRoleState.admin();
              } else {
                return CheckRoleState.user();
              }
            },
          ),
        );
      },
    );
  } 

问题是当我打开应用程序或使用重启时,在 splashScreen 之后,发出 CheckRoleCubit 的初始状态并显示容器一秒钟,然后显示 homeScreen 或 adminScreen。我做错了什么?

标签: flutterflutter-bloc

解决方案


推荐阅读