Firestore, Flutter, Асинхронный: Метод, не ожидающий завершения асинхронного метода

# #firebase #flutter #asynchronous #google-cloud-firestore #async-await

Вопрос:

Я создаю приложение Flutter, которое использует API для получения цен на криптовалюту. Я сохранил свой ключ API в базе данных Firestore, и в настоящее время я могу извлечь ключ API из Firestore для использования в своем приложении. Проблема, с которой я сталкиваюсь, заключается в том, что при buildURL() запуске он не ждет String apiKey = await getApiKey(); полного завершения, прежде чем продолжить, в результате apiKey чего будет напечатан как Null from buildURL() .

Я добавил инструкции печати внутри getApiKey() и buildURL() для отслеживания значения apiKey , и кажется, что инструкции печати buildURL() выполняются до инструкций печати getApiKey() .

 I/flutter ( 2810): Api Key from buildURL():
I/flutter ( 2810): null
I/flutter ( 2810): Api Key from getApiKey():
I/flutter ( 2810): 123456789
 

  import 'package:cloud_firestore/cloud_firestore.dart';

class URLBuilder {
  URLBuilder(this.cryptoCurrency, this.currency, this.periodValue);

  String cryptoCurrency;
  String currency;
  String periodValue;

  String _pricesAndTimesURL;
  String get pricesAndTimesURL => _pricesAndTimesURL;

  getApiKey() {
    FirebaseFirestore.instance
        .collection("myCollection")
        .doc("myDocument")
        .get()
        .then((value) {
      print("Api Key from getApiKey():");
      print(value.data()["Key"]);
      return value.data()["Key"];
    });
  }

  buildURL() async {
    String apiKey = await getApiKey();
    _pricesAndTimesURL =
        'XXXXX/XXXXX/$cryptoCurrency$currency/ohlc?periods=$periodValueamp;apikey=$apiKey';
    print("Api Key from buildURL():");
    print(apiKey);
  }
}
 

Ответ №1:

Вы не возвращаетесь из функции getApiKey

 getApiKey() {
    return FirebaseFirestore.instance
        .collection("myCollection")
        .doc("myDocument")
        .get()
        .then((value) {
      print("Api Key from getApiKey():");
      print(value.data()["Key"]);
      return value.data()["Key"];
    });
  }
 

Ответ №2:

Не могли бы вы попробовать

   Future<String> getApiKey() async {
  String result=await  FirebaseFirestore.instance
        .collection("myCollection")
        .doc("myDocument")
        .get()
        .then((value) {
      print("Api Key from getApiKey():");
      print(value.data()["Key"]);
      return value.data()["Key"];
    });
   return resu<
  }
 

Ответ №3:

Чтобы дождаться функции, она должна быть асинхронной функцией. Добавление async и await в getApiKey() необходимо для ожидания функции.

  Future<String> getApiKey() async {
    var result = await FirebaseFirestore.instance
        .collection("myCollection")
        .doc("myDocument")
        .get();
    return result.data()["Key"]
  }