Bloc侦听器不会立即被调用

时间:2020-10-24 17:30:19

标签: flutter bloc flutter-bloc

我定义了以下手肘。

@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)时,一切都按预期工作。

1 个答案:

答案 0 :(得分:0)

在没有延迟的情况下,直接从提供者的create方法中调用emit。这意味着该侦听器尚未(完全)构建,因此在发出状态时没有要调用的侦听器。

因此,通过添加延迟,您可以允许侦听器首先订阅流,从而在发出新状态时调用流。