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ı
相关产品推荐
相关产品推荐

