【发布时间】:2020-10-24 17:30:19
【问题描述】:
我已经定义了以下肘。
@injectable
class AuthCubit extends Cubit<AuthState> {
final IAuthService _authService;
AuthCubit(this._authService) : super(const AuthState.initial());
void authCheck() {
emit(_authService.signedInUser.fold(
() => AuthState.unauthenticated(none()),
(user) => AuthState.authenticated(user),
));
}
}
但是,即使在调用 emit 之后,监听这个 bloc 的 BlocListener 也没有被调用。但是当我在发出调用之前添加零延迟时,一切都按预期工作。
Future<void> authCheck() async {
await Future.delayed(Duration.zero);
emit(_authService.signedInUser.fold(
() => AuthState.unauthenticated(none()),
(user) => AuthState.authenticated(user),
));
}
我尝试了这种延迟,因为对于其他导致一些后端调用(有一些延迟)的事件,emit 工作得很好。但我很确定这不是它应该如何工作的。我在这里遗漏了什么吗?
编辑: 添加使用 BlocListener 的 SplashPage 小部件代码。
class SplashPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocListener<AuthCubit, AuthState>(
listener: (context, state) {
print(state);
},
child: Scaffold(
body: Center(
child: CircularProgressIndicator(),
),
),
);
}
}
authCheck() 被调用的地方,
class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiBlocProvider(
providers: [
BlocProvider<AuthCubit>(
create: (_) => getIt<AuthCubit>()..authCheck(),
),
],
child: MaterialApp(
....
),
);
}
}
AuthState 是 freezed union
@freezed
abstract class AuthState with _$AuthState {
const factory AuthState.initial() = _Initial;
const factory AuthState.authenticated(User user) = _Authenticated;
const factory AuthState.unauthenticated(Option<AuthFailure> failure) = _Unauthenticated;
const factory AuthState.authInProgress() = _AuthInProgress;
}
另外,当我实现一个具有相同功能的块(而不是 Cubit)时,一切都按预期工作。
【问题讨论】:
-
能否添加调用 authCheck 和创建 bloc 的代码
-
@PietervanLoon 添加了使用 BlocListener 的小部件代码。
-
这不是我问的 XD。但我现在意识到,这些状态可能被视为同一个状态,所以你能分享
AuthState代码 -
哦,我误读了您之前的评论。编辑了更多信息。此外,正如最后所写,当我将此 Cubit 转换为具有完全相同功能的 Bloc 时,一切正常。
标签: flutter bloc flutter-bloc