dart 一个被驳回的Dismissible小部件仍然是树的一部分

omvjsjqw  于 2023-06-19  发布在  其他
关注(0)|答案(3)|浏览(117)

我有一个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);
                },
              );
            });
      },
    );
  }
}
zlhcx6iw

zlhcx6iw1#

如果您确定您的可禁用小部件已被删除。尝试修复key。密钥应该是唯一的。如果tasks的id是唯一的

key: Key(taskData.tasks[index].id)

如果您没有任何其他常量和唯一数据,您可以尝试

key: UniqueKey()
idfiyjo8

idfiyjo82#

当你放弃Dismissible时,你应该把它从小部件树中删除。在您的例子中,您为taskData的每个项目显示Dismissible,因此如果您关闭某个项目的Dismissible,则应该从列表中删除该项目。
所以,在deleteCallback中,在做deleteTask()之后,你应该在setState()中做taskData.removeAt(index)

muk1a3rh

muk1a3rh3#

我使用了UniqueKey()而不是Key(taskData.tasks[index].id),这是正确的。

相关问题