Я использую плагин 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;
}