Flutter GoRouter无法传递非String类型参数的问题求助
解决Flutter GoRouter传递非String类型参数的类型错误
问题根源
GoRouter的queryParams仅支持String类型的键值对,你直接传入int类型参数会触发类型不匹配;同时就算强行传入,state.queryParams返回的结果也都是String,直接用as int强转必然失败。
三种可行解决方法
方法1:通过queryParams传递(转String后解析)
适合需要参数在URL中可见的场景,比如筛选、分页参数:
- 修改跳转按钮代码,将int转为String:
IconButton( onPressed: () => context.pushNamed( 'one', queryParams: <String, String>{ 'idGiven': '111', }, ), icon: const Text('Push One'), ),
- 修改GoRoute的参数解析逻辑:
GoRoute( path: '/one', name: 'one', builder: (context, state) { final idStr = state.queryParams['idGiven']; // 处理null情况,避免解析失败 final id = idStr != null ? int.parse(idStr) : 0; return ItemOne(id: id); }, ),
方法2:通过extra参数传递非String类型
适合传递复杂对象或不想暴露在URL中的非String参数:
- 修改跳转按钮代码,直接通过
extra传int:
IconButton( onPressed: () => context.pushNamed( 'one', extra: 111, ), icon: const Text('Push One'), ),
- 修改GoRoute的参数获取逻辑:
GoRoute( path: '/one', name: 'one', builder: (context, state) { // 加空判断避免崩溃 final id = state.extra as int? ?? 0; return ItemOne(id: id); }, ),
方法3:通过路径参数传递(RESTful风格)
如果参数是资源的唯一标识(比如ID),适合用路径参数:
- 修改GoRoute定义,添加路径参数占位符:
GoRoute( path: '/one/:id', name: 'one', builder: (context, state) { final idStr = state.pathParameters['id']; final id = idStr != null ? int.parse(idStr) : 0; return ItemOne(id: id); }, ),
- 修改跳转按钮代码:
IconButton( onPressed: () => context.pushNamed( 'one', pathParameters: <String, String>{ 'id': '111', }, ), icon: const Text('Push One'), ),
内容的提问来源于stack exchange,提问作者Anmol Singh
相关产品推荐
相关产品推荐

