Не удается получить данные Firebase - PullRequest
0 голосов
/ 26 марта 2020

У меня есть проект Flutter, и я использую Firebase. Все работает нормально, я могу читать, писать обновления данных. Однако в одном из моих классов мне нужно получить список одного из моих атрибутов из Firebase:

var accountNames = List<String>();

  _getData(BuildContext context) {
    List<String> accountList = [];

    final accounts = _database.collection('userAccounts').getDocuments().then((snapshot) {
      snapshot.documents.forEach((f) {
          accountNames.add(f['accountName']);
          print(accountNames); //first call
      });
    }); // non_updated_area 
    print(accountNames); //second call
}

Здесь мой первый вызов accountName дает правильный вывод. Однако второй вызов дает null. Я пробовал несколько вариантов, таких как возврат функции List, Widget et c, но не смог достичь обновленного accountNames за пределами non_updated_area.

У вас есть решение для этого?

Спасибо и будьте в безопасности,

Ответы [ 2 ]

1 голос
/ 26 марта 2020

Поскольку getDocuments() является асинхронным, данные вне метода then() будут вызваны перед полным извлечением данных из хранилища.

Вы можете использовать async и await:

 _getData(BuildContext context) async {
    List<String> accountList = [];

    final accounts = await _database.collection('userAccounts').getDocuments();
      accounts.documents.forEach((f) {
          accountNames.add(f['accountName']);
          print(accountNames);
      }); 
    print(accountNames); //second call
}
0 голосов
/ 26 марта 2020

Причина в том, что ваш второй оператор print выполняется до завершения вызова базы данных, поэтому для его печати не было возвращено никаких данных. Не уверен, зачем вам второй отпечаток той же информации, но если вы намереваетесь заменить этот отпечаток какой-то обработкой данных, он там не будет работать. Вам необходимо обработать данные, возвращенные в блоке .then. В качестве альтернативы вам нужно использовать асин * c / await конструкцию в Dart.

ОБНОВЛЕНИЕ Учитывая ваш комментарий:

Ну, моя цель здесь чтобы добраться до обновленного списка accountNames за пределами этой функции. Например. вызывая это из другой функции или виджета. Как я могу передать данные за пределы блока .then?

Есть несколько способов, но самым простым, учитывая ваш код, было бы изменить эту функцию на Future> и использовать инструкцию возврата в блоке .then, что-то вроде:

Future<List<String>> getData(BuildContext context) {
    List<String> accountNames = List<String>();

  _database.collection('userAccounts').getDocuments().then((snapshot) {
      snapshot.documents.forEach((f) {
          accountNames.add(f['accountName']);
      });
      return accountNames;
    });
}

Тогда назовите это как:

var accountNameList = await getData(context);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...