无法在 onDismissible 中删除

Posted

技术标签:

【中文标题】无法在 onDismissible 中删除【英文标题】:Not able to delete in onDismissible 【发布时间】:2019-03-14 14:01:17 【问题描述】:

我有一个代码,它在列表视图中使用可忽略(显示数据库中的项目)。关闭一个项目后,它应该显示小吃栏,但它没有显示它,似乎可关闭的项目仍然是树的一部分。你能帮我解决这个问题吗?

return ListView.builder(
  itemCount: count,
  itemBuilder: (BuildContext context, int position) 
    final ThemeData theme = Theme.of(context);

    return Dismissible(

      key: Key(this.objs[position].id.toString()),
      onDismissed: (direction) 
        setState(() async 
          int result = await helper.delete(this.objs[position].id);
        );
        Scaffold.of(context)
            .showSnackBar(SnackBar(
            content: Text(this.objs[position].title + "dismissed")));
      ,
      background: Container(
          color: Colors.red,
          child: const ListTile(
              leading: Icon(Icons.delete, color: Colors.white, size: 36.0)
          )
      ),

      child: ListTile(
        leading: CircleAvatar(
          backgroundColor: getColor(this.objs[position].priority),
          child: Text(this.objs[position].id.toString()),
        ),
        title: Text(obj[position].title),
        subtitle: Text(objs[position].date),
        onTap: () 
          debugPrint("Tapped on " + objs[position].id.toString());
          navigateToDetail(this.objs[position]);
        ,
      ),
    );
  ,
);

这在 Scaffold 中被调用。 objs 是一个列表,其中包含我在数据库中的所有对象。

这是我在 onDismissed 中调用的删除代码:

    Future<int> delete(int id) async 
    Database db = await this.db;
    var result = await db.rawDelete("DELETE FROM $tblT WHERE $colId=$id");
    return result;
  

我注意到如果我删除一个项目,然后立即尝试创建另一个项目(我可以选择插入数据库): 它有时会抛出错误:已关闭的 Dismissible 小部件仍然是树的一部分

更新: 在 setState 之前移动了删除部分,我收到错误消息:每次滑动关闭时,已关闭的 Dismissible 小部件仍然是树的一部分

【问题讨论】:

【参考方案1】:

您可以为onDismissed: 属性尝试以下代码。

问题在于 onDismissed 函数内部的未来。我们需要重新排序 async 和 await 关键字。

无论如何,删除连续项目时要注意时间。

onDismissed: (direction) async 
    String title = this.obj[position].title;
    await helper.delete(this.obj[position].id);
    setState(() );
    Scaffold.of(context)
       .showSnackBar(SnackBar(content: Text("$title dismissed")));
,

它还将异步移出setState() 并存储标题以供SnackBar 稍后使用。

【讨论】:

谢谢。但在这种情况下,会出现一个错误,即 Amissed Dismissible 小部件仍然是树的一部分。 @chemamolins 您可以尝试两件事:首先摆脱异步行为,然后通过 GlobalKey 访问 Scaffold。我已经编辑了我的答案以反映这一点。 你的意思是我不能使用类型Future?我也在代码的其他部分使用它,用于异步行为 是的,您可以使用期货,但我不确定是否应该使用它来删除备份 ListView 的列表项。恐怕您遇到的问题与时间有关。例如,如果您直接访问 this.obj[position].title 中的项目,也许您可​​以直接访问列表以删除它们。 我用过:obj.removeAt(position); (obj 是这里的列表)而不是从 db 中删除。在此语句之后,我将其从数据库中删除,但在执行此操作时出现错误:引发了另一个异常:'package:flutter/src/widgets/framework.dart': Failed assertion: line 4051 pos 14: '_dependents. isEmpty':不正确。 I/flutter (18171):抛出另一个异常:在小部件树中检测到 Duplicate GlobalKey。【参考方案2】:

SnackBar里面的内容你可以试试:

Text(this.obj[position].title.toString() + "dismissed")

【讨论】:

title是String类型

以上是关于无法在 onDismissible 中删除的主要内容,如果未能解决你的问题,请参考以下文章

C#中CMD Shell中无法识别Dism

Wix:无法从Wix CustomAction调用DISM

SwiftUI:为 .sheet(_: onDismiss:) 重置状态

用Flutter中的新小部件替换dismissed小部件

DialogFragment timepicker onCancel 和 onDismiss 问题

win10系统要提升啥权限才能运行DISM