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

Flutter中使用go_router如何向其他页面传递多个参数?

go_router 多参数(含模型类对象)传递方案

在go_router中传递多个非字符串类型参数、模型类实例非常简单,不需要绕弯用字符串参数硬转:

  • 核心是利用extra字段支持任意类型Object的特性,不要被「只能传单个值」的误区限制,你只需要把多个待传参数封装成一个自定义的参数类,整体传给extra即可。

具体实现步骤

  1. 为每个需要接收复杂参数的页面,定义对应的参数数据类,把所有需要传递的字段都放进去:
/// CatalogFilterPage 路由参数封装
class CatalogFilterPageArgs {
  final List list;
  final dynamic bloc; // 替换为实际使用的Bloc类型即可
  const CatalogFilterPageArgs({
    required this.list,
    required this.bloc,
  });
}
  1. 页面跳转时,实例化这个参数类,直接传入extra字段:
context.pushNamed(
  'CatalogFilterPage',
  extra: CatalogFilterPageArgs(list: list, bloc: bloc),
);
  1. 路由配置处,从state.extra中取出参数,强转为你定义的参数类,再传给页面即可:
GoRoute(
  name: 'CatalogFilterPage',
  path: '/catalog-filter',
  builder: (context, state) {
    final args = state.extra as CatalogFilterPageArgs;
    return CatalogFilterPage(
      list: args.list,
      bloc: args.bloc,
    );
  },
)

常见疑问说明

  • 通过extra传递模型类、Bloc实例是完全规范的官方推荐做法:go_router设计pathParams、queryParams为字符串键值对,本来就是为了适配URL路径规则、深度链接场景下的可序列化参数传递;而extra就是专门用来承载复杂对象、非序列化状态数据的,完全符合设计预期。
  • 注意extra的适用边界:如果是浏览器地址栏直达、App冷启动通过深度链接打开路由的场景,extra会为空——因为这类场景不存在跳转时附带的内存对象,这类场景下需要把可序列化的简单参数(比如资源ID)放到path/query参数里传递,进入页面后再根据ID拉取对应数据;而Bloc、列表数据这类内存态对象,本身就不支持跨冷启动/跨外部链接传递,用extra传是唯一合理的方案。
  • 你提到的params是Map<String,String>类型,本身是给路径占位符(比如/detail/:id)设计的,不适合也不应该用来传递复杂模型对象,不需要强行用它实现这类需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 14:45:32