Как проверить конкретное значение c в нескольких документах в Firestore с помощью Flutter - PullRequest
2 голосов
/ 01 августа 2020

Я пытаюсь проверить, содержит ли какой-либо документ из моей коллекции значение с определенным временем. Но я делаю что-то не так.

Я ищу способ проверить, содержит ли какой-либо документ в моей коллекции значение «DateTime.now (). Year» в поле «CreatedAt».

  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(),

Ответы [ 2 ]

1 голос
/ 01 августа 2020

Думаю, ты пропал data

yearDocs = allDocs.where((e) => e.data['createdAt'].toDate.year() == DateTime.now()).toList();
1 голос
/ 01 августа 2020

Ответ 3.0

Ваш ответ заключается в следующем

  • Извлеките элемент createdAt из массива DataSnapshot, который равен allDocs
  • Есть уловка, заключающаяся в том, что 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...