繁体   English   中英

FLUTTER:如何显示用户特定页面?

[英]FLUTTER : How to display user specific Page?

尝试实现特定于用户的登录:登录后,如果用户是类型 A,则应显示不同的主页,如果用户是类型 B,则显示单独的主页。
以下是登录小部件的代码:

class LogInWidget extends StatefulWidget {
  @override
  _LogInWidgetState createState() => _LogInWidgetState();
}

class _LogInWidgetState extends State<LogInWidget> {
  var _formKey = GlobalKey<FormState>();
  bool hide = true;
  bool forgotPassword = false;
  bool isLoginPressed = false;
  final FirebaseAuth _auth = FirebaseAuth.instance;
  final AuthMethods _authMethods = AuthMethods();
  TextEditingController email = TextEditingController();
  TextEditingController password = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return isLoginPressed
        ? Center(
            child: CircularProgressIndicator(),
          )
        : Scaffold(
            backgroundColor: UniversalVariables.blackColor,
            body: Padding(
              padding: EdgeInsets.symmetric(horizontal: 24.0),
              child: ListView(
                children: <Widget>[
                  SizedBox(
                    height: 80,
                  ),
                  !forgotPassword
                      ? Form(
                          key: _formKey,
                          child: Column(
                            mainAxisAlignment: MainAxisAlignment.center,
                            crossAxisAlignment: CrossAxisAlignment.stretch,
                            children: <Widget>[
                              Text(
                                'Sign In',
                                style: TextStyle(
                                    color: Colors.white,
                                    fontSize: 60,
                                    fontWeight: FontWeight.w700),
                                textAlign: TextAlign.center,
                              ),
                              SizedBox(
                                height: 48.0,
                              ),
                              Material(
                                borderRadius: BorderRadius.circular(10.0),
                                elevation: 0.0,
                                color: Colors.white.withOpacity(0.2),
                                child: TextFormField(
                                  cursorColor: Colors.white,
                                  controller: email,
                                  textAlign: TextAlign.center,
                                  keyboardType: TextInputType.emailAddress,
                                  // ignore: missing_return
                                  validator: (String value) {
                                    if (value.isEmpty) {
                                      return "please enter a value";
                                    }
                                  },
                                  style: TextStyle(
                                    color: Colors.white,
                                  ),
                                  decoration: kTextFieldDecoration.copyWith(
                                      hintText: 'Enter your email',
                                      prefixIcon: Icon(Icons.alternate_email,
                                          color: Colors.white)),
                                ),
                              ),
                              SizedBox(
                                height: 8.0,
                              ),
                              Material(
                                borderRadius: BorderRadius.circular(10.0),
                                elevation: 0.0,
                                color: Colors.white.withOpacity(0.2),
                                child: TextFormField(
                                  cursorColor: Colors.white,
                                  controller: password,
                                  textAlign: TextAlign.center,
                                  obscureText: hide,
                                  // ignore: missing_return
                                  validator: (String value) {
                                    if (value.isEmpty) {
                                      return "The password field cannot be empty";
                                    }
                                  },
                                  style: TextStyle(
                                    color: Colors.white,
                                  ),
                                  decoration: kTextFieldDecoration.copyWith(
                                    hintText: 'Enter your password',
                                    prefixIcon: Icon(
                                      Icons.lock_outline,
                                      color: Colors.white,
                                    ),
                                    suffixIcon: IconButton(
                                      icon: Icon(
                                        !hide
                                            ? Icons.remove_red_eye_outlined
                                            : Icons.remove_red_eye,
                                        color: Colors.white,
                                      ),
                                      onPressed: () {
                                        setState(() {
                                          hide = !hide;
                                        });
                                      },
                                    ),
                                  ),
                                ),
                              ),
                              Padding(
                                padding: const EdgeInsets.only(
                                    top: 15, right: 8, bottom: 8),
                                child: InkWell(
                                  onTap: () {
                                    setState(() {
                                      forgotPassword = true;
                                    });
                                  },
                                  child: Text(
                                    'Forgot Password?',
                                    textAlign: TextAlign.right,
                                    style: TextStyle(
                                      color: Colors.white,
                                    ),
                                  ),
                                ),
                              ),
                              SizedBox(
                                height: 18.0,
                              ),
                              Padding(
                                  padding: EdgeInsets.symmetric(vertical: 16.0),
                                  child: Material(
                                    color: Colors.white,
                                    borderRadius: BorderRadius.circular(30.0),
                                    elevation: 2.0,
                                    child: MaterialButton(
                                      onPressed: () async {
                                        if (_formKey.currentState.validate()) {
                                          performLogin();
                                        }
                                      },
                                      minWidth: 200.0,
                                      height: 42.0,
                                      child: Text(
                                        'Sign In',
                                        style: TextStyle(color: Colors.black),
                                      ),
                                    ),
                                  )),
                              Padding(
                                padding: const EdgeInsets.all(8.0),
                                child: Text(
                                  '-OR-',
                                  textAlign: TextAlign.center,
                                  style: TextStyle(
                                    color: Colors.white,
                                  ),
                                ),
                              ),
                              Padding(
                                padding: const EdgeInsets.all(8.0),
                                child: Text(
                                  'sign in with',
                                  textAlign: TextAlign.center,
                                  style: TextStyle(
                                      color: Colors.white,
                                      fontWeight: FontWeight.w600,
                                      fontSize: 17),
                                ),
                              ),
                              googleSignInButton(),
                            ],
                          ))
                      : Column(
                          mainAxisAlignment: MainAxisAlignment.center,
                          crossAxisAlignment: CrossAxisAlignment.stretch,
                          children: [
                            Material(
                              borderRadius: BorderRadius.circular(10.0),
                              elevation: 0.0,
                              color: Colors.white.withOpacity(0.2),
                              child: Form(
                                key: _formKey,
                                child: TextFormField(
                                  // ignore: missing_return
                                  validator: (String value) {
                                    if (value.isEmpty) {
                                      return "please enter a value";
                                    }
                                  },
                                  controller: email,
                                  textAlign: TextAlign.center,
                                  keyboardType: TextInputType.emailAddress,
                                  style: TextStyle(
                                    color: Colors.white,
                                  ),
                                  decoration: kTextFieldDecoration.copyWith(
                                      hintText: 'Enter your email',
                                      prefixIcon: Icon(Icons.alternate_email,
                                          color: Colors.white)),
                                ),
                              ),
                            ),
                            SizedBox(
                              height: 18.0,
                            ),
                            Padding(
                                padding: EdgeInsets.symmetric(vertical: 16.0),
                                child: Material(
                                  color: Colors.white,
                                  borderRadius: BorderRadius.circular(30.0),
                                  elevation: 2.0,
                                  child: MaterialButton(
                                    onPressed: () async {
                                      if (_formKey.currentState.validate()) {
                                        ForgotPassword();
                                      }
                                    },
                                    minWidth: 200.0,
                                    height: 42.0,
                                    child: Text(
                                      'Continue',
                                      style: TextStyle(color: Colors.black),
                                    ),
                                  ),
                                )),
                            Padding(
                              padding: const EdgeInsets.only(
                                  top: 15, right: 8, bottom: 8),
                              child: Center(
                                child: InkWell(
                                  onTap: () {
                                    setState(() {
                                      forgotPassword = false;
                                    });
                                  },
                                  child: Text(
                                    'Sign In',
                                    textAlign: TextAlign.right,
                                    style: TextStyle(
                                      color: Colors.white,
                                    ),
                                  ),
                                ),
                              ),
                            ),
                          ],
                        ),
                ],
              ),
            ));
  }

  // ignore: non_constant_identifier_names
  void ForgotPassword() async {
    setState(() {
      isLoginPressed = true;
    });
    try {
      await _auth.sendPasswordResetEmail(email: email.text);
      setState(() {
        isLoginPressed = false;
      });
      Fluttertoast.showToast(
          msg: 'email sent successfully!!',
          textColor: Colors.black,
          backgroundColor: Colors.white);
      showSuccessDialog(context, "email Sent",
          'An email has been sent to your registered email id for resetting password',
          () {
        setState(() {
          forgotPassword = false;
        });
        Navigator.pop(context);
      });
    } catch (e) {
      setState(() {
        isLoginPressed = false;
      });
      Fluttertoast.showToast(
          msg: 'Please provide correct email',
          textColor: Colors.black,
          backgroundColor: Colors.white);
      print(e);
    }
  }

  Widget googleSignInButton() {
    return GestureDetector(
      onTap: () {
        performGoogleLogin();
      },
      child: Center(
        child: CircleAvatar(
          radius: 35.0,
          backgroundImage: AssetImage("assets/google.png"),
        ),
      ),
    );
  }

  void performGoogleLogin() async {
    setState(() {
      isLoginPressed = true;
    });

    FirebaseUser user = await _authMethods.signInWithGoogle();

    if (user != null) {
      authenticateUser(user);
    }
    setState(() {
      isLoginPressed = false;
    });
  }

  void performLogin() async {
    setState(() {
      isLoginPressed = true;
    });

    FirebaseUser user = await _authMethods.signIn(email, password);

    if (user != null) {
      authenticateUser(user);
    }
    setState(() {
      isLoginPressed = false;
    });
  }

  void authenticateUser(FirebaseUser user) {
    _authMethods.authenticateUser(user).then((isNewUser) {
      setState(() {
        isLoginPressed = false;
      });

      if (isNewUser) {
        _authMethods.addDataToDb(user).then((value) {
          Navigator.pushReplacement(context,
              MaterialPageRoute(builder: (context) {
            return HomeScreen();
          }));
        });
      } else {
        Navigator.pushReplacement(context,
            MaterialPageRoute(builder: (context) {
          return HomeScreen();
        }));
      }
    });
  }
}

此代码为两个用户显示相同的主页。 如何转换此代码以根据用户显示 2 个不同的主页? 更新:需要检查 firebase 数据库中的一个字段,然后根据字段内的值将它们重定向到不同的页面。

有多种方法可以做到这一点。 我建议使用StreamProvider (来自Provider package ),其中包含用户的 state。 例如,您可以使用枚举:

enum UserState{
    FIREBASE_AUTH,
    GOOGLE
}

当用户使用特定方法登录时,您将一个事件添加到 stream,这将更新提供程序,从而根据 stream 的值更新屏幕。

如果您想在应用程序的其他地方使用用户身份验证状态,我也会采用这种方法,您可以轻松访问它。

请让我知道这是否有帮助或者我误解了你!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM