Flutter中如何从Firestore数组获取List<String>类型数据(当前仅返回List<dynamic>)
Flutter中如何从Firestore数组获取List类型数据(当前仅返回List)
嘿,看了你的代码,我发现问题出在fromSnapshot方法里处理storage字段的方式上,咱们一步步来修正:
问题根源
你现在写的storage: [snap['storage']] as List<String>有两个明显问题:
snap['storage']本身就是Firestore返回的List<dynamic>数组,你把它套进另一个列表[]里,相当于把整个数组当成了列表的单个元素,完全没必要;- 直接强转
as List<String>会因为类型不匹配报错,因为Firestore返回的数组元素是动态类型,不能直接转成字符串列表。
解决方案
我们需要把Firestore返回的List<dynamic>逐个元素转换成String类型,同时处理可能的空值情况:
1. 修正fromSnapshot方法里的storage字段转换
把原来的storage行替换成下面的代码,同时建议给所有字段加上显式类型转换,提升代码安全性:
static Product fromSnapshot(DocumentSnapshot snap) { return Product( name: snap['name'] as String, category: snap['category'] as String, imageUrl: snap['imageUrl'] as String, detail: snap['detail'] as String?, price: snap['price'] as int, isRecommanded: snap['isRecommanded'] as bool, isPopular: snap['isPopular'] as bool, // 正确转换List<dynamic>到List<String>? storage: (snap['storage'] as List<dynamic>?)?.map((item) => item.toString()).toList(), ); }
2. 更严谨的类型过滤(可选)
如果担心Firestore里的storage数组存在非String类型的元素,可以再加一层过滤,只保留String类型的元素:
storage: (snap['storage'] as List<dynamic>?) ?.where((item) => item is String) ?.map((item) => item as String) ?.toList(),
为什么这样改?
(snap['storage'] as List<dynamic>?):先把Firestore的字段转成可空的动态列表,处理字段不存在的情况;?.map((item) => item.toString()):遍历每个元素,转成String类型;?.toList():把转换后的Iterable转成List类型。
这样修改后,你的storage字段就能正确获取到List<String>?类型的数据,不会再出现类型不匹配的问题啦!
备注:内容来源于stack exchange,提问作者Ko Oo
相关产品推荐
相关产品推荐

