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

Flutter中SQLite删除功能异常:点击按钮无效热重启后生效

SQLite Todo应用删除操作UI不即时更新问题解决

问题根源

删除操作实际已成功执行(热重启后数据消失可证明),但点击删除按钮后UI未即时更新,问题出在列表刷新逻辑:

  • refleshList()方法中,你在setState内调用了异步方法_showAllData(),但既没有等待异步操作完成,也没有将获取到的新数据赋值给用于渲染列表的状态变量。setState仅触发了组件重绘,但重绘时依旧使用旧的列表数据,直到热重启重新初始化组件才会加载新数据。

修复方案

1. 新增状态变量存储待办列表

在组件类中声明用于存储待办数据的状态变量:

List<TodoModel> _todoList = [];

2. 修改数据加载方法,绑定状态变量

调整_showAllData(),让它获取新数据后更新状态变量并触发重绘:

Future<void> _showAllData() async {
  // 获取最新数据并赋值给状态变量
  _todoList = await TodoModelDao().getAllData();
  // 触发重绘,此时UI会使用更新后的_todoList
  setState(() {});
}

3. 简化刷新方法

直接调用数据加载方法即可,无需在setState中包裹异步操作:

void refleshList() {
  _showAllData();
}

4. 初始化时加载数据

在组件初始化生命周期中调用_showAllData(),加载初始待办数据:

@override
void initState() {
  super.initState();
  _showAllData();
}

5. 优化删除方法(可选)

deleteTodo方法中的text和isDone参数未被使用,可简化代码:

// TodoModelDao中的deleteTodo方法
Future<void> deleteTodo(int id) async {
  var db = await DatabaseHelper.dbAccess();
  await db.delete(TABLENAME, where: "$ID = ?", whereArgs: [id]);
}

// 组件中的_deleteTodoItem方法
Future<void> _deleteTodoItem(int id) async {
  await TodoModelDao().deleteTodo(id);
  refleshList();
}

6. 使用状态变量渲染列表

确保UI渲染列表时,使用_todoList作为数据源,这样刷新后就能展示最新数据。

总结

核心问题是异步数据获取未与状态变量关联,导致UI无法感知数据变化。通过将新数据赋值给状态变量并触发重绘,就能实现删除操作后的即时UI更新。

内容的提问来源于stack exchange,提问作者Furkan Balcı

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 03:35:24