Как запросить данные из collectionGroups в Firestore с Flutter - PullRequest
0 голосов
/ 10 ноября 2019

Для приложения, которое я создаю во Flutter, я пытаюсь получить список зарезервированных временных интервалов зарегистрированным пользователем в разные дни из Firestore. Я попадаю в точку, где я могу получить зарезервированные временные интервалы в определенный день (путем жесткого кодирования дня и передачи его в futurebuilder), но когда я пытаюсь извлечь данные из коллекции collectionGroup, список остается пустым. Теперь, как новичок Flutter, я нахожу понимание того, как обрабатывать запросы collectionGroup, довольно сложно, и поэтому любая помощь будет принята с благодарностью!

Для быстрого обзора структуры моей базы данных я включил в github 2 изображения:

Изображение 1: https://github.com/winckles/rooster/blob/master/Schermafbeelding%202019-11-10%20om%2020.08.20.png?raw=true

Изображение 2: https://github.com/winckles/rooster/blob/master/Schermafbeelding%202019-11-10%20om%2020.08.43.png?raw=true

Ниже я включил моего будущего построителя и построителя списков

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';

class TimesTest extends StatefulWidget {
  @override
  _TimesTestState createState() => _TimesTestState();
}

class _TimesTestState extends State<TimesTest> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: MyFutureBuilder('2019-11-10'),
      ),
    );
  }
}

class MyFutureBuilder extends StatelessWidget {
  final String date;
  MyFutureBuilder(this.date);

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: MyTimes().getMyTimes('${loggedInUser.email}', date),
      builder: (context, AsyncSnapshot snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting) {
          return Center(
            child: CircularProgressIndicator(
              backgroundColor: Colors.lightBlueAccent,
            ),
          );
        } else if (snapshot.hasData) {
          return ListView.builder(
              padding: EdgeInsets.symmetric(horizontal: 10.0, vertical: 20.0),
              itemCount: snapshot.data.documents.length,
              itemBuilder: (BuildContext context, int index) {
                DocumentSnapshot user = snapshot.data.documents[index];
                return Padding(
                  padding: EdgeInsets.symmetric(
                    horizontal: 7.0,
                    vertical: 3.0,
                  ),
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: <Widget>[
                      Card(
                        color: Colors.white,
                        child: Container(
                          child: ListTile(
                            onTap: () {},
                            title: Text(
                              user.data['hour'],
                              style: TextStyle(
                                color: Colors.grey[900],
                              ),
                            ),
                            subtitle: Text(
                              user.data['reserved'],
                              style: TextStyle(
                                color: Colors.grey[900],
                              ),
                            ),
                            leading: Icon(
                              Icons.access_time,
                              color: Colors.grey[900],
                            ),
                          ),
                        ),
                      ),
                    ],
                  ),
                );
              });
        } else if (snapshot.connectionState == ConnectionState.done &&
            !snapshot.hasData) {
          return Center(
            child: Text('No times found'),
          );
        } else {
          return Center(
            child: Text('No times found'),
          );
        }
      },
    );
  }
}

И вот как я получаю данные из пожарного магазина.

import 'package:cloud_firestore/cloud_firestore.dart';

class MyTimes {
  Future getMyTimes(String reserved, String date) async {
    return Firestore.instance
        .collection('days')
        .document(date)
        .collection('hours')
        .where('reserved', isEqualTo: reserved)
        .getDocuments();
  }
}

//I have also tried this:
//class MyTimes {
//  Future getMyTimes(String reserved) async {
//    return Firestore()
//        .collectionGroup('hours')
//        .where('reserved', isEqualTo: reserved)
//        .getDocuments();
//  }
//}

Я создал индекс с идентификатором коллекции «часы» и с диапазоном сбора «collectionGroup», мои правила безопасности сейчас следующие:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }

    match /{path=**}/hours/{document}{
    allow read, write;
    }
  }
}

Я потратилчасы и часы, пытаясь выяснить это, так что на самом деле что-нибудь полезное будет высоко ценится!

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