Flutter中Dismissible删除数据时setState返回Future异常问题
问题原因分析与解决方案
这个报错的根源其实很明确——你在setState()的回调函数前加了async关键字,这就导致这个回调变成了一个返回Future的异步函数,而Flutter的setState()要求传入的回调必须是同步、无返回值的函数,这就是控制台抛出setState() callback argument returned a Future错误的核心原因。
为什么会触发这个错误?
你可能会疑惑:“我没在setState里返回任何变量啊?” 其实只要函数被标记为async,不管你有没有写return语句,它都会自动返回一个Future对象(哪怕是Future<void>)。Flutter内部会检查setState的回调返回值,一旦发现是Future,就会触发这个断言错误,提醒你不要在setState里做异步操作。
看你的代码就能发现问题所在:
setState(() async { await openData2().then((value) { value.delete( 'test2', where: 'loc3 = ?', whereArgs: ['loc3'], ); }); });
这里的() async { ... }就是一个异步函数,它会返回Future,完全违反了setState的设计要求。
额外的小问题提醒
另外,你的whereArgs参数写的是['loc3'],这会让数据库删除所有loc3字段等于字符串'loc3'的条目,而不是当前要删除的那个列表项的loc3值,应该改成[item['loc3']]才对。
正确的写法
正确的逻辑应该是:先执行异步的数据库删除操作,等操作完成后,再同步调用setState更新UI和内存中的数据。修改后的代码如下:
onDismissed: (direction) async { // 第一步:先执行异步的数据库删除操作,不在setState里处理异步逻辑 await openData2().then((value) { value.delete( 'test2', where: 'loc3 = ?', whereArgs: [item['loc3']], // 修正whereArgs的值 ); }); // 第二步:删除完成后,同步调用setState更新状态(移除内存中的数据) setState(() { data.removeAt(index); }); }
关键要点总结
setState()的回调必须是同步函数,绝对不能加async- 所有异步操作(比如数据库读写、网络请求)都要放在setState外面执行,完成后再调用setState同步更新UI
- 记得同时更新内存中的
data列表,这样ListView才能立刻刷新,显示删除后的结果
内容的提问来源于stack exchange,提问作者evergreen
相关产品推荐
相关产品推荐

