Flutter添加Provider后无响应且报ProviderNotFoundException问题
解决BlocProvider/BlocConsumer的ProviderNotFoundException及点击无响应问题
修复后的完整代码
@override Widget build(BuildContext context) { return BlocProvider( // 直接传入初始状态初始化Cubit create: (context) => CounterCubit(0), // 明确指定BlocConsumer的泛型类型 child: BlocConsumer<CounterCubit, CounterStates>( listener: (context, state) { // 判断当前state实例的类型 if(state is plusState) { print("plusState"); } if(state is minusState) { print("minusState"); } }, builder: (context, state) { return Scaffold( appBar: AppBar(), body: Center( child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ IconButton( onPressed: () { // 调用Cubit内的方法触发状态更新 CounterCubit.get(context).increment(); }, icon: Icon(Icons.add), iconSize: 50, color: Colors.amber, ), SizedBox(width: 20), Text( // 从state中获取计数,而非直接读取Cubit变量 "${state.counter}", style: TextStyle( fontSize: 100, fontWeight: FontWeight.w800, color: Colors.black, ), ), SizedBox(width: 20), IconButton( onPressed: () { // 调用Cubit内的方法触发状态更新 CounterCubit.get(context).decrement(); }, icon: Icon(Icons.remove), iconSize: 50, color: Colors.amber, ), ], ), ), ); }, ), ); } // 配套的CounterCubit与状态类实现 class CounterCubit extends Cubit<CounterStates> { CounterCubit(int initialCounter) : super(CounterInitialState(initialCounter)); static CounterCubit get(context) => BlocProvider.of(context); void increment() { emit(plusState(state.counter + 1)); } void decrement() { emit(minusState(state.counter - 1)); } } abstract class CounterStates {} class CounterInitialState extends CounterStates { final int counter; CounterInitialState(this.counter); } class plusState extends CounterStates { final int counter; plusState(this.counter); } class minusState extends CounterStates { final int counter; minusState(this.counter); }
错误原因及修复说明
ProviderNotFoundException 报错:
原代码在BlocProvider的create方法中尝试用CounterCubit.get(context).state获取状态,但此时该BlocProvider还未挂载到Widget树,context中不存在对应的Provider,导致依赖查找失败。修复方式是直接传入初始状态值初始化Cubit。BlocConsumer 类型不匹配:
原代码未给BlocConsumer指定具体的<CounterCubit, CounterStates>泛型类型,框架无法识别对应的Provider类型,引发类型错误。必须明确指定Cubit和State的具体类型。点击按钮无响应:
原代码直接修改CounterCubit的counter变量,但Cubit需要通过emit方法发送新状态才能触发BlocConsumer的更新逻辑。修复方式是在Cubit内部定义increment、decrement方法,通过emit发送新的状态实例。Listener 状态判断错误:
原代码写成if(CounterStates is plusState),这是在判断类本身的类型,正确写法应该是判断当前接收的state实例的类型:if(state is plusState)。
内容的提问来源于stack exchange,提问作者Abdul Rahman Ayman
相关产品推荐
相关产品推荐

