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

非命名路由场景下,错误页面如何获取之前导航的目标路由?

在Flutter错误页中获取原导航目标路由(非命名路由场景)

因为你用的是非命名路由,核心思路就是在跳转到错误页时,直接把原目标的Widget实例传递过去,这样错误页就能拿到原导航目标,实现重试跳转。

具体实现步骤

1. 定义带参数的错误页

错误页需要接收原目标Widget作为参数,方便后续复用:

class ErrorPage extends StatelessWidget {
  // 保存原导航目标的Widget实例
  final Widget targetRouteWidget;

  const ErrorPage({
    super.key,
    required this.targetRouteWidget,
  });

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            const Text("导航出错,请检查网络后重试"),
            const SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                // 重试跳转至原目标路由
                Navigator.pushReplacement(
                  context,
                  MaterialPageRoute(builder: (context) => targetRouteWidget),
                );
              },
              child: const Text("重新跳转"),
            ),
          ],
        ),
      ),
    );
  }
}

2. 封装导航方法统一处理错误

在原导航的地方捕获错误,跳转到错误页时传入原目标Widget:

// 封装带错误处理的导航方法
Future<void> pushWithErrorHandler(BuildContext context, Widget targetWidget) async {
  try {
    await Navigator.push(
      context,
      MaterialPageRoute(builder: (context) => targetWidget),
    );
  } catch (e) {
    // 假设这里捕获到无网络等错误,跳转至错误页
    Navigator.pushReplacement(
      context,
      MaterialPageRoute(builder: (context) => ErrorPage(targetRouteWidget: targetWidget)),
    );
  }
}

3. 调用封装后的导航方法

平时导航时,用这个封装方法代替原生的Navigator.push:

// 比如原目标是DetailPage,传入配置好参数的实例
pushWithErrorHandler(context, const DetailPage(id: 123));

关键点说明

  • 非命名路由的核心是基于Widget实例导航,所以只要保存好原目标的Widget实例(包括它的参数配置),就能在错误页中直接复用。
  • 如果原目标Widget有动态参数,只要确保传递给错误页的是已经初始化好参数的实例即可,无需额外处理路由信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 15:32:42