Невозможно удалить в onDismissible - PullRequest
0 голосов
/ 09 октября 2018

У меня есть код, который использует недопустимый в просмотре списка (показывает элементы из базы данных).После отклонения предмета он должен показывать снек-бар, но не показывает его, и кажется, что этот предмет все еще является частью дерева.Можете ли вы помочь мне с этим?

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]);
        },
      ),
    );
  },
);

это называется внутри эшафот.И 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;
  }

Я заметил, что если я удаляю один элемент и сразу пытаюсь создать другой (у меня есть возможность вставитьв БД): иногда выдает ошибку: уволенный виджет «Отклоняемый» по-прежнему является частью дереваРазрушаемый виджет все еще является частью дерева каждый раз, когда я провожу пальцем по экрану

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Внутри контента в SnackBar вы можете попробовать:

Text(this.obj[position].title.toString() + "dismissed")
0 голосов
/ 09 октября 2018

Вы можете попробовать следующий код для свойства 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.

...