如何在 Firestore 中记录用户登录和注销时间并将其显示在 Flutter 的表格中?

问题描述 投票:0回答:1

我正在开发一个 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 和复合位置

flutter firebase dart google-cloud-firestore
1个回答
0
投票

如何在用户注销时更新 Firestore 文档的注销时间?

如果您想跟踪多次登录/注销时间,您最终将得到一个地图数组。数组的工作方式如下:

await userDocRef.update({
  "authActivity": FieldValue.arrayUnion([{
    "action": "logout",
    "timestamp": FieldValue.serverTimestamp(),
  }]
});

因此,每次运行此代码时,它都会向

authActivity
数组字段添加一个元素,指示用户此时已注销。

© www.soinside.com 2019 - 2024. All rights reserved.