使用BlocProvider.value向AlertDialog提供Cubit时出现BlocProvider未找到问题
解决AlertDialog中无法找到Cubit的问题
问题核心在于showDialog的builder函数会创建独立的上下文层级,在这个层级里调用context.read<DropdownCubit<Sperrgrund>>()无法找到原本在页面上下文树中的Cubit实例。
修正方案
在onPressed回调里先获取Cubit实例,再将这个实例传递给BlocProvider.value,避免在builder内部调用context.read():
SlidableAction( backgroundColor: block.sperrgrund != null ? Colors.orange : Colors.green, icon: block.sperrgrund != null ? Icons.lock : Icons.lock_open, onPressed: block.sperrgrund == null ? (context) { // 在原页面上下文获取Cubit实例 final dropdownCubit = context.read<DropdownCubit<Sperrgrund>>(); showDialog( context: context, builder: (context) { return BlocProvider.value( value: dropdownCubit, child: SperrenPopup( block: block as ZinkScan, cubit: this.cubit!, ), ); } ); } : null )
原理说明
onPressed回调里的context属于当前页面的上下文树,能正确找到已初始化的DropdownCubit<Sperrgrund>;而showDialog的builder生成的上下文是独立于原页面的新层级,直接在其中调用context.read()会在新层级中查找,自然找不到原有的Cubit实例。
额外提醒:如果this.cubit!本身就是DropdownCubit<Sperrgrund>类型,也可以直接将它传给BlocProvider.value,无需额外调用context.read(),代码会更简洁。
内容的提问来源于stack exchange,提问作者David Prinz
相关产品推荐
相关产品推荐

