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

Flutter报错Undefined name 'context',ChangeNotifier类中context为何未定义?

错误原因分析

ZmienneClass 是继承自 ChangeNotifier 的业务逻辑类,不属于 Flutter Widget 树的组成部分,本身不会默认持有 BuildContext 实例。你在 decrementCounter 方法中直接使用的 context 没有提前声明或从外部传入,因此会报未定义错误。

BuildContext 本质是 Widget 在 Widget 树中的位置标记,只有 Widget 本身及对应 State 类会天生持有自身对应的 BuildContext 实例,非 Widget 类使用时必须从外部传入。

修复方案

最简单的实现方式是将 BuildContext 作为方法参数传入:

  1. 修改 decrementCounter 方法定义,新增 BuildContext 入参
class ZmienneClass extends ChangeNotifier {
  void decrementCounter(int liczba, BuildContext context) {
    if (_rundy == 0) {
      Navigator.push(context,
          MaterialPageRoute(builder: (context) => resGamePage(title: "")));
    }
  }
}
  1. 在 Widget 中调用该方法时,传入当前 Widget 对应的 context
// StatefulWidget 中调用示例
@override
Widget build(BuildContext context) {
  return ElevatedButton(
    onPressed: () {
      // 调用时传入当前上下文
      zmienneClass.decrementCounter(1, context);
    },
    child: const Text("执行操作")
  );
}
注意事项
  • 不要在逻辑类中长期存储 BuildContext 引用,避免 Widget 销毁后上下文失效引发崩溃
  • 如果调用方法前有异步操作,需要先判断当前 Widget 是否仍处于挂载状态,再操作上下文:
onPressed: () async {
  await someAsyncTask();
  // mounted 是 State 类的内置属性,仅 State 类可直接访问
  if (!mounted) return;
  zmienneClass.decrementCounter(1, context);
}

内容的提问来源于stack exchange,提问作者Malak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 19:57:01