开发者问题收集

Firestore、Flutter、Async:方法不等待异步方法完成

2021-03-31
670

我正在构建一个 Flutter 应用,该应用使用 API 来获取加密货币价格。我将 API 密钥存储在 Firestore 数据库中,目前我可以从 Firestore 检索 API 密钥以在我的应用中使用。我遇到的问题是,当运行 buildURL() 时,它不会等待 String apiKey = await getApiKey(); 完全完成就继续,导致 apiKeybuildURL() 打印为 Null。

我在 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=$periodValue&apikey=$apiKey';
    print("Api Key from buildURL():");
    print(apiKey);
  }
}
3个回答

您未从 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"];
    });
  }
Rishi Saraf
2021-03-31

你介意尝试一下吗

  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 result;
  }
Sam Chan
2021-03-31

为了等待函数,它需要是一个异步函数。 需要将 asyncawait 添加到 getApiKey() 才能等待该函数。

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