Flutter / Firebase:如何在不使用' .then(...)'的情况下访问当前用户。功能

时间:2018-06-06 18:57:58

标签: firebase dart firebase-authentication flutter

我试图避免在我需要访问当前用户的UID的所有代码中使用.then((u) { return u.uid })函数,而只是通过更快地调用getCurrentUser().uid访问。但是,它给了我一个错误The getter 'uid' was called on null.,但它不是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);
  });
});

DOESN&#39;工作:

APIs().usersAPI.observeCurrentUser((u) {
  onSuccess(u);
});

1 个答案:

答案 0 :(得分:0)

  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);
}