首页 > 解决方案 > await 函数不返回值

问题描述

我已经创建了函数 get user 并从 firestore 设置了它的数据,这是函数 getUser 的代码。

  Future<User> getUser(String uid) async{
    User user;
    _firestore
        .collection(USERS_COLLECTION)
        .where("uid", isEqualTo: uid.toString())
        .getDocuments()
        .then((doc) {
      _firestore
          .document('/$USERS_COLLECTION/${doc.documents[0].documentID}')
          .get()
          .then((userData) {

        user = User(
          name: userData.data["name"],
          username: userData.data["username"],
          profilePhoto: userData.data["profilePic"],
        );


      }).catchError((e) {
        print(e);
      });
    });

    return user;

  }

然后我有我的个人资料页面,我创建了将用户从 getUser() 设置为当前用户的函数,如下所示:

User me;
String myUID = "t4skPFRXcLPxAWvhHpaiPOfsrPI3";

    @override
      void initState() {
        super.initState();
        setUser();
      }
         ......

Future<void> setUser() async{
    me = await userManagment.getUser(myUID);
  }

但是,当我尝试使用 print 例如 print(me.name) 没有任何事情发生时,当我尝试将 networkImage 的 url 设置为 me.profilePhoto 时出现错误,告诉我 url 它为空。

标签: flutterandroid-studiodartgoogle-cloud-firestore

解决方案


不要混合 async-await 和 .then 语法。这是可以做到的,但它更可能是混淆而不是帮助。将 async 修饰符添加到您的函数没有任何作用,因为您的函数不使用 await。

考虑以下选项:

用 .then

Future<User> getUser(String uid) {
    return _firestore
        .collection(USERS_COLLECTION)
        .where("uid", isEqualTo: uid.toString())
        .getDocuments()
        .then((doc) {
      return _firestore
          .document('/$USERS_COLLECTION/${doc.documents[0].documentID}')
          .get()
          .then((userData) {

        return User(
          name: userData.data["name"],
          username: userData.data["username"],
          profilePhoto: userData.data["profilePic"],
        );


      }).catchError((e) {
        print(e);
      });
    });
  }

使用异步等待

Future<User> getUser(String uid) async{
    User user;

    try{
    var doc = await _firestore
        .collection(USERS_COLLECTION)
        .where("uid", isEqualTo: uid.toString())
        .getDocuments();
    
    var userData = await _firestore
          .document('/$USERS_COLLECTION/${doc.documents[0].documentID}')
          .get();

    user = User(
          name: userData.data["name"],
          username: userData.data["username"],
          profilePhoto: userData.data["profilePic"],
        );
    }
    catch(e) {
      print(e);
    }
    return user;

  }

推荐阅读