我定义了以下手肘。
@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),
));
}
我尝试了此延迟,因为对于进行了一些后端调用(具有一定延迟)的其他事件,完美地发挥了作用。但是我很确定这不是应该的工作方式。我在这里想念东西吗?
编辑: 添加使用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
联合体
@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)时,一切都按预期工作。
答案 0 :(得分:0)
在没有延迟的情况下,直接从提供者的create方法中调用emit。这意味着该侦听器尚未(完全)构建,因此在发出状态时没有要调用的侦听器。
因此,通过添加延迟,您可以允许侦听器首先订阅流,从而在发出新状态时调用流。