Firebase 如何等待异步函数完成执行,然后在flift中呈现小部件
在main.dart文件中,我想检查用户是否已登录,以便将其引导到相应的屏幕。我正在使用SharedReference存储Firebase中的用户详细信息。 我如何告诉我的函数等到SharedReference异步函数完成执行后才能呈现适当的小部件 下面是我的代码Firebase 如何等待异步函数完成执行,然后在flift中呈现小部件,firebase,flutter,dart,async-await,Firebase,Flutter,Dart,Async Await,在main.dart文件中,我想检查用户是否已登录,以便将其引导到相应的屏幕。我正在使用SharedReference存储Firebase中的用户详细信息。 我如何告诉我的函数等到SharedReference异步函数完成执行后才能呈现适当的小部件 下面是我的代码 Widget _gotoHomeScreen() { AuthService.getuserPrefEmail().then((email) { print(email); AuthService.email = em
Widget _gotoHomeScreen() {
AuthService.getuserPrefEmail().then((email) {
print(email);
AuthService.email = email;
if (email == null) {
return LoginScreen();
} else {
AuthService.uid = email;
return HomeMenuScreen();
}
});
}您不必等待构建,您应该构建一些东西,向用户显示应用程序正在加载一些东西(或空白屏幕),然后在功能结束时重新构建 您可以在创建小部件时将小部件变量设置为默认值,例如使用
循环ProgressIndicator
,然后使用setState进行更改,如下所示:
class YourWidgetState extends State<YourWidget> {
Widget _body = CircularProgressIndicator(); // Default Body
@override
void initState(){
_gotoHomeScreen();
}
@override
Widget build(BuildContext context){
return _body;
}
Widget _gotoHomeScreen() {
AuthService.getuserPrefEmail().then((email){
AuthService.email = email;
if (email == null) {
setState(() => _body = LoginScreen());
} else {
AuthService.uid = email;
setState(() => _body = HomeMenuScreen());
}
});
}
}
bool loading = true;
@override
Widget build(BuildContext context){
if(loading) return CircularProgressIndicator();
if(AuthService.email == null)
return LoginScreen();
else
return HomeMenuScreen();
}
Widget _gotoHomeScreen() {
AuthService.getuserPrefEmail().then((email){
AuthService.email = email;
if (email != null) {
AuthService.uid = email;
}
setState((){ loading = false; });
});
}
使用一个简单的FutureBuilder
FutureBuilder(
future:AuthService.getuserPrefEmail(),
生成器:(BuildContext上下文,异步快照){
交换机(快照.连接状态){
案例连接状态.active:
案例连接状态。正在等待:
返回循环ProgressIndicator();
案例连接状态。完成:
if(snapshot.hasError){
返回文本('Error:${snapshot.Error}');
}
..在这里发送到您的屏幕或按您的意愿进行设置
}
},
)
谢谢@george你救了我一天我觉得这个答案更好地概括了这个问题。
FutureBuilder<Email>(
future: AuthService.getuserPrefEmail(),
builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.active:
case ConnectionState.waiting:
return CircularProgressIndicator();
case ConnectionState.done:
if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
}
.... here route to your screen or set it how you want
}
},
)