【问题标题】:Flutter: Cannot store Firestore data to local variable (returns null)Flutter:无法将 Firestore 数据存储到局部变量(返回 null)
【发布时间】:2021-03-17 12:48:24
【问题描述】:

我在尝试将数据从 Firestore 存储到局部变量时遇到问题。

class AppUser {
  String _userId;
  Map<String, dynamic> _userData;

  Future getUserDataFromDb() async {  
    _userData = await dbInterface.getFinancialsFromDB(_userId);
    // dbInterface.getFinancialsFromDB(_userId).then((Map<String, dynamic> data) {
    //   _userData = data;
    // });
    print(_userData); // flutter: null
  }
}

_userData 始终返回 null。

class Db {
  CollectionReference financials = FirebaseFirestore.instance.collection('financials');

  Future<Map<String, dynamic>> getFinancialsFromDB(userId) async {
    financials.doc(userId).get().then((DocumentSnapshot documentSnapshot) {
      if (documentSnapshot.exists) {
        print(documentSnapshot.data()); // flutter: {'key1': 'data1', ...}
        return documentSnapshot.data();
      }
    });
    return null;
  }
}

Db dbInterface = Db();

在“getFinancialsFromDB”函数中,它会打印正确的地图。所以问题不在于从 Firestore 中检索数据,而是将其存储在 _userData 变量中。

getUserDataFromDb() 在 initState 中调用。

有什么想法可以解决这个问题吗?如果您需要任何其他信息,请告诉我。

非常感谢,非常感谢任何帮助。

一切顺利,

亚历克斯

【问题讨论】:

    标签: flutter asynchronous dart google-cloud-firestore


    【解决方案1】:

    async 函数中编写代码时,不要使用then。相反,请使用 await 来获取 Future 的结果。

      Future<Map<String, dynamic>> getFinancialsFromDB(userId) async {
        var documentSnapshot = await financials.doc(userId).get();
        if (documentSnapshot.exists) {
          return documentSnapshot.data();
        }
        else {
          return null;
        }
      }
    

    【讨论】:

      猜你喜欢
      • 2023-01-16
      • 1970-01-01
      • 1970-01-01
      • 2023-01-10
      • 2021-04-08
      • 1970-01-01
      • 2020-04-18
      • 2013-04-26
      • 2019-10-01
      相关资源
      最近更新 更多