Flutter - получить массив из Firestore с помощью FutureBuilder (используя запрос) - PullRequest
0 голосов
/ 13 июня 2019

Я ужасно путаюсь здесь ... каков правильный синтаксис для перечисления массива из Firestore с FutureBuilder, если мне нужно выполнить запрос документа (где)?

Структура базы данных Firestore:

 - [companies]
   - [doc]

 - [gallery]
   - [doc]
    - [reference] <- (ie, companies/doc)
    - [gallery_images] // List these, but show only images that match where() query

Вот мой текущий код:

Future<List<dynamic>> getGallery() async {
  var firestore = Firestore.instance;

  DocumentReference docRef = firestore.collection('companies').document(widget.docID);

  var ref = firestore.collection('galleries').where('companyRef', isEqualTo: docRef).getDocuments();

  return ref.get().then((datasnapshot) {
        if (datasnapshot.exists) {
        List<dynamic> imageArray = datasnapshot.data['gallery_images'].toList();
          return imageArray;
        } else {
          print("Please just work...");
        }
      },
    );
  }
FutureBuilder(
  future: getGallery(),
  builder: (context, AsyncSnapshot<List<dynamic>> snapshot) {
    if (snapshot.connectionState == ConnectionState.waiting) {
      return Center(
         child: Text("Loading..."),
        );
       } else {
    return GridView.builder(
    gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2),
    itemCount: *length*,
    itemBuilder: (BuildContext context, int index) {
       return ViewGalleryItemThumbnail(
         viewGalleryItem: snapshot.data[index],
         ....

Буду очень признателен, если кто-то сможет показатьменя, где я иду не так!

1 Ответ

0 голосов
/ 13 июня 2019

Не совсем понятно, как выглядит ваша схема Cloud Firestore, но, скорее всего, это вернет вам правильный список динамики. (Обратите внимание, что, добавив универсальный элемент на карту, вы можете получить список того, что вам нужно - например, .map<SomeRealType>((snap) => snap.data['gallery_images']).)

Когда вы застряли с FutureBuilder, иногда полезно временно вернуться к виджету с состоянием. Переопределите initState и вызовите слегка измененный getGallery, который не возвращает значение в конце, но назначает его переменной-члену внутри setState. Так много возможностей для печатных заявлений. Кроме того, попробуйте преобразовать любые .then с в асинхронной функции в линейный ряд await с. Это облегчает чтение (и ваши отладочные отпечатки выходят в линейном разумном порядке).

  Future<List<dynamic>> getGallery() async {
    var firestore = Firestore.instance;

    var docRef = firestore.collection('companies').document(widget.docID);

    var querySnap = await firestore
        .collection('galleries')
        .where('companyRef', isEqualTo: docRef)
        .getDocuments();

    return querySnap.documents
        .map((snap) => snap.data['gallery_images'])
        .toList();
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...