Firebase Realtime报错:_InternalLinkedHashMap非Map<String,dynamic>类型
问题现象
读取Firebase Realtime响应数据做值类型转换时,会触发以下报错:
'_InternalLinkedHashMap<Object?, Object?>' is not a subtype of type 'Map<String, dynamic>' in type cast
该问题仅在使用realtime服务时出现,使用firestore服务时不会触发同类报错。
触发原因
Firebase Realtime SDK返回的快照数据默认是键类型为Object?、值类型为Object?的_InternalLinkedHashMap结构,不会像Firestore SDK那样自动将Map的键转换为String类型,直接强转为Map<String, dynamic>会因泛型不匹配抛出类型转换异常。
解决方法
- 直接对
snapshot.value做Map<String, dynamic>类型强转是触发报错的核心原因,该写法在Realtime场景下不可用。 - 单层Map结构直接手动做键的字符串转换即可,参考代码:
// 按SDK返回的原生类型接收数据 final rawData = snapshot.value as Map; // 手动将所有key转为String,得到目标类型Map final Map<String, dynamic> parsedData = rawData.map( (key, value) => MapEntry(key.toString(), value) );
- 返回数据存在多层嵌套Map结构时,需要写递归逻辑遍历所有嵌套Map节点,对每一层的key都做String类型转换,否则嵌套层级的Map依然会触发同类强转报错。
- 使用10.0.0及以上版本的
firebase_databaseFlutter插件时,拿到Map<Object?, Object?>类型的原始数据后,可调用.cast<String, dynamic>()方法完成类型转换,嵌套场景下同样需要递归对每一层嵌套Map执行cast操作。
内容的提问来源于stack exchange,提问作者Stewart Chan
相关产品推荐
相关产品推荐

