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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 09:54:15