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

Flutter+SQLite开发闹钟页面每次重新进入列表元素重复叠加问题

问题根因

条目重复叠加的核心问题出在AlarmHelper类的getAlarm()方法实现:
你使用的alarms变量是全局/类级别的复用列表,每次执行数据库查询时都直接往该列表追加新的查询结果,没有提前清空历史数据。而每次进出闹钟页面时,页面生命周期的initState方法都会重新触发getAlarm()调用,导致相同的数据库记录被反复追加到同一个列表中,最终渲染出重复条目。

修复方案

1. 修复查询逻辑避免数据叠加

修改getAlarm()方法,每次查询时使用新的局部列表存储结果,或查询前清空原有列表:

Future<List<AlarmInfo>> getAlarm() async{
  // 每次查询创建新的局部列表,避免复用全局列表的旧数据
  List<AlarmInfo> alarms = [];
  var db = await this.database;
  var result = await db?.query(tableName);
  result?.forEach((element) { 
    var alarmInfo  = AlarmInfo.fromMap(element);
    alarms.add(alarmInfo);
  });
  return alarms;
}

如果需要保留全局alarms变量,则在查询前添加清空逻辑:

Future<List<AlarmInfo>> getAlarm() async{
  // 先清空历史数据再追加新查询结果
  alarms.clear();
  var db = await this.database;
  var result = await db?.query(tableName);
  result?.forEach((element) { 
    var alarmInfo  = AlarmInfo.fromMap(element);
    alarms.add(alarmInfo);
  });
  return alarms;
}

2. 补充页面交互后的刷新逻辑

2.1 新增闹钟返回后刷新

当前跳转到新增闹钟页面返回时不会加载新添加的闹钟,修改跳转逻辑增加返回回调:

onPressed: (){
  Navigator.push(context, MaterialPageRoute(builder: (context){
    return AddAlarmScreen();
  })).then((_){
    // 返回闹钟页面后重新查询数据刷新UI
    setState(() {
      _alarms = _alarmHelper.getAlarm();
    });
  });
},

2.2 删除闹钟后同步刷新

当前删除闹钟后不会同步更新UI,修改删除逻辑:

IconButton(onPressed: (){
  _alarmHelper.deleteAlarm(alarms.id).then((_){
    setState(() {
      _alarms = _alarmHelper.getAlarm();
    });
  });
}, icon: Icon(Icons.delete, color: Colors.white, size: 24,))

可选优化

你当前代码中AlarmHelper的新增闹钟方法名存在笔误:insetAlarm应为insertAlarm,避免后续调用出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:09:02