Flutter StreamBuilder для запроса вложенной коллекции документа в вложенной коллекции в Firestore

Во Flutter я использую StreamBuilder, чтобы получить вложенную коллекцию документа в коллекции из Firestore. Но я получаю ноль, а индикатор прогресса продолжает вращаться.

Структура следующая:

/dev/l0WwBF4HXBZ59hMGcKvY/meas_weight

Это представление консоли:  введите описание изображения здесь

И это мой код:

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: StreamBuilder(
        stream: Firestore.instance
            .collection('dev')
            .document('l0WwBF4HXBZ59hMGcKvY')
            .collection('meas_weight')
            .snapshots(),
        builder: (context, AsyncSnapshot<QuerySnapshot> snapshot) {
          if (snapshot.hasError) return new Text('Error: ${snapshot.error}');
          switch (snapshot.connectionState) {
            case ConnectionState.waiting:
              return CircularProgressIndicator();
            default:
              return ListView.builder(
                itemCount: snapshot.data.documents.length,
                itemBuilder: (context, index) {
                  DocumentSnapshot document = snapshot.data.documents[index];
                  return ListTile(
                    title: Text('${document['value']}'),
                  );
                },
              );
          }
        },
      ),
    );
  }

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

Ваша помощь очень ценится.


person juanarzac    schedule 12.08.2020    source источник
comment
Согласно: firebase.google.com/docs/firestore/query. -data / Получить список коллекций с помощью клиентских библиотек для мобильных устройств и веб-сайтов невозможно. Вы должны искать имена коллекций только в рамках административных задач в средах доверенных серверов. Если вы обнаружите, что вам нужна эта возможность в мобильных / веб-клиентских библиотеках, подумайте о реструктуризации данных, чтобы имена подколлекций были предсказуемыми.   -  person Mario    schedule 13.08.2020
comment
Спасибо, Марио. Я надеялся найти решение без реструктуризации данных. Но я думаю, что я достиг предела.   -  person juanarzac    schedule 13.08.2020


Ответы (1)


Проблема оказалась связана с правилами. Я не понимал, что правила не применяются к подколлекциям, если они не установлены явно. Вот почему я не стал включать их в свой вопрос. Смотрите документацию здесь:

https://firebase.google.com/docs/firestore/security/rules-structure#hierarchical_data

Итак, сначала я переименовал коллекцию в Meas_weights, а затем изменил правило следующим образом:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /dev/{user} {
      allow read,write: if request.auth != null;
      match /meas_weights/{meas_weight} {
        allow read, write: if request.auth != null;
      }
    }
  }
}

Тогда мне удалось собрать документы в подколлекцию.

person juanarzac    schedule 14.08.2020