如何在登录期间检查用户并将其发送到不同的主页

Posted

技术标签:

【中文标题】如何在登录期间检查用户并将其发送到不同的主页【英文标题】:How to check user during logging in and send them to different homepages 【发布时间】:2021-12-10 19:51:56 【问题描述】:

我目前正在使用 Firebase 为一个项目开发 Flutter 应用程序。这是我第一次尝试 Flutter,我遇到了根据用户类型将用户发送到不同主页的问题。例如,管理员用户将被发送到管理员主页,客户用户将被发送到客户主页等。

我当前的登录代码确实允许我登录用户,但他们都被发送到客户的主页,因为我真的不知道如何实现一种方法来检查登录期间的用户类型。我通过不同的集合和唯一的 id 来区分 Cloud Firestore 中的用户; “uid”代表用户,“aid”代表机构。

我想我可以使用此代码,但我不知道如何将它与我的登录代码放在一起:

  Future<String> checkBothUserBasesForTheUser(String uid) async 
    DocumentSnapshot _userDoc =
        await FirebaseFirestore.instance.collection('users').doc(uid).get();
    if (_userDoc.exists) return 'users';
    DocumentSnapshot _agencyDoc =
        await FirebaseFirestore.instance.collection('agencies').doc(uid).get();
    if (_agencyDoc.exists)
      return 'agencies';
    else
      return 'null';
  

当前登录代码:

    final loginButton = Material(
      elevation: 5,
      borderRadius: BorderRadius.circular(30),
      color: Color(0xFF003893),
      child: MaterialButton(
          padding: EdgeInsets.fromLTRB(20, 15, 20, 15),
          minWidth: 300,
          onPressed: () 
            signIn(emailController.text, passwordController.text);
          ,
          child: Text(
            "Login",
            textAlign: TextAlign.center,
            style: TextStyle(
                fontSize: 16, color: Colors.white, fontWeight: FontWeight.bold),
          )),
       );
  
  void signIn(String email, String password) async 
    if (_formKey.currentState!.validate()) 
      await _auth
          .signInWithEmailAndPassword(email: email, password: password)
          .then((_userDoc) => 
                Fluttertoast.showToast(
                    timeInSecForiosWeb: 2,
                    gravity: ToastGravity.CENTER,
                    msg: "Login Successful"),
                Navigator.of(context).pushReplacement(
                    MaterialPageRoute(builder: (context) => UserMainpage())),
              )
          .catchError((e) 
        Fluttertoast.showToast(
          timeInSecForIosWeb: 3,
          gravity: ToastGravity.CENTER,
          msg: "The email or password is invalid. Please check and try again.",
        );
      );
    
  

有没有其他方法可以在登录时检查用户类型并将其发送到各自的主页?

【问题讨论】:

【参考方案1】:

signInWithEmailAndPassword 方法返回一个UserCredential 结构,其中包含一个User 类型。此用户类型似乎包含一个名为 uid 的属性,您可以将其传递给您的 checkBothUserBasesForTheUser 函数以检查它是什么类型的用户。

编辑:

那么,我相信你应该使用类似checkBothUserBasesForTheUser(_userDoc.User.uid) 的方式调用你的方法,并根据返回值重定向到一个页面或另一个页面。

我没有办法测试这段代码,但这样的事情应该会给你一个想法(还要注意可能有一些语法错误):

void signIn(String email, String password) async 
    if (_formKey.currentState!.validate()) 
      await _auth
          .signInWithEmailAndPassword(email: email, password: password)
          .then((_userDoc) => 
              checkBothUserBasesForTheUser(_userDoc.User.uid)
              .then((result) => 
                  if(result == "users")
                        Fluttertoast.showToast(
                        timeInSecForIosWeb: 2,
                        gravity: ToastGravity.CENTER,
                        msg: "Login Successful"),
                        Navigator.of(context).pushReplacement(MaterialPageRoute(builder: (context) => UserMainpage())),
                    
                    else(result == "agency")
                        Fluttertoast.showToast(
                        timeInSecForIosWeb: 2,
                        gravity: ToastGravity.CENTER,
                        msg: "Login Successful"),
                        Navigator.of(context).pushReplacement(MaterialPageRoute(builder: (context) => AgencyMainpage())),
                    
              )
            )
          .catchError((e) 
        Fluttertoast.showToast(
          timeInSecForIosWeb: 3,
          gravity: ToastGravity.CENTER,
          msg: "The email or password is invalid. Please check and try again.",
        );
      );
    
  

【讨论】:

您好,如何传递 checkBothUserBasesForTheUser 函数?我把checkBothUserBasesForTheUser('uid') 放在.then((_userDoc) 里面,但我不知道checkBothUserBasesForTheUser 是否返回代理,然后重定向到代理主页。 我相信你应该使用checkBothUserBasesForTheUser(_userDoc.User.uid) 之类的东西,并根据返回值重定向到一个页面或另一个页面。 谢谢你,我想我大概明白了!但是,我面临另一个错误,所以如果您愿意,请检查我编写的代码:[***.com/questions/69736055/…. 编辑了我的答案并添加了一些代码。希望它为您指明正确的方向 成功了!非常感谢。

以上是关于如何在登录期间检查用户并将其发送到不同的主页的主要内容,如果未能解决你的问题,请参考以下文章

如何检查用户是否已登录不同的IP /位置

JSP 页面应如何检查身份验证

用户打开应用程序时如何检查 AsyncStorage 并将其保存到道具

如何在进入主页之前验证电子邮件

设置检查节点检查事件

如何在网站访问期间找到用户的位置?