# #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"]
}