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

Go_Router使用问题:页面返回结果传递与路由信息获取

针对go_router导航问题的解决方案

1. 实现页面间参数传递与返回结果接收

你的通用路由函数可以通过修改返回类型、利用context.push的Future特性以及extra参数,实现双向数据传递:

修改后的通用路由函数

static Future<dynamic> go(
  {required BuildContext context,
  required Mode mode,
  required String moveTo,
  var param}) async {
  try {
    switch (mode) {
      case Mode.PUSH:
        // 传递参数到目标页面,同时等待返回结果
        final result = await context.push(
          RouteName.root + moveTo,
          extra: param,
        );
        return result;
      case Mode.REPLACE:
        await context.pushReplacement(
          RouteName.root + moveTo,
          extra: param,
        );
        break;
      case Mode.REMOVE:
        context.go(RouteName.root);
        await context.pushReplacement(
          RouteName.root + moveTo,
          extra: param,
        );
        break;
      case Mode.POP:
        // POP时携带返回结果给上一页
        context.pop(param);
        break;
    }
  } catch (e) {
    print(e);
    return null;
  }
  return null;
}

用法示例

  • 页面A跳转至页面B并接收返回结果:
// 在页面A中调用
final result = await RouterUtil.go(
  context: context,
  mode: Mode.PUSH,
  moveTo: '/pageB',
  param: {'userId': 456},
);
// 处理返回结果
if (result != null) {
  print('页面B返回的数据: $result');
}
  • 页面B获取参数并返回结果:
// 在页面B中获取传递的参数
final param = GoRouterState.of(context).extra as Map<String, dynamic>;
print('页面A传递的参数: ${param['userId']}');

// 返回时传递结果
ElevatedButton(
  onPressed: () {
    RouterUtil.go(
      context: context,
      mode: Mode.POP,
      moveTo: '', // POP模式下moveTo无意义,可留空
      param: {'status': 'success', 'message': '操作完成'},
    );
  },
  child: const Text('返回'),
)

2. 监听路由事件获取页面信息

通过自定义NavigatorObserver可以监听所有导航动作(进入、返回、替换路由等),从而追踪用户活动:

自定义路由观察者

class AppRouteObserver extends NavigatorObserver {
  @override
  void didPush(Route<dynamic> route, Route<dynamic>? previousRoute) {
    super.didPush(route, previousRoute);
    // 进入新页面时记录信息
    final currentPage = route.settings.name;
    final prevPage = previousRoute?.settings.name;
    print('用户从 $prevPage 进入 $currentPage');
    // 这里可以将日志存入本地或上传到分析平台
  }

  @override
  void didPop(Route<dynamic> route, Route<dynamic>? previousRoute) {
    super.didPop(route, previousRoute);
    // 返回上一页时记录信息
    final currentPage = previousRoute?.settings.name;
    final poppedPage = route.settings.name;
    print('用户从 $poppedPage 返回 $currentPage');
  }

  @override
  void didReplace({Route<dynamic>? newRoute, Route<dynamic>? oldRoute}) {
    super.didReplace(newRoute: newRoute, oldRoute: oldRoute);
    final newPage = newRoute?.settings.name;
    final oldPage = oldRoute?.settings.name;
    print('用户将 $oldPage 替换为 $newPage');
  }
}

在GoRouter中配置观察者

final appRouter = GoRouter(
  observers: [AppRouteObserver()], // 添加自定义观察者
  routes: [
    // 你的路由配置
    GoRoute(
      path: '/',
      builder: (context, state) => const HomePage(),
    ),
    GoRoute(
      path: '/pageB',
      builder: (context, state) => const PageB(),
    ),
  ],
);

页面内获取当前路由信息

如果需要在页面内部直接获取当前路由的详细信息(如参数、路径),可以通过GoRouterState:

final routeState = GoRouterState.of(context);
print('当前页面路径: ${routeState.fullPath}');
print('路由参数: ${routeState.params}');
print('传递的额外参数: ${routeState.extra}');

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 22:40:38