如何使用 Flutter 在 Firestore 中检查多个文档中的特定值
Posted
技术标签:
【中文标题】如何使用 Flutter 在 Firestore 中检查多个文档中的特定值【英文标题】:How to check a specific Value in multiple Documents in Firestore with Flutter 【发布时间】:2020-11-21 23:41:30 【问题描述】:我正在尝试检查我的集合中的任何文档是否包含具有特定时间的值。但我做错了什么。
我正在寻找一种方法来检查我的集合中的任何文档是否在“CreatedAt”字段中包含“DateTime.now().year”。
List documents = [];
@override
void initState()
Firestore.instance.collection('Collection').getDocuments().then((snapshot)
List<DocumentSnapshot> allDocs = snapshot.documents;
List<DocumentSnapshot> yearDocs = allDocs.where((e) => e.data['createdAt'].toDate.year() == DateTime.now().year).toList();
// iterate over your yearDocs, and add the data to documents
yearDocs.forEach((item)
documents.add(item);
);
);
super.initState();
我想设置一个包含文档的列表,其中“字段”包含“DateTime.now().year”。然后我检查列表是否为空。
documents.length >= 1? Container(
child: Text('works'),
) : SizedBox(),
【问题讨论】:
你能帮我解决这个错误吗? 【参考方案1】:答案 3.0
你的答案在于以下
从DataSnapshot
数组中获取createdAt
元素,即allDocs
有一个catch是createdAt
带入Firebase TimeStamp实例格式的时间戳,即=>TimeStamp(seconds=int, nanoseconds=int)
,例如:Timestamp(seconds=1593504718, nanoseconds=706167000)
我们关心的是获取seconds
,它只是一个时间戳
使用秒并从中获取Year
,并将其存储在您的yearDocs
要获取年份形式的数据,我们这样做
allDocs.forEach((item) => print(item.data["createdAt"].seconds));
// gives your timestamp
// 1593504718
// 1593504699
// 1593259892
// 1596121191
我们可以通过这样做得到年份
new DateTime.fromMillisecondsSinceEpoch(1593504718 * 1000).year
结合所有这些,让我们编码:
List documents = [];
@override
void initState()
Firestore.instance.collection('Collection').getDocuments().then((snapshot)
List<DocumentSnapshot> allDocs = snapshot.documents;
// now here we get the data in respect of year
List<DocumentSnapshot> yearDocs = allDocs.where((e) =>
DateTime.fromMillisecondsSinceEpoch(e.data["createdAt"].seconds * 1000).year == DateTime.now().year).toList();
print(yearDocs.length);
// iterate over your yearDocs, and add the data to documents
yearDocs.forEach((item)
documents.add(item);
);
print(documents.length);
);
休息就好了,您可以按照documents.length
填充数据。请让我知道这是否对您有帮助。 :) 这也将帮助您获得一些见解 => DateTime class
【讨论】:
我改进了我的代码,就像在我的问题中一样,但即使“createdAt”的年份与当前年份匹配,列表也是空的。 查看我的改进部分@Kinnay,如果有帮助请告诉我 那么问题来了,你的数据无法正确获取。让我们逐行调试,然后找出解决方案。你准备好了@Kinnay 吗?此外,我将让我的答案仅反映必须为您工作的解决方案。您可以保留您的代码,但根据我在您的代码中提供的代码进行修改。 年份文档为空。我得到这些错误: I/flutter (18109): 0 E/flutter (18109): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] 未处理异常:NoSuchMethodError:闭包调用参数不匹配:函数“年”E/flutter(18109):接收者:关闭:()=>来自函数“toDate”的日期时间:。 E/flutter (18109):尝试调用:year() E/flutter (18109):找到:year() => DateTime【参考方案2】:我认为你错过了data
yearDocs = allDocs.where((e) => e.data['createdAt'].toDate.year() == DateTime.now()).toList();
【讨论】:
我猜,你是对的 lenz。但我们仍然不确定,他现在面临什么样的错误以上是关于如何使用 Flutter 在 Firestore 中检查多个文档中的特定值的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Flutter 在 Firestore 中删除集合中的所有文档
如何在 Flutter Web 上使用 StreamBuilder 和 Firestore?
如何在 Firebase + Firestore + Flutter 中使用 StreamBuilder 将所有子集合数据获取到 Widget
如何在flutter的firestore中使用uid更新用户数据