Flutter中如何将Map<String, dynamic>转换为Map<int, String>?
解决Firestore返回Map<String, dynamic>转Map<int, String>的类型转换问题
你在Firestore中创建了如下结构的Map:
{ 1: '1000', 2: '400', 3: '800', 4: '7000', 5: '5000', 6: '300', 7: '2000', 8: '100', };
通过PackageModel模型接收时,range字段被Firestore序列化为_InternalLinkedHashMap<String, dynamic>,当你尝试用pack.range as Map<int, String>强转时,触发了类型转换错误:
Exception has occurred. _CastError (type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'Map<int, String>' in type cast)
方法1:在fromJson方法中直接完成转换
修改PackageModel的fromJson方法,把Firestore返回的原始Map直接转换成Map<int, String>,后续使用时无需再处理类型:
class PackageModel { String? id; final String? name; String? description; int? price; String? pcolor; String? img; Map<int, String>? range; // 直接指定目标类型 PackageModel({ this.id, this.name, this.description, this.price, this.img, this.pcolor, this.range, }); static PackageModel fromJson(Map<String, dynamic> json) { Map<int, String>? convertedRange; if (json['range'] != null) { final rawRange = json['range'] as Map<String, dynamic>; convertedRange = rawRange.map((key, value) => MapEntry(int.parse(key), value.toString()) ); } return PackageModel( id: json['id'], name: json['name'], description: json['description'], price: json['price'], img: json['img'], pcolor: json['pcolor'], range: convertedRange, ); } }
方法2:编写独立转换函数
如果不想修改模型类,可以单独写一个工具函数,在需要使用range时调用转换:
Map<int, String> convertRange(Map<String, dynamic> rawRange) { return rawRange.map((key, value) => MapEntry(int.parse(key), value.toString()) ); }
使用示例:
// 替换原强转代码 updatePackageRange(convertRange(pack.range as Map<String, dynamic>));
额外提示
- 确保Firestore中
range的键都是可解析为int的字符串,若存在异常键,可改用int.tryParse避免崩溃 - 如果值的类型不确定,
value.toString()能保证统一转为字符串,可根据实际业务调整转换逻辑
内容的提问来源于stack exchange,提问作者Tpp
相关产品推荐
相关产品推荐

