Flutter调用MethodChannel返回List<Map>时类型转换错误如何解决?
问题核心原因
MethodChannel 标准编解码器的反序列化逻辑不会保留嵌套类型的泛型信息:原生侧返回的ArrayList<HashMap<String, String>>传递到 Dart 侧时,外层容器会被解析为List<Object?>,内层的 HashMap 会被解析为_InternalLinkedHashMap<Object?, Object?>,无法直接强转为指定嵌套泛型的类型,这是两次报错的根本原因。
两次报错对应说明
- 调用
invokeMethod时直接指定返回泛型为List<Map<String, String>>,Dart 类型系统不允许将List<Object?>直接强转为泛型不匹配的 List 类型,触发第一类报错。 - 调用
invokeListMethod时仅指定了内层元素泛型为Map<String, dynamic>,方法仅会自动转换外层 List 的泛型,内层 Map 仍然是Object?泛型,强转时触发第二类报错。
解决方法
无需额外配置,仅需对返回结果做一层手动类型转换即可,示例代码如下:
// 第一步:先获取无嵌套泛型的原始数据 final List? rawData = await platform.invokeListMethod( getTableData, <String, String>{'table': selectedTable!}, ); // 第二步:遍历转换内层 Map 的泛型 final List<Map<String, dynamic>>? tableData = rawData?.map((item) { return Map<String, dynamic>.from(item as Map); }).toList();
如果需要严格校验键的类型为 String,也可以增加类型判断逻辑避免原生返回异常结构导致的 crash。
内容的提问来源于stack exchange,提问作者dev404
相关产品推荐
相关产品推荐

