await 函数不返回值

Posted

技术标签:

【中文标题】await 函数不返回值【英文标题】:await Function does not return a value 【发布时间】:2021-05-06 23:01:06 【问题描述】:

我已经创建了函数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 为空。

【问题讨论】:

这能回答你的问题吗? What is a Future and how do I use it? @ChristopherMoore 我已经完成了您链接中的所有说明,但如果有什么事情我应该告诉我或者我做错了什么事情告诉我。 【参考方案1】:

不要混合使用 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;

  

【讨论】:

以上是关于await 函数不返回值的主要内容,如果未能解决你的问题,请参考以下文章

从 Nodejs 中的 mySQL 获取数据时如何从 Async/await 函数获取返回值

Await 返回 [Function] 而不是值

ES7 async await

ES7 async await

async 与 await

无返回值的异步方法能否不用await