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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 20:40:26