我有一个todo应用程序,它使用provider
进行状态管理和sqlite
数据库。
在应用程序中,我试图添加Dismissible
小部件删除项目。
但问题是,当我试图删除项目,它确实得到删除从database
,但我得到错误的屏幕上。我是新的Flutter。
控制台出错。
════════ 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);
},
);
});
},
);
}
}
3条答案
按热度按时间zlhcx6iw1#
如果您确定您的可禁用小部件已被删除。尝试修复
key
。密钥应该是唯一的。如果tasks的id是唯一的如果您没有任何其他常量和唯一数据,您可以尝试
idfiyjo82#
当你放弃
Dismissible
时,你应该把它从小部件树中删除。在您的例子中,您为taskData
的每个项目显示Dismissible
,因此如果您关闭某个项目的Dismissible
,则应该从列表中删除该项目。所以,在
deleteCallback
中,在做deleteTask()
之后,你应该在setState()
中做taskData.removeAt(index)
。muk1a3rh3#
我使用了UniqueKey()而不是Key(taskData.tasks[index].id),这是正确的。