Flutter中如何在两个组件间传递上下文以解决BlocProvider.of()找不到BottomSheetBloc的问题
解决Flutter嵌套组件传递上下文获取Bloc的问题
首先,你遇到的错误核心原因是:子组件_listItemColumn使用的是自身的上下文,这个上下文并没有被BottomSheetBloc的BlocProvider覆盖;而父组件_getRow里BlocBuilder的上下文是包含该Bloc的,所以我们只需要把这个父级上下文传递给子组件即可,下面是两种常用且可行的实现方式:
方法一:直接将父组件上下文作为参数传入子组件
这是最直观且推荐的方式,只需要修改子组件的参数定义,调用时传入父级上下文即可:
步骤1:修改子组件_listItemColumn的参数
添加required BuildContext context参数,并且在调用BlocProvider.of时使用这个传入的上下文:
Widget _listItemColumn({ required BuildContext context, // 新增上下文参数 required String name, required String fullAddress, required String id, }) { return Column( children: [ Padding( padding: const EdgeInsets.fromLTRB( Margins.medium, Margins.tiny, Margins.tiny, Margins.small ), child: Row( mainAxisAlignment: MainAxisAlignment.center, mainAxisSize: MainAxisSize.max, children: [ Material( color: Colorz.white, child: InkWrapper( splashColor: Colorz.lighterGray, child: IconButton( alignment: Alignment.center, icon: SvgPicture.asset(Img.listItemMenu), onPressed: () {}, ), onTap: () { // 使用传入的父级上下文获取Bloc BlocProvider.of<BottomSheetBloc>(context).add( BottomSheetEventOpenRemoveAddress( addressId: id, ), ); }, ), ), ], ), ), ], ); }
步骤2:在父组件中调用子组件时传入上下文
在_getRow的BlocBuilder的builder方法里,把当前的context传给_listItemColumn:
return Stack( children: [ progress ? Center( child: Container( color: Colorz.transparent30, child: const PlatformProgressIndicator() ), ) : const EmptyWidget(), // 传入父级上下文 _listItemColumn( context: context, name: name, fullAddress: fullAddress, id: id ) ], );
方法二:使用Builder组件间接获取父级上下文
如果你不想显式传递上下文参数,可以用Builder组件包裹子组件,Builder会提供一个位于父组件上下文范围内的新上下文,再将其传入子组件:
// 在父组件的Stack中替换子组件的调用 Builder( builder: (parentContext) { return _listItemColumn( context: parentContext, name: name, fullAddress: fullAddress, id: id ); }, )
两种方法都能解决问题,但方法一更清晰易懂,也更符合Flutter的代码习惯,优先推荐使用第一种方式。
内容的提问来源于stack exchange,提问作者Andrii Havrylyak
相关产品推荐
相关产品推荐

