被解雇的 Dismissible 小部件仍然是颤振树的一部分

adi*_*mar 2 sqlite provider dart flutter

我有一个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)
...
Run Code Online (Sandbox Code Playgroud)

这是我的代码。

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',  
        ),
Run Code Online (Sandbox Code Playgroud)

任务数据.dart

void deleteTask(int id) {
    taskDatabaseManager.deleteTask(id);
    notifyListeners();
  }
Run Code Online (Sandbox Code Playgroud)

数据库连接.dart

Future<void> deleteTask(int id) async {
    await openDb();
    await _database.delete(
      'tasks',
      where: 'id = ?',
      whereArgs: [id],
    );
  }
Run Code Online (Sandbox Code Playgroud)

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);
                },
              );
            });
      },
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

Ali*_*ice 7

如果您确定您的可关闭小部件已被删除。尝试修复key。键应该是唯一的。如果任务的 id 是唯一的,

key: Key(taskData.tasks[index].id)
Run Code Online (Sandbox Code Playgroud)

如果您没有任何其他恒定且唯一的数据,则可以尝试

key: UniqueKey()
Run Code Online (Sandbox Code Playgroud)


Pab*_*era 5

当您关闭 a 时Dismissible,您应该将其从小部件树中删除。在您的情况下,您Dismissible为 的每个项目显示taskData,因此如果您关闭Dismissible项目的 ,您应该从列表中删除该项目。

所以,在deleteCallback,在做之后deleteTask(),你应该在taskData.removeAt(index)里面做setState()