调用Firebase Cloud Function返回List<Map<Object?, Object?>>,如何转换为可用类型?
解决Firebase Cloud Function返回Map类型转换失败的问题
直接使用as Map<String?, dynamic>会失败,是因为Dart的泛型类型检查是严格的——_Map<Object?, Object?>和Map<String?, dynamic>属于不同的运行时类型,哪怕实际键都是String,也无法直接强制转换。以下是两种可行的解决方式:
方案1:手动转换键值对构建新Map
既然调试确认所有键都是String,我们可以遍历原Map的键值对,将键转为String类型后,生成符合要求的Map<String?, dynamic>:
final result = await FirebaseFunctions.instance.httpsCallable('users').call(); if (result.data != null) { final data = result.data as List<Object?>; for (final obj in data) { if (obj != null && obj is Map<Object?, Object?>) { final user = Map<String?, dynamic>.fromEntries( obj.entries.map( (entry) => MapEntry(entry.key as String?, entry.value), ), ); // 正常访问user的属性,例如: // print(user['username']); // print(user['age']); } } }
方案2:利用JSON序列化重新解析
Firebase Cloud Function返回的数据本质是JSON结构,我们可以先将结果转为JSON字符串,再重新解码,得到标准的Map<String, dynamic>:
import 'dart:convert'; // ... final result = await FirebaseFunctions.instance.httpsCallable('users').call(); if (result.data != null) { final jsonString = json.encode(result.data); final data = json.decode(jsonString) as List<dynamic>; for (final user in data) { // user自动为Map<String, dynamic>,直接使用即可 // print(user['id']); // print(user['email']); } }
内容的提问来源于stack exchange,提问作者Neigaard
相关产品推荐
相关产品推荐

