Flutter / Firebase: как я могу получить доступ к текущему пользователю без использования функции «.then (...)» - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь избежать использования функции .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);
});

1 Ответ

0 голосов
/ 07 июня 2018
  DatabaseReference getCurrentUserRef() async {
    return this.usersRef.child((await this.getCurrentUser()).uid); =
  }

, чем звонить

var ref = await getCurrentUserRef()

Чуть более симпатично

  DatabaseReference getCurrentUserRef() async {
    var firebaseUser = await this.getCurrentUser();
    return this.usersRef.child(firebaseUser.uid); 
  }

РЕДАКТИРОВАТЬ: уточнить некоторые вопросы об асинхронности

Как бы вы назвали эту функцию сейчас, чтобы получить ссылку?

Допустим, вы хотите обновить данные о пользователе, вы можете сделать

Firestore.instance.runTransaction((transaction) async {
  var reference = await getCurrentUserRef();
  await transaction.set(reference, someData);
  });

Или вы хотели бы прочитать данныеиз этой ссылки

readAndProcessData() async {
  var reference = await getCurrentUserRef();
  DocumentSnapshot user = await reference.get();
  print(user.data.toString);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...