且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何检查用户是否已登录,如果是,则显示其他屏幕?

更新时间:2023-10-04 12:21:16

好吧,您可以使用另一种方法来解决此类问题.而是检查您的 loginScreen 类中是否有用户登录,您可以在此之前执行此步骤,然后决定是否在没有用户登录的情况下显示 loginScreen 或显示另一个屏幕,我假设是 MainScreen,如果用户已经登录.

Well you can solve this kind of problem using another approach. Instead check if there is user logged inside your loginScreen class you can do this a step before and then decide if you will show the loginScreen if there is no user logged or show another screen, MainScreen I' am supposing, if the user is already logged.

我会放一些 snipet 来展示如何做到这一点.我希望它有帮助.但在我解释你的源代码有什么问题之前.

I will put some snipet showing how to accomplish this. I hope it helps. But before I will explain you what is wrong in your source code.

if(FirebaseAuth.instance.currentUser() != null){
      // wrong call in wrong place!
      Navigator.of(context).pushReplacement(MaterialPageRoute(
        builder: (context) => HomeScreen()
      ));
}

你的代码被破坏了,因为 currentUser() 是一个异步函数,当你调用这个函数时,它返回一个不完整的 Future 对象,它是一个非空对象.所以导航器 pushReplacement 总是被调用并且它崩溃了,因为你的小部件的状态还没有准备好.

Your code is broken because currentUser() is a async function and when you make the call this function is returning a incomplete Future object which is a non null object. So the navigator pushReplacement is always been called and it's crashing because the state of your widget is not ready yet.

作为解决方案,您可以使用 FutureBuilder 并决定您将打开哪个屏幕.

Well as solution you can user FutureBuilder and decide which screen you will open.

int main(){
   runApp(  YourApp() )
}

class YourApp extends StatelessWidget{

    @override
    Widget build(BuildContext context){
        return FutureBuilder<FirebaseUser>(
            future: FirebaseAuth.instance.currentUser(),
            builder: (BuildContext context, AsyncSnapshot<FirebaseUser> snapshot){
                       if (snapshot.hasData){
                           FirebaseUser user = snapshot.data; // this is your user instance
                           /// is because there is user already logged
                           return MainScreen();
                        }
                         /// other way there is no user logged.
                         return LoginScreen();
             }
          );
    }
}

使用这种方法可以避免使用 LoginScreen 类来验证是否有用户登录!

Using this approach you avoid your LoginScreen class to verify if there is a user logged!

建议您可以使用 snapshot.connectionState 属性和 switch case 来实现更精细的控制.

As advise you can make use of snapshot.connectionState property with a switch case to implement a more refined control.