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
相关产品推荐
相关产品推荐

