sqlite - 被解雇的 Dismissible 小部件仍然是颤动树的一部分
问题描述
provider
我有一个用于状态管理和sqlite
数据库的待办事项应用程序。
在应用程序中,我正在尝试添加Dismissible
小部件以删除项目。
但问题是当我尝试删除项目时它确实被删除database
但我在屏幕上出现错误。我是新来的。
控制台中的错误。
════════ Exception caught by widgets library ═══════════════════════════════════════════════════════
The following assertion was thrown building Dismissible-[<'howll'>](dirty, dependencies: [Directionality], state: _DismissibleState#98163(tickers: tracking 2 tickers)):
A dismissed Dismissible widget is still part of the tree.
Make sure to implement the onDismissed handler and to immediately remove the Dismissible
widget from the application once that handler has fired.
User-created ancestor of the error-causing widget was:
TaskListTile file:///C:/Users/adity/Desktop/flutter-app/todoye/lib/widgets/task_list_view.dart:14:22
When the exception was thrown, this was the stack:
#0 _DismissibleState.build.<anonymous closure> (package:flutter/src/widgets/dismissible.dart:526:11)
#1 _DismissibleState.build (package:flutter/src/widgets/dismissible.dart:533:8)
#2 StatefulElement.build (package:flutter/src/widgets/framework.dart:4047:27)
#3 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3941:15)
#4 Element.rebuild (package:flutter/src/widgets/framework.dart:3738:5)
...
这是我的代码。
task_list_tile.dart
Dismissible(
key: Key(taskTitle),
onDismissed: (direction) {
deleteCallback();
Scaffold.of(context)
.showSnackBar(SnackBar(content: Text("$taskTitle removed.")));
},
child: ListTile(
title: Text(
'$taskTitle',
),
任务数据.dart
void deleteTask(int id) {
taskDatabaseManager.deleteTask(id);
notifyListeners();
}
数据库连接.dart
Future<void> deleteTask(int id) async {
await openDb();
await _database.delete(
'tasks',
where: 'id = ?',
whereArgs: [id],
);
}
task_list_view.dart
class TaskListView extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Consumer<TaskData>(
builder: (context, taskData, child) {
return ListView.builder(
itemCount: taskData.taskCount,
itemBuilder: (context, index) {
return TaskListTile(
taskTitle: taskData.tasks[index].name,
isChecked: taskData.tasks[index].isDone,
checkboxCallback: (checkboxState) {
taskData.updateTask(taskData.tasks[index]);
},
deleteCallback: () {
taskData.deleteTask(taskData.tasks[index].id);
},
);
});
},
);
}
}
解决方案
如果您确定您的可关闭小部件已被删除。尝试修复key
。密钥应该是唯一的。如果任务的 id 是唯一的,
key: Key(taskData.tasks[index].id)
如果您没有任何其他恒定且唯一的数据,您可以尝试
key: UniqueKey()
推荐阅读
- javascript - 在我的案例中,扩展运算符如何帮助获取数据
- android - 如何避免在 Firebase Crashlytics 上记录非致命事件 - React Native
- iis - 将 Visual Studio19 Blazor Webassembly 示例应用程序发布到 Localhost
- java - SSLSocket 的 OutputStream 是“阻塞的”
- python - Python + Postgresql - 检查添加到数据库之前的输入值是否与现有行值相等?
- r - 如果有必要使我的表格适合可用宽度,我如何告诉 R 的 flextable 在单词中添加换行符?
- c++ - C++ 中指定初始值设定项的未定义行为
- node.js - 如何设置 nginx 配置以从反应 js 与 docker 中的节点 js 通信
- java - 子类能否重载已声明为抽象的超类的方法
- c# - 为什么我在添加迁移时收到 argumentNullException