Я пытаюсь избежать использования функции .then((u) { return u.uid })
во всем моем коде, где мне нужно получить доступ к 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);
});