如何解决Flutter报错(18022): Closure: () => Null 无法调用删除函数的问题
问题原因
你遇到的报错和点击无响应是以下几个问题共同导致的:
- 按钮点击回调中没有真正执行传入的函数,只是引用了函数对象本身,所以打印出来的是
Closure: () => Null的函数实例,删除逻辑没有触发 - 删除操作执行后没有通知列表页刷新UI,就算删除逻辑正常执行页面也不会更新
- 函数类型声明不规范,存在潜在的类型安全风险
修复方案
1. 修复ItemCard中按钮的点击执行逻辑
修改ItemsWidgetCart.dart里两个IconButton的onPressed配置,给函数加()执行,同时对可空的onEditPress做判空处理:
// 编辑按钮部分 IconButton( onPressed: widget.onEditPress?.call, // 等价于onEditPress存在时就执行onEditPress() icon: Icon( Icons.edit, color: Colors.blueAccent, ), ), // 删除按钮部分 IconButton( onPressed: () { widget.onDeletePress(); // 加括号执行传入的删除函数 print("tıklandı word page"); print(widget.onDeletePress); } , icon: Icon( Icons.delete, color: Colors.red, ), ),
如果要更规范,也可以把ItemCard类里的函数参数声明改成明确的回调类型,避免后续类型错误:
// 把原来的Function类型替换成Flutter自带的VoidCallback,或者手动写void Function() final VoidCallback onDeletePress; final VoidCallback? onEditPress;
2. 修复删除后的列表刷新逻辑
修改WordListPage.dart中传入onDeletePress的逻辑,删除完成后调用你已经写好的refreshNotes方法刷新列表:
return ItemCard( word: _word, input1: input1, input2: input2, // 改成异步执行,删除完成后刷新页面状态 onDeletePress: () async { await db.deleteWord(_word); refreshNotes(); }, );
3. 可选优化:调整deleteWord方法的冗余代码
你当前的deleteWord方法调用了getWordList但没有使用返回值,可以删掉这行无效代码,因为刷新逻辑已经交给上层页面处理了:
Future<void> deleteWord(Word word) async { await openDb(); await _database.delete('word', where: "id = ?", whereArgs: [word.id]); // 删掉下面这行没用的代码 // getWordList(); }
内容的提问来源于stack exchange,提问作者Salih Balsever
相关产品推荐
相关产品推荐

