从Listview.build中删除flutter_slidable项不会更新小部件

时间:2020-04-13 20:11:01

标签: flutter flutter-listview

我正在使用dart_pub的flutter_slidable插件,该插件为您提供类型为“ Slidable”的ListView条目。然后,我有一个ListView.builder,它基于不可修改的JSON对象的映射构建那些Slidable。因此,为了能够删除它们,我会在开始时对其进行浅表复制。但是我无法实现的是,当通过SlidableAction'Löschen'onTap处理程序从克隆列表中删除条目时,相应地更新Listview窗口小部件。

我想我在某处需要某种类型的键,但是即使在观看了有关键的颤动视频并在stackoverflow上进行搜索后,经过无休止的尝试后,我仍无法弄清楚。导致可滑动动作不再起作用(条目释放后条目会恢复为初始状态,因此可滑动构件不会保持打开状态)或什么也没有发生,因此没有条目蜂被删除。

也许其他一些特色是我也在插件中使用asyncloader来加载我的条目,但是我想这与问题无关,只是更新状态不同。我知道Listview非常复杂,但是这里没有任何修改。当然,它是有状态小部件的一部分,并在主小部件的build方法中使用。任何无法正常工作的帮助都将非常有用,因为我真的找不到解决方案,无法更新列表的条目以及将其放置在什么位置的键。

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;

}

0 个答案:

没有答案