如何让我的flutter代码等待函数完成后再继续



我在找到让代码等待函数完成后再继续的方法时遇到了问题。原因是我需要该函数首先从firebase中检索当前用户,然后再使用该值并决定下一步显示哪个屏幕。

我想让代码工作的方式是检查是否已经有用户登录。如果有,则执行另一次检查,看看该用户的信息是否存在-如果存在,则返回主屏幕,如果没有返回用户信息屏幕。如果当前没有用户登录,则应显示Authenticate(身份验证(屏幕。

class SignedInState extends StatelessWidget {
@override
Widget build(BuildContext context) {
final user = _getCurrentUser();
if (user == null) {
return Authenticate();
} else {
final snapShot = checkifDocumentExists(user);
if (snapShot == null) {
return UserInformation();
} else {
return Home();
}
}
}
}
Future _getCurrentUser() async {
final user = await FirebaseAuth.instance.currentUser();
print(user);
print(user.toString());
return user;
}

这是我第一次在这里发帖,所以如果你需要更多的细节,请告诉我。

我昨天也遇到了同样的问题。我找到了使用final user = Provider.of<User>(context);的解决方案。因此,如果您在身份验证后创建了一个User对象,您也可以使用它。

_getCurrentUser不能在生成方法中。事实上,禁止在构建方法中插入或调用任何方法,根据文档,构建方法应该只接收小部件。

为此,必须调用initState方法中的函数:

class SignedInState extends StatefulWidget {
@override
_SignedInStateState createState() => _SignedInStateState();
}
class _SignedInStateState extends State<SignedInState> {
var user; // made user acessible to all class
bool hasData = false;
@override
void initState() {
super.initState();
// call method when build is done
SchedulerBinding.instance.addPostFrameCallback((_) => _getCurrentUser());
}
Future _getCurrentUser() async {
user = await FirebaseAuth.instance.currentUser();
setState(() {
hasData = true;
});
}
@override
Widget build(BuildContext context) {
if (!hasData) {
return Container();
} else if (user == null && hasData) {
return Authenticate();
} else {
final snapShot = checkifDocumentExists(user);
if (snapShot == null) {
return UserInformation();
} else {
return Home();
}
}
}
}

最新更新