我正在开发一个 Flutter 应用程序,我需要跟踪用户登录和注销时间,以及其他用户信息,例如全名、ID 和复合位置。我想在单独屏幕上的表格中显示此信息。
这是我迄今为止所实现的:
记录登录时间:
在我的登录屏幕中,我记录用户成功登录时的登录时间:
final userDocRef = FirebaseFirestore.instance.collection('signing').doc(credential.user!.uid);
// Log login time
await userDocRef.set({
'FullName': FullNamecontroler.text,
'ID': IDcontroller.text,
'compound': compoundcontroller.text,
'login': FieldValue.serverTimestamp(),
'logout': null,
}, SetOptions(merge: true));
登录登出时间:
我还记录了用户注销时的注销时间:
void _logout() async {
final user = FirebaseAuth.instance.currentUser;
if (user != null) {
final userDocRef = FirebaseFirestore.instance.collection('signing').doc(user.uid);
// Log logout time
await userDocRef.update({
'logout': FieldValue.serverTimestamp(),
});
await FirebaseAuth.instance.signOut();
Navigator.pushNamedAndRemoveUntil(context, Signin.screenroute, (route) => false);
}
}
在表格中显示数据:
在我的表格屏幕上,我获取这些数据并将其显示在表格中:
class Tablescreen extends StatefulWidget {
static const String screenroute = 'Tablescreen';
const Tablescreen({Key? key}) : super(key: key);
@override
State<Tablescreen> createState() => _TablescreenState();
}
class _TablescreenState extends State<Tablescreen> with SingleTickerProviderStateMixin {
late TabController _controller;
@override
void initState() {
super.initState();
_controller = TabController(length: 3, vsync: this, initialIndex: 0);
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
appBar: AppBar(
bottom: TabBar(
controller: _controller,
tabs: [
Tab(text: "Table"),
Tab(text: "Select Table"),
Tab(text: "Sort Table"),
],
),
title: Center(
child: Text(
" Daily Reports",
style: TextStyle(fontWeight: FontWeight.w800),
),
),
),
body: SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: Container(
child: StreamBuilder<QuerySnapshot>(
stream: FirebaseFirestore.instance.collection('signing').snapshots(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return CircularProgressIndicator();
} else if (snapshot.hasError) {
return Center(child: Text('Error: ${snapshot.error}'));
} else if (!snapshot.hasData || snapshot.data!.docs.isEmpty) {
return Center(child: Text('No data available'));
} else {
final data = snapshot.data!.docs;
return DataTable(
columns: <DataColumn>[
DataColumn(label: Text("FullName")),
DataColumn(label: Text("login")),
DataColumn(label: Text("ID")),
DataColumn(label: Text("compound")),
DataColumn(label: Text("logout")),
],
rows: data.map<DataRow>((DocumentSnapshot document) {
final Map<String, dynamic> userData = document.data() as Map<String, dynamic>;
// Format timestamps
String formatTimestamp(Timestamp? timestamp) {
if (timestamp == null) return 'N/A';
return timestamp.toDate().toString();
}
return DataRow(
cells: <DataCell>[
DataCell(Text(userData['FullName'] ?? '')),
DataCell(Text(formatTimestamp(userData['login'] as Timestamp?))),
DataCell(Text(userData['ID'] ?? '')),
DataCell(Text(userData['compound'] ?? '')),
DataCell(Text(formatTimestamp(userData['logout'] as Timestamp?))),
],
);
}).toList(),
);
}
},
),
),
),
);
}
}
问题:
如何在 Firestore 中使用复合位置、全名和 ID 正确记录登录、注销时间? 当用户注销时,如何使用注销时间更新 Firestore 文档? 有没有更好的方法来处理这种跟踪? 任何帮助或建议将不胜感激!
跟踪用户登录和注销时间,以及其他用户信息,例如全名、ID 和复合位置
如何在用户注销时更新 Firestore 文档的注销时间?
如果您想跟踪多次登录/注销时间,您最终将得到一个地图数组。数组的工作方式如下:
await userDocRef.update({
"authActivity": FieldValue.arrayUnion([{
"action": "logout",
"timestamp": FieldValue.serverTimestamp(),
}]
});
因此,每次运行此代码时,它都会向
authActivity
数组字段添加一个元素,指示用户此时已注销。