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

Flutter中_rundy=0时页面无跳转无报错 疑似BuildContext问题求助

核心问题原因

  • 语法错误:ZmienneClass 中 setPlayerCount 方法被错误嵌套定义在 decrementCounter 方法内部,decrementCounter 大括号未正确闭合,逻辑无法正常执行。
  • 状态实例重复创建:resGamePage 内部通过 ChangeNotifierProvider.value(value: ZmienneClass()) 新建了独立的状态实例,和全局使用的状态实例不互通,状态变更无法同步。
  • 跳转 BuildContext 无效:调用跳转时传入的 context 不包含上层 Navigator 实例,导致 Navigator.push 执行无响应。
  • 构造参数不匹配:跳转时传入的 title 参数,未在 resGamePage 构造函数中定义,触发参数异常。

解决步骤

  1. 修正 ZmienneClass 语法错误,补全缺失逻辑:
class ZmienneClass extends ChangeNotifier {
  // 补全_rundy变量定义,替换为你实际的初始值
  int _rundy = 1;
  int graczepoczatkowi = 0;

  void decrementCounter(int liczba, BuildContext context) {
    // 补全_rundy的递减逻辑,你原代码漏了这步
    _rundy -= liczba;
    if (_rundy == 0) {
      // 跳转前校验context有效性
      if (!context.mounted) return;
      Navigator.push(
        context,
        MaterialPageRoute(
          builder: (context) => resGamePage(title: "Wyniki"),
        ),
      );
    }
  }

  void setPlayerCount({required int liczbagraczy}) {
    graczepoczatkowi = liczbagraczy;
    // 状态变更后调用notifyListeners通知监听
    notifyListeners();
  }
}
  1. 修正 resGamePage 代码,删除重复创建的状态实例,补全构造参数:
class resGamePage extends StatefulWidget {
  // 补全title参数定义
  const resGamePage({Key? key, required this.title}) : super(key: key);
  final String title;

  @override
  _resGamePageState createState() => _resGamePageState();
}

class _resGamePageState extends State<resGamePage> {
  @override
  Widget build(BuildContext context) {
    // 直接使用上层Provider注入的ZmienneClass实例,无需重复创建
    return Scaffold(
      appBar: AppBar(title: Text(widget.title)),
      // 剩余页面逻辑
    );
  }
}
  1. 全局初始化状态实例,确保整个路由栈共享同一份状态,在main.dart中配置:
// 全局定义NavigatorKey,彻底解决context依赖问题
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();

void main() {
  runApp(
    // 在MaterialApp上层初始化Provider,全局共享状态
    ChangeNotifierProvider(
      create: (context) => ZmienneClass(),
      child: const MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // 绑定全局NavigatorKey
      navigatorKey: navigatorKey,
      home: const YourHomePage(), // 替换为你的首页Widget
    );
  }
}
  1. (可选)替换跳转逻辑为全局NavigatorKey实现,无需传入context:
    修改ZmienneClass中的跳转代码:
if (_rundy == 0) {
  navigatorKey.currentState?.push(
    MaterialPageRoute(
      builder: (context) => resGamePage(title: "Wyniki"),
    ),
  );
}

内容的提问来源于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 20:24:03