我在使用当前用户的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。当用户返回同一页面时,它将打印当前用户两次(如上所示)。
答案 0 :(得分:1)
这完全正常。
loadCurrentUser
是异步的,因此如果创建了_ContactsScreenState
,则将在实例之后的一段时间内完成。只有这样,_currentUID
才会被分配。
如果框架在该分配之前调用build
,则它将为null。让build
仅返回Container
或进度指示器(如果为空)是正常的。分配后,build
将再次被调用。这次它将不会为空,您可以构建“正常”屏幕。