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)
该问题与 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 创建的。一旦确定,我会立即编辑答案。
| 归档时间: |
|
| 查看次数: |
1525 次 |
| 最近记录: |