Flutter Firebase Auth返回null,然后返回正确的值

时间:2019-03-14 13:15:59

标签: firebase dart flutter firebase-authentication

我在使用当前用户的ID(UID)时遇到问题。以下代码“有效”,但是在某些情况下,_currentUID在输出正确值之前首先输出“空”。

class _ContactsScreenState extends State<ContactsScreen> {

 String _currentUID;

 @override
 initState() {
   super.initState();
   loadCurrentUser();
 }

 loadCurrentUser() async {
   var currentUID = await _getCurrentUID();
   setState(() {
     this._currentUID = currentUID;
   });
 }

 Future<String> _getCurrentUID() async {
   FirebaseUser user = await FirebaseAuth.instance.currentUser();
   return user.uid;
 }

 @override
 Widget build(BuildContext context) {

   if (_currentUID == null){
     print("current UserID = null");
   } else {
     print("current UserID = $_currentUID");
   }

   return StreamBuilder(
      ...

因此,这实际上工作正常,可以按预期输出结果,但是在检查后,打印输出如下:

flutter: current UserID = null // why is it printing null?
flutter: current UserID = abcd1234abcd //correct

不同寻常的是,这只会在用户第二次访问屏幕时发生。第一次加载屏幕/页面时,它将正确地“仅”输出实际的当前用户ID。当用户返回同一页面时,它将打印当前用户两次(如上所示)。

1 个答案:

答案 0 :(得分:1)

这完全正常。

loadCurrentUser是异步的,因此如果创建了_ContactsScreenState,则将在实例之后的一段时间内完成。只有这样,_currentUID才会被分配。

如果框架在该分配之前调用build,则它将为null。让build仅返回Container或进度指示器(如果为空)是正常的。分配后,build将再次被调用。这次它将不会为空,您可以构建“正常”屏幕。