Flutter中如何从QueryDocumentSnapshot获取字符串列表类型字段
解法说明
有两种常用方式可以实现你的需求:
方式1:直接转换为完整字符串列表(推荐)
Cloud Firestore返回的数组字段默认是List<dynamic>类型,你可以直接通过类型转义得到List<String>,无需逐个读取:
// 一行代码完成赋值,如果你确定tags字段一定存在且所有元素都是字符串 e.tags = (element.get('tags') as List).cast<String>(); // 更健壮的写法,兼容tags为null的情况,避免空异常 e.tags = (element.get('tags') as List?)?.cast<String>() ?? [];
方式2:先获取长度再逐个重建列表
如果需要对每个标签做额外校验、处理,可以采用这种方式:
List<dynamic> tagsRaw = element.get('tags') as List; e.tags = []; // 先获取列表长度,再遍历赋值 for(int i=0; i<tagsRaw.length; i++){ e.tags.add(tagsRaw[i].toString()); }
修改后的完整代码示例
Future<UserData> getUserData() async { QuerySnapshot userExpenses = await getUserExpenses(); List<Expense> expenses = []; userExpenses.docs.forEach((element) { Expense e = new Expense(); e.description = element.get('description'); e.price = element.get('price'); // 替换原来的单元素赋值,用第一种推荐写法 e.tags = (element.get('tags') as List?)?.cast<String>() ?? []; e.id = element.id; expenses.add(e); }); // 其余原有逻辑 } Future<QuerySnapshot> getUserExpenses() async { return FirebaseFirestore.instance .collection('expenses') .where('uuid', isEqualTo: FirebaseAuth.instance.currentUser?.uid) .get(); } class Expense { late String id; late String price; late String description; late List<String> tags; }
数据结构参考

内容的提问来源于stack exchange,提问作者adi.neag
相关产品推荐
相关产品推荐

