Flutter中Dialog无法获取OfficeVisitBloc的问题求助
问题原因
Dialog默认挂载在Flutter的根Overlay节点下,和触发它的OfficeVisitScreen不属于同一Widget分支,所以Dialog内部的context无法找到上层OfficeVisitBloc的Provider。如果之前直接给Dialog套了新的BlocProvider(而非传递已有实例),相当于创建了全新的Bloc,自然也无法和原业务逻辑联动。
两种可行解决方案
方案一:提前获取Bloc实例,直接传递给Dialog
在弹出Dialog前,先从当前context读取Bloc实例,然后在Dialog的按钮点击事件中直接调用该实例的方法,无需再通过context查找。
CustomRoundedButton( onTap: () { // 提前获取已存在的Bloc实例 final officeVisitBloc = context.read<OfficeVisitBloc>(); showDialog( context: context, builder: (dialogContext) { return AlertDialog( title: const Text('添加内容'), actions: [ TextButton( onPressed: () => Navigator.pop(dialogContext), child: const Text('取消'), ), TextButton( onPressed: () { // 直接使用提前获取的Bloc发送事件 officeVisitBloc.add(YourCustomEvent()); Navigator.pop(dialogContext); }, child: const Text('Add'), ), ], ); }, ); }, )
方案二:用BlocProvider.value传递已有Bloc给Dialog
通过BlocProvider.value将上层的Bloc实例注入到Dialog的Widget树中,这样Dialog内部就能通过context正常读取到Bloc。注意要使用Builder获取BlocProvider子节点的context,避免直接用Dialog的根context。
CustomRoundedButton( onTap: () { showDialog( context: context, builder: (dialogContext) { // 传递已有的Bloc实例给Dialog的Widget树 return BlocProvider.value( value: context.read<OfficeVisitBloc>(), child: AlertDialog( title: const Text('添加内容'), actions: [ TextButton( onPressed: () => Navigator.pop(dialogContext), child: const Text('取消'), ), // 用Builder获取BlocProvider下的context Builder( builder: (innerContext) { return TextButton( onPressed: () { innerContext.read<OfficeVisitBloc>().add(YourCustomEvent()); Navigator.pop(dialogContext); }, child: const Text('Add'), ); }, ), ], ), ); }, ); }, )
内容的提问来源于stack exchange,提问作者Anusha
相关产品推荐
相关产品推荐

