在 Flutter 上,我想将本地bloc
传递到另一个屏幕。 这就是我在使用默认导航器时将集团传递到新路线的方式。
Navigator.of(context).push(
MaterialPageRoute<void>(
builder: (BuildContext context) => BlocProvider.value(
value: localBloc,
child: MyPage(),
),
));
但是现在,我正在使用go_router
包进行导航。如何使用BlocProvider.value()
向我想要的屏幕提供本地bloc
。
您需要使用BlocProvider.value
将集团传递给route
。
context.goNamed('/', extra: HomeBloc());
GoRoute(
path: '/',
builder: (context, state) {
return BlocProvider.value(
value: state.extra! as HomeBloc,
child: HomeScreen(),
);
}
),
然后在HomeScreen
里面你可以得到集团使用。
final bloc = context.read<HomeBloc>();
lazy
加载BlocProvider。
当与 Create 一起使用时,它会自动处理关闭实例。默认情况下,仅在访问实例时调用 Create。若要覆盖此行为,请将 lazy 设置为 false。
因此,最佳做法不是在路由之间传递bloc
,而是:
使用MultiBlocProvider
提供main.dart
中的所有BlocProvider
并在App()
之前添加它,以便所有孩子都可以访问它。
runApp(
MultiBlocProvider(
providers: [
BlocProvider<BlocA>(
create: (context) => BlocA(),
),
BlocProvider<BlocB>(
lazy: false // if you want the bloc to be loaded here.
create: (context) => BlocB(),
),
],
child: App()
)
);
并使用所需屏幕中的BlocProvider.of<BlocA>(context).add([BlocAEvent]);
访问它