Flutter测验应用计时结束报错:找不到路由生成器如何解决?
问题解决方法
核心原因
异常提示找不到/ResultBox()的路由生成器,但你的代码中调用的是Navigator.pushNamed(context, "/testResult");,说明路由名不匹配,且目标路由未在根应用(如MaterialApp)中注册,导致Flutter无法找到对应页面的生成方式。
解决步骤
1. 统一路由名并注册
首先确认你的结果页组件名称(比如是ResultBox),然后在根MaterialApp的routes表中注册对应路由,确保路由名和你pushNamed调用的一致:
MaterialApp( initialRoute: '/', routes: { '/': (context) => const HomeScreen(), // 首页路由 '/test': (context) => const TestScreen(), // 测验页路由 // 注册结果页路由,二选一匹配你的代码: // 如果你代码里用的是"/testResult",则注册这个: '/testResult': (context) => const ResultBox(), // 或者如果异常里的"/ResultBox"是正确的路由名,就注册这个: // '/ResultBox': (context) => const ResultBox(), }, );
注意:路由名不要加括号(比如/ResultBox()是错误写法,应该是/ResultBox)。
2. 优化动画状态监听逻辑
当前用addListener会在动画每一帧触发,改用addStatusListener更高效,且要确保context可用(避免组件已销毁时跳转):
@override void initState() { _questions = getData(); super.initState(); _controller = AnimationController( vsync: this, duration: Duration(seconds: limitTime)); // 替换原addListener为addStatusListener _controller.addStatusListener((status) { if (status == AnimationStatus.completed && mounted) { // 若TestScreen是从其他页面push进来的,再执行pop;如果是根页面则不需要pop // Navigator.pop(context); Navigator.pushNamed(context, "/testResult"); } }); _controller.forward(); }
3. 修正dispose方法
原dispose中的判断多余,直接销毁控制器即可:
@override void dispose() { _controller.dispose(); super.dispose(); }
内容的提问来源于stack exchange,提问作者Great
相关产品推荐
相关产品推荐

