首页 > 解决方案 > 当我打开我的颤振应用程序时,它总是显示登录屏幕几秒钟,即使我已经在上次会话中登录。在那之后主页

问题描述

当我启动我的颤振应用程序时,即使我已经登录,它也会从登录屏幕开始。几秒钟后它会自动打开主页。

我的代码:我的主要构建:-

@override
Widget build(BuildContext context) {

//saveUserInfoToFireStore();
if(isSignedIn)
{
  return buildHomeScreen();
}
else{
  return buildSignInScreen();
}
}

这是我的初始化函数:-

bool isSignedIn = false;
void initState() {
super.initState();

pageController = PageController();

gSignIn.onCurrentUserChanged.listen((gSigninAccount){
  controlSignIn(gSigninAccount);
}, onError:(gError){
  print("Error Message: " +gError);
});

gSignIn.signInSilently(suppressErrors: false).then((gSignInAccount){
  controlSignIn(gSignInAccount);

}).catchError((gError){
  print("Error Message: "+gError); // + gerror
});
}

controlSignIn(GoogleSignInAccount signInAccount) async {
if(signInAccount != null)
  {

     final GoogleSignInAccount gCurrentUser = gSignIn.currentUser;
     DocumentSnapshot documentSnapshot = await usersReference.doc(gCurrentUser.id).get();
     currentUser = User.fromDocument(documentSnapshot);
     setState(() {
       isSignedIn=true;
     });


    configureRealTimePushNotifications();
  }
else{
  setState(() {
    isSignedIn = false;
  });
}
}

登录后,我希望每次打开我的应用程序时它都应该只显示主页,而不是登录页面。

标签: firebasefluttergoogle-cloud-firestorefirebase-authenticationgoogle-signin

解决方案


发生这种情况是因为您正在使用controlSignIn方法来确定用户是否已登录。由于它是一项async功能,因此需要一些时间来确定登录用户。因此,您可以看到登录页面一秒钟,然后是主页。

您可以通过在初始屏幕中检查此逻辑然后导航到适当的页面来解决此问题 - 登录或主页。

创建一个新文件:splash_page.dart. 你SplashPage应该看起来像这样:

class SplashPage extends StatefulWidget {
  @override
  _SplashPageState createState() => _SplashPageState();
}

class _SplashPageState extends State<SplashPage> {
  @override
  void initState() {
    super.initState();
    // your logic to check whether user is signed in or not
    // If user is logged in navigate to HomePage widget
    // Else navigate to SignInPage
  }

  @override
  Widget build(BuildContext context) {
    return const Center(child: CircularProgressIndicator());
  }
}

推荐阅读