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

djalmafreestyler

我的第一个屏幕是登录屏幕,它需要检查用户是否已登录才能直接打开主屏幕,但是使用此检查却出现错误。

我正在检查initState,条件返回的是true,所以看起来问题出在导航器上。

如果用户已登录,跳过第一个屏幕的正确方法是什么?

错误:

I/flutter (20803): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter (20803): The following assertion was thrown building Navigator-[GlobalObjectKey<NavigatorState>
I/flutter (20803): _WidgetsAppState#8ce27](dirty, state: NavigatorState#db484(tickers: tracking 2 tickers)):
I/flutter (20803): 'package:flutter/src/widgets/navigator.dart': Failed assertion: line 2106 pos 12: '!_debugLocked':
I/flutter (20803): is not true.
I/flutter (20803): Either the assertion indicates an error in the framework itself, or we should provide substantially
I/flutter (20803): more information in this error message to help you determine and fix the underlying cause.

码:

class LoginScreen extends StatefulWidget {
  @override
  _LoginScreenState createState() => _LoginScreenState();
}

class _LoginScreenState extends State<LoginScreen> {


  final _emailController = TextEditingController();
  final _passController = TextEditingController();

  final _formKey = GlobalKey<FormState>();
  final _scaffoldKey = GlobalKey<ScaffoldState>();

  @override
  void initState() {
    super.initState();

    if(FirebaseAuth.instance.currentUser() != null){

      Navigator.of(context).pushReplacement(MaterialPageRoute(
        builder: (context) => HomeScreen()
      ));
    }

  }


  @override
  Widget build(BuildContext context) {

    return Scaffold(
      key: _scaffoldKey,
      body: ScopedModelDescendant<UserModel>(
          builder: (context, child, model){

            if(model.isLoading)
              return Center(
                child: CircularProgressIndicator(),
              );

            return Form(
              key: _formKey,
              child: ListView(
                padding: EdgeInsets.all(16),
                children: <Widget>[
                  SizedBox(height: 67),
                  Icon(Icons.chrome_reader_mode, size: 150, color: Colors.blue,),
                  SizedBox(height: 16,),
                  TextFormField(
                    controller: _emailController,
                    decoration: InputDecoration(
                        hintText: "Digite seu e-mail",
                        border: OutlineInputBorder(
                            borderRadius: BorderRadius.circular(10),
                        ),
                      fillColor: Colors.blueAccent
                    ),
                    keyboardType: TextInputType.emailAddress,
                    validator: (text){
                      if(text.isEmpty || !text.contains("@"))
                        return "E-mail inválido!";
                    },
                  ),
                  SizedBox(height: 16,),
                  TextFormField(
                    controller: _passController,
                    decoration: InputDecoration(
                        hintText: "Digite sua senha",
                        border: OutlineInputBorder(
                          borderRadius: BorderRadius.circular(10),
                        ),
                        fillColor: Colors.blueAccent
                    ),
                    obscureText: true,
                    validator: (text){
                      if(text.isEmpty || text.length < 6)
                        return "Digite a senha!";
                    },
                  ),
                  SizedBox(height: 16,),
                  FlatButton(
                    padding: EdgeInsets.all(13),
                    shape: RoundedRectangleBorder(
                        borderRadius: BorderRadius.circular(10)
                    ),
                    color: Colors.blue,
                      child: Text("Entrar",
                        style: TextStyle(
                          color: Colors.white,
                          fontSize: 20
                        ),
                      ),
                      onPressed: (){

                          if(_formKey.currentState.validate()){

                            model.signIn(

                              email: _emailController.text,
                              pass: _passController.text,
                              onSuccess: _onSuccess,
                              onFail: _onFail,

                            );

                          }


                      },
                  ),
                  SizedBox(height: 10,),
                  InkWell(
                    onTap: (){

                      if(_emailController.text.isEmpty || !_emailController.text.contains("@")){

                        _scaffoldKey.currentState.showSnackBar(
                            SnackBar(content: Text("Insira um e-mail válido para recuperação",
                              style: TextStyle(fontSize: 14),
                            ),
                              backgroundColor: Colors.redAccent,
                              duration: Duration(seconds: 3),
                            )
                        );

                      } else {
                         model.recoverPass(_emailController.text);
                         _scaffoldKey.currentState.showSnackBar(
                           SnackBar(
                             content: Text("O e-mail de recuperação foi enviado!",
                               style: TextStyle(fontSize: 14),
                             ),
                             backgroundColor: Colors.green,
                             duration: Duration(seconds: 3),
                           )
                         );
                      }

                    },
                    child: Text("Esqueci minha senha",
                      style: TextStyle(
                          color: Colors.black,
                          fontSize: 16,
                          fontWeight: FontWeight.w400
                      ),
                      textAlign: TextAlign.center,

                    ),
                  ),
                  SizedBox(height: 30,),
                  InkWell(
                    onTap: (){

                      Navigator.of(context).push(MaterialPageRoute(
                          builder: (context)=> SignUpScreen())
                      );

                    },
                    child: Text("Não tem conta? Cadastre-se!",
                      style: TextStyle(
                        color: Colors.black,
                        fontSize: 16,
                        fontWeight: FontWeight.w600
                      ),
                      textAlign: TextAlign.center,

                    ),
                  ),
                ],
              ),
            );

          },
      ),


    );
  }




}
马科斯(Marcos Boaventura)

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

我将简要介绍如何完成此操作。希望对您有所帮助。但是在我向您解释源代码中有什么问题之前,请先进行说明。

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

您的代码已损坏,因为它currentUser()是一个异步函数,并且在您进行调用时,此函数将返回一个不完整的Future对象,该对象是一个非null的对象。因此,导航pushReplacement器始终被调用,并且由于小部件的状态尚未就绪而崩溃。

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

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类来验证是否有用户登录!

建议您可以将snapshot.connectionState属性与一起使用,switch case以实现更精细的控件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SecureSocial-如果用户已登录,则显示其他主页

来自分类Dev

如果用户通过Firebase登录,如何显示其他页面

来自分类Dev

如何检查用户是否已登录以及是否未重定向到登录屏幕

来自分类Dev

Node.js检查其他用户是否已登录

来自分类Dev

如何检查是否已登录的用户列表?

来自分类Dev

如何检查用户是否已登录

来自分类Dev

如何检查是否已登录用户(使用JSTL <if>语句)并显示用户名?

来自分类Dev

如何检查我的Web应用程序的用户是否尝试使用其他凭据登录?

来自分类Dev

如何检查我的Web应用程序的用户是否尝试使用其他凭据登录?

来自分类Dev

如何查看已登录用户的其他信息?

来自分类Dev

在Treeline中,如何检查当前用户是否已登录?

来自分类Dev

如何检查当前用户是否已登录android

来自分类Dev

如何检查用户是否已登录Swift中的Google帐户?

来自分类Dev

如何检查当前用户是否已登录android

来自分类Dev

如果我要使用的用户名未在登录屏幕上列出,如何在ubuntu 12.04中启用“其他用户”登录?

来自分类Dev

在C#中,如果登录身份帐户是非管理员用户,如何停止/启动/检查是否已注册?

来自分类Dev

何时检查用户是否已登录?

来自分类Dev

Steamworks检查用户是否已登录

来自分类Dev

检查用户是否已登录laravel 4

来自分类Dev

Microsoft HPC:检查用户是否已登录

来自分类Dev

codeigniter钩子,以检查用户是否已登录

来自分类Dev

检查用户是否已登录laravel 4

来自分类Dev

php检查用户当前是否已登录

来自分类Dev

Spring Security:检查数据库中的其他字段是否为false,并通知用户如果未启用则为什么他无法登录

来自分类Dev

如何使用“ Google登录”检查用户是否已登录(OAuth 2.0)

来自分类Dev

如果用户已登录,如何告诉网页?

来自分类Dev

如何检查哪些用户已登录

来自分类Dev

如果已发送该表单(在通过iFrame显示的其他网站上),请允许用户继续

来自分类Dev

Laravel:检查当前是否有其他用户登录

Related 相关文章

  1. 1

    SecureSocial-如果用户已登录,则显示其他主页

  2. 2

    如果用户通过Firebase登录,如何显示其他页面

  3. 3

    如何检查用户是否已登录以及是否未重定向到登录屏幕

  4. 4

    Node.js检查其他用户是否已登录

  5. 5

    如何检查是否已登录的用户列表?

  6. 6

    如何检查用户是否已登录

  7. 7

    如何检查是否已登录用户(使用JSTL <if>语句)并显示用户名?

  8. 8

    如何检查我的Web应用程序的用户是否尝试使用其他凭据登录?

  9. 9

    如何检查我的Web应用程序的用户是否尝试使用其他凭据登录?

  10. 10

    如何查看已登录用户的其他信息?

  11. 11

    在Treeline中,如何检查当前用户是否已登录?

  12. 12

    如何检查当前用户是否已登录android

  13. 13

    如何检查用户是否已登录Swift中的Google帐户?

  14. 14

    如何检查当前用户是否已登录android

  15. 15

    如果我要使用的用户名未在登录屏幕上列出,如何在ubuntu 12.04中启用“其他用户”登录?

  16. 16

    在C#中,如果登录身份帐户是非管理员用户,如何停止/启动/检查是否已注册?

  17. 17

    何时检查用户是否已登录?

  18. 18

    Steamworks检查用户是否已登录

  19. 19

    检查用户是否已登录laravel 4

  20. 20

    Microsoft HPC:检查用户是否已登录

  21. 21

    codeigniter钩子,以检查用户是否已登录

  22. 22

    检查用户是否已登录laravel 4

  23. 23

    php检查用户当前是否已登录

  24. 24

    Spring Security:检查数据库中的其他字段是否为false,并通知用户如果未启用则为什么他无法登录

  25. 25

    如何使用“ Google登录”检查用户是否已登录(OAuth 2.0)

  26. 26

    如果用户已登录,如何告诉网页?

  27. 27

    如何检查哪些用户已登录

  28. 28

    如果已发送该表单(在通过iFrame显示的其他网站上),请允许用户继续

  29. 29

    Laravel:检查当前是否有其他用户登录

热门标签

归档