flutter - 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 它为空。
解决方案
不要混合 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;
}
推荐阅读
- node.js - 关闭终端后,节点版本总是回来
- java - 如何实例化 EntityManager(无法构建 Hibernate SessionFactory)
- python - 在数据框列中使用 beautifulsoup 从网站获取列表
- hyperledger-fabric - 创世块生成:无法创建通道组:无法创建排序者组:向排序者组添加策略时出错:未定义策略
- apache-spark - 如何在 Scala 中序列化字符串
- android - 需要有关未找到证书路径的信任锚的更多信息错误
- javascript - 表格提交前重新格式化日期
- java - 我想制作一个 Android API 以在主屏幕上保持屏幕唤醒
- mysql - 如何在 sparql 查询中遍历图?
- angular - 如何在 Redux 中处理 Odata?