MultiBlocProvider 中添加的某些事件不会被调度 Flutter

Vin*_*nzo 1 flutter bloc

SyncBloc我在一个MultiBlocProvider(包)中添加了一个新的块flutter_bloc,它创建了所需的所有块,MapScreen并且对于某些块,它还添加了在屏幕本身中呈现数据所需的事件。问题是,虽然位置事件 (for LocationBloc) 是从 MultiBlocProvider 本身正确添加的,但同步事件 (for SyncBloc) 却不是。如果我改为从 的MapScreenMultiBlocListener添加它们

BlocProvider.of<SyncBloc>(context).add(SyncLanguages());
Run Code Online (Sandbox Code Playgroud)

它们按预期工作,因此看起来SyncBloc已正确提供。您能发现我在新版本中做错了什么SyncBloc或为我指出正确的方向吗?一如既往,非常感谢您的时间和帮助。

这是 MultiBlocProvider 中的main()

@override
  Widget build(BuildContext context) {
    return MaterialApp(
      localizationsDelegates: [
        const AppLocalizationsDelegate(),
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      supportedLocales: [
        const Locale('en', ''),
        const Locale('it', ''),
        const Locale('es', ''),
      ],
      localeResolutionCallback:
          (Locale locale, Iterable<Locale> supportedLocales) {
        for (Locale supportedLocale in supportedLocales) {
          if (supportedLocale.languageCode == locale.languageCode ||
              supportedLocale.countryCode == locale.countryCode) {
            return supportedLocale;
          }
        }
        return supportedLocales.first;
      },
      debugShowCheckedModeBanner: false,
      home: BlocBuilder<AuthenticationBloc, AuthenticationState>(
        builder: (context, state) {
          if (state is Unauthenticated) {
            return LoginScreen(userRepository: _userRepository);
          }
          if (state is Authenticated) {
            return MultiBlocProvider(
              providers: [
                BlocProvider<TrackingBloc>(
                  create: (context) => TrackingBloc(),
                ),
                BlocProvider<DirectionsBloc>(
                  create: (context) => DirectionsBloc(),
                ),
                BlocProvider<GeoBloc>(
                  create: (context) => GeoBloc(),
                ),
                BlocProvider<RouteBloc>(
                  create: (context) => RouteBloc(),
                ),
                BlocProvider<SchedulerBloc>(
                  create: (context) => SchedulerBloc(),
                ),
                BlocProvider<CheckerBloc>(
                  create: (context) => CheckerBloc(),
                ),
                BlocProvider<LocationBloc>(
                    create: (context) => LocationBloc(
                          mapRepository: _mapRepository,
                        )
                          ..add(GetLocationStream())
                          ..add(GetLocation())
                          ..add(GetIsoLocationUser())),
                BlocProvider<SyncBloc>(
                    create: (context) =>
                        SyncBloc()..add(SyncLanguages())..add(SyncIcons())),
                BlocProvider<AlertBloc>(create: (context) {
                  return AlertBloc(
                    alertRepository: _alertRepository,
                  );
                }),
              ],
              child: MapScreen(
//                mapRepository: _mapRepository,
                user: state.user,
//              alertRepository: FirebaseAlertRepository(),
              ),
            );
          }
          return SplashScreen();
        },
      ),
      navigatorObservers: [
        FirebaseAnalyticsObserver(analytics: analytics),
      ],
    );
Run Code Online (Sandbox Code Playgroud)

同步事件:

abstract class SyncEvent {
  const SyncEvent();

  @override
  List<Object> get props => [];
}

class SyncLanguages extends SyncEvent {}

class SyncIcons extends SyncEvent {}
Run Code Online (Sandbox Code Playgroud)

和同步块:

class SyncBloc extends Bloc<SyncEvent, SyncState> {
  @override
  SyncState get initialState => InitialState();

  Stream<SyncState> mapEventToState(SyncEvent event) async* {
    if (event is SyncLanguages) {
      print('SyncLanguages received');
    }
    if (event is SyncIcons) {
      print('SyncIcons received');
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Vin*_*nzo 7

该问题与 BlocProvider 的 create 方法默认情况下是惰性的有关。因此,在.of调用该方法之前,BlocProvider 不会创建块。要使其立即创建块,只需将lazy:参数设置为 false。

BlocProvider<LocationBloc>(
                    lazy: false,
                    create: (context) => LocationBloc(
                          mapRepository: _mapRepository,
                        )
                          ..add(GetLocationStream())
                          ..add(GetLocation())
                          ..add(GetIsoLocationUser())),
                BlocProvider<SyncBloc>(
                    lazy: false,
                    create: (context) => SyncBloc()
                      ..add(SyncLanguages())
                      ..add(SyncIcons())),
Run Code Online (Sandbox Code Playgroud)

这实际上是有效的,尽管即使没有将惰性参数设置为 false,也会发送 AuthenticationBloc 和 LocationBloc 事件。仍然需要检查原因,但我猜这两个块是分别由 BlocBuilder 和 BlocListener 创建的。一旦确定,我会立即编辑答案。