You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter基于Firebase Realtime Database实现ID密码登录及数据传递到用户资料页

现有登录代码优化建议

  • 补充密码校验逻辑:当前代码只要匹配到对应ID就直接跳转,没有校验用户输入的密码和数据库存储的密码是否一致,存在严重安全漏洞
  • 增加空值异常处理:如果输入的ID不存在,snapshot.value会返回null,直接调用forEach遍历会触发空指针报错,需要提前做判断
  • 替换.then链式调用为async/await写法:代码可读性更高,更便于处理异常逻辑
  • 增加加载状态提示:用户点击登录按钮后增加Loading弹窗,避免用户重复点击,也能明确告知用户登录操作正在进行
  • 不要在Realtime Database中明文存储密码:后续上线前务必将密码做哈希加密后再存储,避免数据泄露风险

实现用户数据传递到资料页的方案

你只需要给StaffProfile页面增加构造参数接收用户数据,跳转时将获取到的用户信息传入即可,示例如下:
首先修改StaffProfile的代码:

class StaffProfile extends StatelessWidget {
  // 定义接收用户数据的参数
  final Map<dynamic, dynamic> userInfo;
  const StaffProfile({Key? key, required this.userInfo}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      // 页面里直接用userInfo["name"]、userInfo["email"]就能对应展示数据了
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text("姓名:${userInfo["name"]}"),
            Text("邮箱:${userInfo["email"]}"),
            Text("联系电话:${userInfo["contact no"]}"),
          ],
        ),
      ),
    );
  }
}

然后修改登录页的loginfb方法:

void loginfb(String userID, String password) async {
  // 弹出加载提示
  showDialog(
    context: context,
    barrierDismissible: false,
    builder: (context) => const AlertDialog(content: Text("登录中...")),
  );
  try {
    DataSnapshot snapshot = await dataRef.orderByChild("id").equalTo(userID).once();
    // 关闭加载提示
    Navigator.pop(context);
    if (snapshot.value == null) {
      // 提示用户ID不存在
      ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text("该员工ID不存在")));
      return;
    }
    Map<dynamic, dynamic> values = snapshot.value as Map<dynamic, dynamic>;
    values.forEach((key, userData) {
      // 校验密码是否匹配
      if (userData["password"] == password) {
        Navigator.pushReplacement(
          context,
          MaterialPageRoute(
            // 传入用户数据到资料页
            builder: (context) => StaffProfile(userInfo: userData),
          ),
        );
      } else {
        ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text("密码错误")));
      }
    });
  } catch (e) {
    Navigator.pop(context);
    ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("登录失败:${e.toString()}")));
  }
}

内容的提问来源于stack exchange,提问作者rara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 04:54:04