Flutter中使用go_router如何向其他页面传递多个参数?
go_router 多参数(含模型类对象)传递方案
在go_router中传递多个非字符串类型参数、模型类实例非常简单,不需要绕弯用字符串参数硬转:
- 核心是利用
extra字段支持任意类型Object的特性,不要被「只能传单个值」的误区限制,你只需要把多个待传参数封装成一个自定义的参数类,整体传给extra即可。
具体实现步骤
- 为每个需要接收复杂参数的页面,定义对应的参数数据类,把所有需要传递的字段都放进去:
/// CatalogFilterPage 路由参数封装 class CatalogFilterPageArgs { final List list; final dynamic bloc; // 替换为实际使用的Bloc类型即可 const CatalogFilterPageArgs({ required this.list, required this.bloc, }); }
- 页面跳转时,实例化这个参数类,直接传入
extra字段:
context.pushNamed( 'CatalogFilterPage', extra: CatalogFilterPageArgs(list: list, bloc: bloc), );
- 路由配置处,从
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
相关产品推荐
相关产品推荐

