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

如何解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:24:04