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

Flutter中GetX跨页传递Map列表数据异常解决方案

问题根因
  • GetX 命名路由的Get.parameters仅支持传递字符串类型的键值对。直接将List<Map>类型的cartOrder拼接到路由路径中时,Dart 会自动调用对象的toString()方法将其转为字符串,第二个页面接收到的本质是字符串内容,而非原始结构化列表,因此无法按列表逻辑计算长度、渲染条目。
解决方案

方案1:通过arguments传递复杂对象(推荐)

这是GetX官方支持的复杂数据传参方式,无需序列化转换,可直接传递任意Dart对象(List、Map、自定义实体类均可)。

  1. 第一个页面跳转代码修改:
onTap: (() {
  // 两种写法二选一即可
  // 命名路由写法
  Get.toNamed("/order_details", arguments: cartOrder);
  // 你代码中注释掉的普通路由写法同样有效
  // Get.to(OrderDetails(),arguments: cartOrder);
}),
  1. 第二个页面接收代码修改:
// 明确指定数据类型,避免类型推断异常
final List<Map<String, dynamic>> cartOrder = Get.arguments;

@override
Widget build(BuildContext context) {
  return ListView.builder(
    itemCount: cartOrder.length, // 此处长度会正确返回2
    itemBuilder: (ctx, index) {
      // 直接通过cartOrder[index]['name']、cartOrder[index]['id']取值即可
    }
  );
}

该方案无额外性能损耗,不会出现格式转换异常,是复杂数据跨页面传递的首选方案。

方案2:必须使用parameters传参时,做JSON序列化转换

如果受路由规则限制必须通过路径参数传递数据,需要先将结构化数据转为JSON字符串,接收端再解析回原始结构:

  1. 两个页面都先引入dart转换库:
import 'dart:convert';
  1. 第一个页面跳转时序列化:
onTap: (() {
  final cartOrderStr = jsonEncode(cartOrder);
  Get.toNamed("/order_details?cartOrder=$cartOrderStr");
}),
  1. 第二个页面接收时反序列化:
final List<Map<String, dynamic>> cartOrder = List<Map<String, dynamic>>.from(
  jsonDecode(Get.parameters['cartOrder']!)
);

注意:该方案仅适合数据量较小的场景,若列表数据量大、嵌套层级复杂,优先选择arguments传参,避免序列化性能损耗、特殊字符转义导致的解析失败问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 23:18:17