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

Posted

技术标签:

【中文标题】Firestore,Flutter,Async:方法不等待异步方法完成【英文标题】:Firestore, Flutter, Async: Method not waiting for async method to finish 【发布时间】:2021-06-27 01:21:46 【问题描述】:

我正在构建一个使用 API 获取加密货币价格的 Flutter 应用。我将我的 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);
  

【问题讨论】:

【参考方案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 result;
  

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于Firestore,Flutter,Async:方法不等待异步方法完成的主要内容,如果未能解决你的问题,请参考以下文章

Flutter Firebase 上传多张图片

使用 useEffect() Hook 和 Async/Await 从 Firebase/Firestore 获取数据

Flutter Firestore:从 Firestore 中检索数据并在 Flutter 中显示为小部件

从 Flutter 移动应用程序调用 Firestore 是不是安全?

无法从 Firestore 文档中删除字段 (Flutter)

Flutter/cloud-firestore“任务已经完成”异常