Flutter中MultiBlocProvider下BlocBuilder找不到Provider的问题求助
解决MultiBlocProvider下BlocBuilder找不到Provider的问题
方案一:使用MultiBlocProvider的builder属性
和单个Provider的思路一致,MultiBlocProvider同样提供了builder参数,通过它可以获取到包含所有Bloc的新BuildContext,直接在这个builder里写BlocBuilder即可:
修改后的代码:
@override Widget build(BuildContext context) { return MultiBlocProvider( providers: [ BlocProvider<LoginCubit>(create: (_) => LoginCubit()), BlocProvider<UserDetailBloc>( create: (_) => UserDetailBloc(UserRepository())..add(UserLogged()), ), ], // 用builder替换child,获取新的BuildContext builder: (context, child) { // 这里的context已经能访问到上面的Bloc了 return BlocBuilder<UserDetailBloc, UserDetailState>( builder: (context, state) { return Scaffold( // 你的页面内容 ); }, ); }, ); }
方案二:将子Widget抽成独立组件
把包含BlocBuilder的部分单独写成一个Widget,这个新Widget的build方法会自动拿到MultiBlocProvider之下的BuildContext,自然能找到对应的Bloc:
示例代码:
@override Widget build(BuildContext context) { return MultiBlocProvider( providers: [ BlocProvider<LoginCubit>(create: (_) => LoginCubit()), BlocProvider<UserDetailBloc>( create: (_) => UserDetailBloc(UserRepository())..add(UserLogged()), ), ], child: _HomePageContent(), ); } // 独立的子Widget class _HomePageContent extends StatelessWidget { @override Widget build(BuildContext context) { // 这里的context属于MultiBlocProvider的子级,能正常访问Bloc return BlocBuilder<UserDetailBloc, UserDetailState>( builder: (context, state) { return Scaffold( // 你的页面内容 ); }, ); } }
原代码报错原因
你原来用的是build方法传入的context,这个context是MultiBlocProvider的父级上下文,并没有包含MultiBlocProvider中注册的Bloc实例,所以BlocBuilder找不到对应的Provider。而上面两种方法都是获取到了MultiBlocProvider内部的新上下文,自然能正确访问到Bloc。
内容的提问来源于stack exchange,提问作者maxxxo
相关产品推荐
相关产品推荐

