一个被关闭的 Dismissible 小部件仍然是 flutter 树的一部分
A dismissed Dismissible widget is still part of the tree in flutter
我有一个待办事项应用程序,它使用 provider
进行状态管理和 sqlite
数据库。
在应用程序中,我正在尝试添加 Dismissible
小部件以删除项目。
但问题是,当我尝试删除项目时,它确实从 database
中删除了,但我在 screen.I 上遇到了错误,我是 flutter 的新手。
error in console.
════════ 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',
),
task_data.dart
void deleteTask(int id) {
taskDatabaseManager.deleteTask(id);
notifyListeners();
}
databse_connection.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);
},
);
});
},
);
}
}
当您关闭 Dismissible
时,您应该将其从小部件树中删除。在您的情况下,您为 taskData
中的每个项目显示了 Dismissible
,因此如果您忽略某个项目的 Dismissible
,则应从列表中删除该项目。
因此,在 deleteCallback
中,在执行 deleteTask()
之后,您应该在 setState()
中执行 taskData.removeAt(index)
。
如果您确定您的可关闭小部件已被删除。尝试修复 key
。
密钥应该是唯一的。如果任务的id是唯一的,
key: Key(taskData.tasks[index].id)
如果你没有任何其他恒定且唯一的数据,你可以尝试
key: UniqueKey()
我有一个待办事项应用程序,它使用 provider
进行状态管理和 sqlite
数据库。
在应用程序中,我正在尝试添加 Dismissible
小部件以删除项目。
但问题是,当我尝试删除项目时,它确实从 database
中删除了,但我在 screen.I 上遇到了错误,我是 flutter 的新手。
error in console.
════════ 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',
),
task_data.dart
void deleteTask(int id) {
taskDatabaseManager.deleteTask(id);
notifyListeners();
}
databse_connection.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);
},
);
});
},
);
}
}
当您关闭 Dismissible
时,您应该将其从小部件树中删除。在您的情况下,您为 taskData
中的每个项目显示了 Dismissible
,因此如果您忽略某个项目的 Dismissible
,则应从列表中删除该项目。
因此,在 deleteCallback
中,在执行 deleteTask()
之后,您应该在 setState()
中执行 taskData.removeAt(index)
。
如果您确定您的可关闭小部件已被删除。尝试修复 key
。
密钥应该是唯一的。如果任务的id是唯一的,
key: Key(taskData.tasks[index].id)
如果你没有任何其他恒定且唯一的数据,你可以尝试
key: UniqueKey()