FireStore Flutter Многошаговый запрос - PullRequest
0 голосов
/ 13 декабря 2018

Я впервые разрабатываю проект во Флаттере и пытаюсь найти наилучший способ организации базы данных Firestore.Я считаю, что у меня все так, как я хочу, но не могу понять, как правильно его запросить.

У меня есть пользователь с идентификатором в коллекции, который связывает профиль игрока с его профилем пользователя (в отдельностиколлекции).

Мне нужно:

  1. получить идентификатор пользователя Firebase currentUser
  2. найти соответствующий профиль игрока
  3. Получить идентификаторы событий, сохраненные в профиле игрока
  4. список событий на основе их идентификаторов

Я предполагаю, что в этом порядке.

DatabaseReference getCurrentUserRef() async {
    return this.usersRef.child((await this.getCurrentUser()).uid);
  }

var user = await getCurrentUserRef()
var _playerEvents = [];

db.collection('player').where('id', isEqualto: user).get().then((doc) => {
   db.collection('player').doc(doc.data().id).collection('events').get().then((snapshot) => {
      snapshot.forEach(doc) {
         _playerEvents.push(doc.data().id);
      }
   });
});

Затем с этим массивом мне нужно получить все событияна основе этих идентификаторов (если они есть)

_playerEvents.forEach(event) {
    db.collection('events').where('id', isEqualTo: event).get().then((doc) => {
         //somehow popular a Map or JSON that I can show in a list view on the page for the events associated with that player
         List_Item for display
    });
}

Вот несколько экранов моей БД.Я учу Флаттер, который использует дротик.Любая помощь будет удивительной.

User Collection

Player Collection

Events Collection

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

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

Widget _buildTeamList() {
    return Container(
      child: Center(
        child: StreamBuilder(
            stream: Firestore.instance
                .collection('teams')
                .where("players", arrayContains: user['player_id'])
                .snapshots(),
            builder: (context, snapshot) {
              if (!snapshot.hasData) return const Text('Loading...');
              return ListView.builder(
                itemCount: snapshot.data.documents.length,
                itemBuilder: (context, index) =>
                    _buildTeamItem(context, snapshot.data.documents[index]),
              );
            }),
      ),
    );
  }

Это сработало очень хорошо.

0 голосов
/ 14 декабря 2018

Я не очень знаком с флаттером, поэтому не могу помочь вам с кодами.

Но чтобы подтолкнуть вас по правильному пути:

Firestore асинхронный.Таким образом, чтобы сделать все ваши 4 шага выше, вы должны сделать их с обратными вызовами.

Я не думаю, что вы можете каскадировать запросы таким образом (если это похоже на Java, вы не можете сделать это).

Что вам нужно сделать, это ввести обратные вызовы после каждого запросасделано, чтобы у вас было достаточно информации для выполнения следующего запроса.

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