Flutter / Dart - Передача / установка переменной вне Firestore docref.get (). Then () {???} - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть простое приложение Flutter, которое преобразует строковое значение, разделенное символами канала ... случайно, это имена песен (например: 'Rudolf | Jingle Bells | White Christmas') в ListView ... с названиями песен, являющимися ListTiles,Длинная история о том, почему я делаю это так ... пожалуйста, потерпите меня.У меня есть коллекция Firestore под названием «наборы», а в наборах у меня есть документ с ключом SET01.Затем в SET01 у меня есть одно поле под названием «песни» ... текстовое поле, содержащее песни, разделенные трубами.Я вызываю getSetList (), чтобы получить текстовое поле из Firestore.Кажется, я могу получить значение 'songs' внутри set01DocRef.get (). Then ((снимок) ....

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

Любая помощь очень ценится.

ER

String getSetList () {

String songList = 'Loading.....';
DocumentReference set01DocRef = Firestore.instance.collection('sets').document('SET01');

set01DocRef.get().then((snapshot){
  print('String songList inside .then() before assignment:  ' + songList);     //Wagon Wheel|Her Diamonds|Waterfalls
  print('Snapshot value of songs:  ' + snapshot['songs']);         //Wagon Wheel|Her Diamonds|Waterfalls
  songList = snapshot['songs'];     
  print('String songList inside .then() after assignment:  ' + songList);     //Wagon Wheel|Her Diamonds|Waterfalls
});

print('Bueller? Bueller??');
print('String songList outside of .then():  ' + songList);                  

return songList;
}

Вывод:

flutter: Bueller? Bueller??
flutter: String songList outside of .then():  Loading.....
Reloaded 0 of 424 libraries in 442ms.
flutter: String songList inside .then() before assignment:  Loading.....
flutter: Snapshot value of songs:  Wagon Wheel|Her Diamonds|Waterfalls
flutter: String songList inside .then() after assignment:  Wagon Wheel|Her Diamonds|Waterfalls

** Функция пропускает сразу после .get () и немедленного возврата ... Я знаю, что это, вероятно, связано с принуждением системы ждать, пока это значение вернется из FS ... но я незнать, как справиться с этим.

1 Ответ

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

Это ожидаемое поведение для блока then(): код внутри этого блока вызывается асинхронно после загрузки данных, поэтому код вызова, требующий данных, должен находиться внутри блока then().

К счастью, у Dart есть ключевое слово await, чтобы упростить эту задачу.По сути, он заменяет блок then():

Future<String> getSetList () async {
  String songList = 'Loading.....';
  DocumentReference set01DocRef = 
  Firestore.instance.collection('sets').document('SET01');

  snapshot = await set01DocRef.get();
  print('String songList inside .then() before assignment:  ' + songList);     
  //Wagon Wheel|Her Diamonds|Waterfalls
  print('Snapshot value of songs:  ' + snapshot['songs']);         //Wagon 
  Wheel|Her Diamonds|Waterfalls
  songList = snapshot['songs'];     
  print('String songList inside .then() after assignment:  ' + songList);     
  //Wagon Wheel|Her Diamonds|Waterfalls

  print('Bueller? Bueller??');
  print('String songList outside of .then():  ' + songList);  
  return songList;
}

Обратите внимание, что при любых вызовах getSetList() теперь также необходимо использовать await:

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