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

Flutter Firebase应用:登录登出时间一致及用户信息缺失问题

问题1:登录与登出时间记录错误

问题根源

登录时同时给login和logout字段设置了当前UTC时间,登出操作又没更新logout字段,只往authActivity数组添加记录,导致登录后两个时间完全一致,登出后logout字段也没变化。

修复方案

  • 调整登录逻辑:登录时只初始化login字段为当前UTC时间,logout字段留空或设为null,等登出时再更新。
    示例代码:
    // 登录成功后写入Firestore的逻辑
    await FirebaseFirestore.instance
        .collection('users')
        .doc(user.uid)
        .set({
      'login': DateTime.now().toUtc(),
      'authActivity': FieldValue.arrayUnion([
        {'action': 'login', 'timestamp': DateTime.now().toUtc()}
      ])
      // 移除logout字段的初始化代码
    }, SetOptions(merge: true));
    
  • 修复登出逻辑:登出时更新logout字段为当前UTC时间,同时保留往authActivity加日志的操作(如果需要留存操作记录)。
    示例代码:
    Future<void> logout() async {
      final currentUser = FirebaseAuth.instance.currentUser;
      if (currentUser != null) {
        // 先更新Firestore的登出时间
        await FirebaseFirestore.instance
            .collection('users')
            .doc(currentUser.uid)
            .update({
          'logout': DateTime.now().toUtc(),
          'authActivity': FieldValue.arrayUnion([
            {'action': 'logout', 'timestamp': DateTime.now().toUtc()}
          ])
        });
        // 再执行Firebase登出
        await FirebaseAuth.instance.signOut();
      }
    }
    
问题2:用户信息(全名、ID、Compound等)未正确保存

问题根源

FullNamecontroller等文本控制器没有和对应的输入控件绑定,导致获取的输入值为空,写入Firestore时自然没有有效数据。

修复方案

  • 绑定控制器与输入框:确保每个输入控件都关联对应的TextEditingController。
    示例代码:
    // 定义控制器
    final fullNameController = TextEditingController();
    final idController = TextEditingController();
    final compoundController = TextEditingController();
    
    // 输入控件绑定示例
    TextField(
      controller: fullNameController,
      decoration: const InputDecoration(labelText: '全名'),
    ),
    TextField(
      controller: idController,
      decoration: const InputDecoration(labelText: '用户ID'),
    ),
    TextField(
      controller: compoundController,
      decoration: const InputDecoration(labelText: 'Compound'),
    ),
    
  • 登录时写入用户信息:登录成功后,把控制器中的文本值写入Firestore,建议先做非空校验(可选)。
    示例代码:
    await FirebaseFirestore.instance
        .collection('users')
        .doc(user.uid)
        .set({
      'fullName': fullNameController.text.trim(),
      'id': idController.text.trim(),
      'compound': compoundController.text.trim(),
      'login': DateTime.now().toUtc(),
      'authActivity': FieldValue.arrayUnion([
        {'action': 'login', 'timestamp': DateTime.now().toUtc()}
      ])
    }, SetOptions(merge: true));
    
  • 清理控制器资源:在页面销毁时释放控制器,避免内存泄漏。
    @override
    void dispose() {
      fullNameController.dispose();
      idController.dispose();
      compoundController.dispose();
      super.dispose();
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 22:54:56