Flutter中GetX跨页传递Map列表数据异常解决方案
问题根因
- GetX 命名路由的
Get.parameters仅支持传递字符串类型的键值对。直接将List<Map>类型的cartOrder拼接到路由路径中时,Dart 会自动调用对象的toString()方法将其转为字符串,第二个页面接收到的本质是字符串内容,而非原始结构化列表,因此无法按列表逻辑计算长度、渲染条目。
解决方案
方案1:通过arguments传递复杂对象(推荐)
这是GetX官方支持的复杂数据传参方式,无需序列化转换,可直接传递任意Dart对象(List、Map、自定义实体类均可)。
- 第一个页面跳转代码修改:
onTap: (() { // 两种写法二选一即可 // 命名路由写法 Get.toNamed("/order_details", arguments: cartOrder); // 你代码中注释掉的普通路由写法同样有效 // Get.to(OrderDetails(),arguments: cartOrder); }),
- 第二个页面接收代码修改:
// 明确指定数据类型,避免类型推断异常 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字符串,接收端再解析回原始结构:
- 两个页面都先引入dart转换库:
import 'dart:convert';
- 第一个页面跳转时序列化:
onTap: (() { final cartOrderStr = jsonEncode(cartOrder); Get.toNamed("/order_details?cartOrder=$cartOrderStr"); }),
- 第二个页面接收时反序列化:
final List<Map<String, dynamic>> cartOrder = List<Map<String, dynamic>>.from( jsonDecode(Get.parameters['cartOrder']!) );
注意:该方案仅适合数据量较小的场景,若列表数据量大、嵌套层级复杂,优先选择arguments传参,避免序列化性能损耗、特殊字符转义导致的解析失败问题。
内容的提问来源于stack exchange,提问作者Raghava Reddy
相关产品推荐
相关产品推荐

