You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 16:14:54