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

在GoRouter中能否将Map类型数据作为参数传递?

在GoRouter中传递Map类型参数的正确方式

GoRouter本身不直接支持传递Map类型作为路由参数,因为路由参数会被整合到URL中,只能是字符串格式。你遇到的格式错误,大概率是Map转字符串的方式不对(比如直接用toString(),这种方式生成的字符串不符合JSON规范,无法被正确解析)。

正确的实现步骤如下:

  1. 将Map序列化为标准JSON字符串
    使用dart:convert库的jsonEncode()方法把Map转成合法的JSON字符串:

    import 'dart:convert';
    
    // 你的复杂Map数据
    Map<String, dynamic> complexData = {
      'id': 123,
      'details': {'name': 'test', 'tags': ['a', 'b']}
    };
    
    // 序列化为JSON字符串
    String encodedData = jsonEncode(complexData);
    
  2. 通过GoRoute传递序列化后的字符串
    在跳转时把这个字符串作为参数传入:

    context.push('/target-page', extra: encodedData);
    // 或者使用named route:
    context.pushNamed('target', extra: encodedData);
    

    这里推荐用extra字段传递,相比路径参数,它更适合传递复杂字符串,不会有URL编码的额外问题。

  3. 在目标页面反序列化字符串为Map
    在目标页面的路由回调中,把字符串转回到Map:

    GoRoute(
      path: '/target-page',
      builder: (context, state) {
        String? encodedData = state.extra as String?;
        if (encodedData != null) {
          Map<String, dynamic> complexData = jsonDecode(encodedData);
          // 使用你的Map数据
          return TargetPage(data: complexData);
        }
        return ErrorPage();
      },
    )
    

注意事项:

  • 不要用Map.toString()来转换,它生成的是类似{key: value}的格式,不是标准JSON,会导致解析失败。
  • 如果Map里包含自定义对象,需要先实现对象的序列化/反序列化逻辑(比如用json_serializable包),否则jsonEncode会报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 17:35:27