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

如何统计Firestore中同国家用户数并在Flutter表格展示?

实现Firestore用户国家统计并在Flutter DataTable展示

1. 统计Firestore中的用户国家数量

从Firestore用户集合获取数据后,用Map<String, int>存储统计结果,键为国家名称,值为对应用户数:

Future<Map<String, int>> _countUsersByCountry() async {
  final querySnapshot = await FirebaseFirestore.instance.collection('users').get();
  final countryCount = <String, int>{};

  for (final doc in querySnapshot.docs) {
    final country = doc.data()['Country'] as String?;
    if (country != null && country.isNotEmpty) {
      countryCount[country] = (countryCount[country] ?? 0) + 1;
    }
  }

  return countryCount;
}

2. 在DataTable中展示统计结果

结合FutureBuilder处理异步加载状态,将统计数据转换成表格行:

class CountryStatsTable extends StatefulWidget {
  const CountryStatsTable({super.key});

  @override
  State<CountryStatsTable> createState() => _CountryStatsTableState();
}

class _CountryStatsTableState extends State<CountryStatsTable> {
  late Future<Map<String, int>> _countryStatsFuture;

  @override
  void initState() {
    super.initState();
    _countryStatsFuture = _countUsersByCountry();
  }

  Future<Map<String, int>> _countUsersByCountry() async {
    final querySnapshot = await FirebaseFirestore.instance.collection('users').get();
    final countryCount = <String, int>{};

    for (final doc in querySnapshot.docs) {
      final country = doc.data()['Country'] as String?;
      if (country != null && country.isNotEmpty) {
        countryCount[country] = (countryCount[country] ?? 0) + 1;
      }
    }

    return countryCount;
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<Map<String, int>>(
      future: _countryStatsFuture,
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting) {
          return const Center(child: CircularProgressIndicator());
        }

        if (snapshot.hasError) {
          return Center(child: Text('加载失败: ${snapshot.error}'));
        }

        final stats = snapshot.data ?? {};
        if (stats.isEmpty) {
          return const Center(child: Text('暂无用户数据'));
        }

        return DataTable(
          columns: const [
            DataColumn(label: Text('国家')),
            DataColumn(label: Text('用户数量')),
          ],
          rows: stats.entries.map((entry) {
            return DataRow(cells: [
              DataCell(Text(entry.key)),
              DataCell(Text(entry.value.toString())),
            ]);
          }).toList(),
        );
      },
    );
  }
}

关键说明

  • 用FutureBuilder处理异步数据加载,避免UI阻塞
  • 统计时过滤空的Country字段,排除无效数据
  • 直接将统计Map的条目转为表格行,简化数据绑定逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 02:10:33