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

如何使用Flutter与Hive DB实现如图所示的按年份检索数据功能?

基于Flutter+Hive实现按年份检索Pulse数据的方案

1. 初始化Hive与适配器注册

确保项目中Hive已完成基础配置,注册Pulse类的适配器并打开对应Box:

void main() async {
  await Hive.initFlutter();
  Hive.registerAdapter(PulseAdapter()); // 执行`flutter packages pub run build_runner build`生成适配器
  await Hive.openBox<Pulse>('pulse_storage');
  runApp(const MyApp());
}

2. 核心年份过滤逻辑

从Hive Box中读取所有Pulse数据,通过dateTime的年份属性进行筛选:

Box<Pulse> pulseBox = Hive.box<Pulse>('pulse_storage');

// 获取指定年份的所有脉搏数据
List<Pulse> fetchPulsesByYear(int targetYear) {
  return pulseBox.values.where((pulse) {
    return pulse.dateTime.year == targetYear;
  }).toList();
}

3. 构建年份筛选UI

实现下拉选择年份+结果展示的完整页面,自动提取已有数据中的年份选项:

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

  @override
  State<YearFilterPage> createState() => _YearFilterPageState();
}

class _YearFilterPageState extends State<YearFilterPage> {
  int? selectedYear;
  List<Pulse> filteredData = [];
  final Box<Pulse> _box = Hive.box<Pulse>('pulse_storage');

  // 提取已存数据中的所有年份(去重并倒序)
  List<int> getExistingYears() {
    return _box.values
        .map((item) => item.dateTime.year)
        .toSet()
        .toList()
        ..sort((a, b) => b.compareTo(a));
  }

  void updateFilteredData() {
    if (selectedYear == null) return;
    setState(() {
      filteredData = fetchPulsesByYear(selectedYear!);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('按年份检索数据')),
      body: Padding(
        padding: const EdgeInsets.all(16),
        child: Column(
          children: [
            // 年份选择下拉框
            DropdownButton<int>(
              hint: const Text('选择年份'),
              value: selectedYear,
              items: getExistingYears().map((year) {
                return DropdownMenuItem(
                  value: year,
                  child: Text(year.toString()),
                );
              }).toList(),
              onChanged: (val) {
                setState(() => selectedYear = val);
                updateFilteredData();
              },
            ),
            const SizedBox(height: 20),
            // 筛选结果列表
            Expanded(
              child: ListView.builder(
                itemCount: filteredData.length,
                itemBuilder: (ctx, idx) {
                  final pulse = filteredData[idx];
                  return ListTile(
                    title: Text('脉搏: ${pulse.pulseRate} | 血氧: ${pulse.saturation}'),
                    subtitle: Text(pulse.dateTime.toLocal().toString()),
                  );
                },
              ),
            ),
          ],
        ),
      ),
    );
  }
}

4. 性能优化建议(可选)

如果数据量较大,全量过滤会影响性能,可以维护一个年份索引Box:

  • 添加Pulse数据时,同步将数据ID存入对应年份的索引列表
  • 查询时先从索引Box取出目标年份的ID集合,再从主Box批量获取数据,减少遍历次数

内容的提问来源于stack exchange,提问作者Hasan Rahman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 14:45:24