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

Flutter中如何解析Firebase实时数据库的时间戳字段数据?

解析Firebase实时数据库日期层级数据的方案

肯定需要创建数据模型,这能让你更安全、清晰地访问数据,避免直接操作原始Map的繁琐和潜在错误。

1. 明确数据结构

先把Firebase里的JSON结构明确出来,示例如下(你可以根据实际字段调整):

{
  "5-11-2022": {
    "1667625600000": {
      "temperature": 25,
      "humidity": 60
    },
    "1667629200000": {
      "temperature": 26,
      "humidity": 58
    }
  },
  "6-11-2022": {
    "1667712000000": {
      "temperature": 24,
      "humidity": 62
    }
  }
}

2. 创建数据模型

先给时间戳对应的具体业务数据创建模型类,比如叫Record:

class Record {
  final double temperature;
  final int humidity;

  Record({required this.temperature, required this.humidity});

  // 从Map转成模型实例
  factory Record.fromMap(Map<String, dynamic> map) {
    return Record(
      temperature: map['temperature']?.toDouble() ?? 0.0,
      humidity: map['humidity']?.toInt() ?? 0,
    );
  }
}

3. 解析JSON字符串

先把从Firebase拿到的字符串JSON转成Map<String, dynamic>,再逐层解析日期和时间戳节点:

// 假设你获取到的JSON字符串是jsonString
import 'dart:convert';

final Map<String, dynamic> rawData = jsonDecode(jsonString);

// 转成「日期 -> {时间戳: Record}」的结构化数据
Map<String, Map<String, Record>> parsedData = {};

rawData.forEach((date, timestampMap) {
  Map<String, Record> records = {};
  (timestampMap as Map<String, dynamic>).forEach((timestamp, data) {
    records[timestamp] = Record.fromMap(data);
  });
  parsedData[date] = records;
});

4. 界面展示数据

用嵌套组件展示日期和对应时间戳数据,比如用ExpansionTile实现展开/收起效果:

ListView.builder(
  itemCount: parsedData.keys.length,
  itemBuilder: (context, index) {
    final date = parsedData.keys.elementAt(index);
    final records = parsedData[date]!;

    return ExpansionTile(
      title: Text(date),
      children: records.entries.map((entry) {
        final timestamp = entry.key;
        final record = entry.value;
        // 将时间戳转成可读时间
        final dateTime = DateTime.fromMillisecondsSinceEpoch(int.parse(timestamp));
        return ListTile(
          title: Text('${dateTime.hour}:${dateTime.minute}'),
          subtitle: Text('温度: ${record.temperature}°C 湿度: ${record.humidity}%'),
        );
      }).toList(),
    );
  },
)

额外提示

  • 如果你的时间戳是秒级而非毫秒级,转DateTime时要乘以1000。
  • 可以对日期排序,比如把parsedData.keys转成列表后,通过DateTime解析排序,避免展示顺序混乱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 12:25:19