Удаление элемента flutter_slidable из Listview.build не обновляет виджет - PullRequest
0 голосов
/ 13 апреля 2020

Я использую плагин flutter_slidable из dart_pub, который предоставляет вам записи ListView типа 'Slidable'. Затем у меня есть ListView.builder, который строит эти Slidables на основе карты неизменяемых JSON объектов. Таким образом, чтобы иметь возможность удалить один, я делаю их мелкую копию в начале. Но чего я не могу добиться, так это соответственно обновить виджет Listview, когда запись удаляется из клонированного списка с помощью обработчика onTap SlidableAction 'Löschen'.

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

Может быть, другая особенность заключается в том, что я также использую асинкодер из плагина для загрузки своих записей, но я думаю, что это не относится к проблеме, это просто другое состояние для обновления. Я знаю, что Listview довольно сложный, но здесь он без каких-либо изменений. Конечно, это часть виджета с состоянием и используется в методе сборки основного виджета. Любая помощь, почему это не работает, была бы очень полезна, потому что я действительно не нахожу решение и обновляю список, его записи и какие ключи, чтобы поместить, где это работает нормально.

Widget getListView(Map<int, Storage> storagesTmp, BuildContext context) {

Map<int, Storage> storages = new Map<int, Storage>.from(storagesTmp);

Stack stack = Stack(children: <Widget>[
  Container(
    child: ListView.builder(
      itemCount: storages.length,
      itemBuilder: (context, index) {
        return Slidable(
          child: Card(
            child: ListTile(
                title: Text(storages[index].getName),
                trailing: Icon(Icons.keyboard_arrow_right),
                onTap: () {
                  Navigator.push(
                      context,
                      MaterialPageRoute(
                        builder: (context) => StockScreen(),
                        settings: RouteSettings(arguments: { 'urlfilter': 'storage', 'id': storages[index].getId,'titleSuffix': ' ' +  storages[index].getName }),
                      ));
                }),
          ),
          actionPane: SlidableDrawerActionPane(),
          actionExtentRatio: 0.18,
          actions: <Widget>[
            IconSlideAction(
                caption: 'Editieren',
                color: Colors.blue,
                icon: Icons.edit,
                onTap: () async {
                  await Navigator.push(
                      context,
                      MaterialPageRoute(
                        builder: (context) => StorageEditScreen(),
                        settings: RouteSettings(arguments: storages[index]),
                      ));
                  asyncLoaderState.currentState.reloadState();
                }),
            IconSlideAction(
              caption: 'Löschen',
              color: Colors.red,
              icon: Icons.delete,
              onTap: () async {
                if (await confirmDialog(context, "Warnung", "Möchten Sie das Vorratslager mit allen Vorräten wirklich löschen?")) {
                  Scaffold.of(context).showSnackBar(SnackBar(
                      content: Text('Verarbeite Daten'),
                      duration: Duration(seconds: 30)));
                  await deleteStorage(storages[index], context);
                  Scaffold.of(context).removeCurrentSnackBar();
                  asyncLoaderState.currentState.setState(() {storages.remove(index);});
                }
              },
            ),
          ],
        );
      },
    ),
  ),
]);
return stack;

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...