Flutter中_rundy=0时页面无跳转无报错 疑似BuildContext问题求助
核心问题原因
- 语法错误:
ZmienneClass中setPlayerCount方法被错误嵌套定义在decrementCounter方法内部,decrementCounter大括号未正确闭合,逻辑无法正常执行。 - 状态实例重复创建:
resGamePage内部通过ChangeNotifierProvider.value(value: ZmienneClass())新建了独立的状态实例,和全局使用的状态实例不互通,状态变更无法同步。 - 跳转
BuildContext无效:调用跳转时传入的context不包含上层Navigator实例,导致Navigator.push执行无响应。 - 构造参数不匹配:跳转时传入的
title参数,未在resGamePage构造函数中定义,触发参数异常。
解决步骤
- 修正
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(); } }
- 修正
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)), // 剩余页面逻辑 ); } }
- 全局初始化状态实例,确保整个路由栈共享同一份状态,在
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 ); } }
- (可选)替换跳转逻辑为全局NavigatorKey实现,无需传入context:
修改ZmienneClass中的跳转代码:
if (_rundy == 0) { navigatorKey.currentState?.push( MaterialPageRoute( builder: (context) => resGamePage(title: "Wyniki"), ), ); }
内容的提问来源于stack exchange,提问作者Malak
相关产品推荐
相关产品推荐

