Flutter中SQFLite数据更新无响应,求数据库/控制器/首页实现代码
你的代码存在几个核心问题导致更新无反应:SQL语句残缺、参数传递不足、异步逻辑未处理、控制器调用错误。以下是各层的具体修改方案:
一、数据库层(DBCari)修改
原update方法的SQL语句既没有赋值也没有指定更新条件,且参数无法定位唯一记录。修改为带占位符的完整SQL,同时补充主键和新值参数:
static Future<int?> update(int cariId, String newCariAdi) async { var dbClient = await _db; // 用占位符传递参数,通过主键定位要更新的记录 return await dbClient?.rawUpdate( 'UPDATE $_tableName SET cariadi = ? WHERE id = ?', [newCariAdi, cariId], ); }
注:如果你的Cari表主键不是id,替换为实际的唯一标识字段。
二、CariController控制器修改
用GetX的可观察列表管理数据,完善异步逻辑,确保数据库更新完成后再刷新列表:
class CariController extends GetxController { // 用RxList实现数据变化时UI自动刷新 final RxList<Cari> cariList = <Cari>[].obs; @override void onInit() { super.onInit(); // 初始化时加载数据 getCari(); } Future<void> getCari() async { List<Map<String, dynamic>> cariler = await DBCari.query(); cariList.assignAll(cariler.map((data) => Cari.fromJson(data)).toList()); } Future<void> updateData(int cariId, String newCariAdi) async { // 等待数据库更新完成 await DBCari.update(cariId, newCariAdi); // 重新加载数据刷新列表 await getCari(); } }
三、首页(UI层)修改
确保获取待编辑的Cari对象和新输入值,在点击事件中调用控制器的业务更新方法,同时用Obx包裹列表实现自动刷新:
// 声明变量存储选中的待编辑对象和输入控制器 Cari? selectedCari; final TextEditingController _editController = TextEditingController(); // 列表UI(用Obx包裹) Obx( () => ListView.builder( itemCount: _cariController.cariList.length, itemBuilder: (context, index) { final cari = _cariController.cariList[index]; return ListTile( title: Text(cari.cariadi!), trailing: IconButton( icon: const Icon(Icons.edit), onTap: () { // 选中当前要编辑的记录 selectedCari = cari; // 弹出编辑弹窗 _showEditDialog(); }, ), ); }, ), ) // 编辑弹窗实现 void _showEditDialog() async { if (selectedCari == null) return; _editController.text = selectedCari!.cariadi!; await Get.dialog( AlertDialog( title: const Text('修改名称'), content: TextField( controller: _editController, decoration: const InputDecoration(hintText: '输入新名称'), ), actions: [ TextButton( onPressed: () => Get.back(), child: const Text('取消'), ), TextButton( onPressed: () async { final newName = _editController.text.trim(); if (newName.isNotEmpty) { // 调用控制器的更新方法 await _cariController.updateData(selectedCari!.id!, newName); Get.back(); _editController.clear(); } }, child: const Text('确认'), ), ], ), ); }
内容的提问来源于stack exchange,提问作者ckot
相关产品推荐
相关产品推荐

