flutter - 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。我做错了什么?
解决方案
推荐阅读
- nginx - 音频和视频不同步流式 USB 网络摄像头到 RTMP 服务器
- .net - 如何在 .Net MVC 上查看刷新时的反应变化?
- npm - 如何在 Visual Studio Code 上安装 discord.js?
- c# - 找不到 System.Windows.Forms 程序集参考
- javascript - 如何将JS字节码行号映射到源代码行号
- r - 如何在 R Dataframe 中按降序排列月份
- c++ - 构建包 libmariadb:x64-windows 失败:BUILD_FAILED
- javascript - 自定义 if 指令未显示预期结果
- angular - Angular 本地存储传递多个值
- python - 如何同时使用 Med7 和 Negspacy?