【发布时间】:2018-11-16 13:41:03
【问题描述】:
我试图避免在我需要访问当前用户的 UID 的所有代码中使用 .then((u) { return u.uid }) 函数,而只需调用 getCurrentUser().uid 以获得更快的访问速度。但是,它给了我一个错误The getter 'uid' was called on null.,但它不是空的,因为它确实在控制台中打印,但只是在显示它为空并且由于某种原因最后出现错误之后。我对 Future/Async/Await 逻辑不太了解,因此我们将不胜感激!
class UsersAPI {
final DatabaseReference usersRef = FirebaseDatabase.instance.reference().child(Config.users);
Future<FirebaseUser> currentUser() async {
return await FirebaseAuth.instance.currentUser();
}
FirebaseUser getCurrentUser() {
FirebaseUser user;
this.currentUser().then((u) {
user = u;
print('USER 1 $user'); // Prints after 'USER 2'
});
print('USER 2 $user'); // Prints first
if (user != null) {
return user;
} else {
return null;
}
}
DatabaseReference getCurrentUserRef() {
return this.usersRef.child(this.getCurrentUser().uid); // GIVES THE 'uid' WAS CALLED ON NULL ERROR
}
observeCurrentUser(Function onSuccess(User u)) {
this.usersRef.child(this.getCurrentUser().uid).onValue.listen( (event) { // GIVES THE 'uid' WAS CALLED ON NULL ERROR
DataSnapshot snapshot = event.snapshot;
if (snapshot.value != null) {
User user = User().transform(snapshot.key, snapshot.value);
onSuccess(user);
}
});
}
observeUser(String userID, Function onSuccess(User u), Function onFailure(String e)) {
this.usersRef.child(userID).onValue.listen( (e) {
DataSnapshot snapshot = e.snapshot;
if (snapshot.value != null) {
User user = User().transform(snapshot.key, snapshot.value);
onSuccess(user);
} else {
onFailure("User Not Found...");
}
});
}
}
示例用法 - 工作:
APIs().usersAPI.currentUser().then((u) {
APIs().usersAPI.observeUser(u.uid, (u) {
onSuccess(u);
}, (e) {
print(e);
});
});
不起作用:
APIs().usersAPI.observeCurrentUser((u) {
onSuccess(u);
});
【问题讨论】:
-
您需要返回一个
Future<FirebaseUser>并将其用作Future。所以你需要使用then()或await。 -
当我只需要访问其中的内容时,要避免在所有代码中使用
then()。我添加了有效的示例和无效的示例。不起作用的代码是我的目标。尽量减少代码行数。 -
你不能让异步函数神奇地变为异步。如果你调用了一个异步方法并想等待它的结果,整个调用层次就变成了异步的。
-
如果您想减少嵌套/代码行数,您可能需要查看
await。 -
不,但是为什么我的 getCurrentUser() 函数不工作我在那里调用,但直到运行其余代码后才会调用它
标签: firebase dart firebase-authentication flutter