从Flutter中的List <widget>删除索引明智的CustomWidget

时间:2019-01-22 14:38:23

标签: dart flutter flutter-sliver dart-2

我最初在Column中没有Widget的空列表。现在,在“其他”小部件上,单击“我要在_contactItems中添加新的自定义小部件

   Column(
      children: _contactItems,
    )

 List<Widget> _contactItems = new List<CustomWidget>();



 _contactItems.add(newCustomWidget(value));

现在假设我有6条记录(列中有6个自定义小部件)。我正在尝试删除索引明智的记录(例如。我要删除第3条记录,然后删除第1条记录。列小部件(动态小部件)应更新为_contactItems,在setState()中进行更新)

现在在 CustomWidget 上单击“我正在从列中删除该特定的 CustomWidget ”。

setState(() {
          _contactItems.removeAt(index);
        });

也尝试过

_contactItems.removeWhere((item) {
            return item.key == _contactItems[index].key;
          });

2 个答案:

答案 0 :(得分:2)

尝试以下操作(假设您的“列”小部件键具有这种格式):

setState(() {
  this._contactItems.removeWhere((contact) => contact.key == Key("index_$index"));
});

如果这不能解决您的问题,也许我们需要更多信息。

答案 1 :(得分:0)

如果您要操作ListView或GridView,则将键分配给List / GridView的每个子控件很重要

简而言之,Flutter仅按类型而不按状态比较小部件。因此,当List / GridView中表示的List的状态发生更改时,Flutter不知道应删除哪些子级,因为它们的Types仍然相同,然后签出。 Flutter拾取的唯一问题是项目数,这就是为什么它仅删除List / GridView中的最后一个小部件的原因。

因此,如果要在Flutter中操作列表,请为每个孩子的顶层窗口小部件分配一个Key。 this article中提供了更详细的说明。

这可以通过添加

来实现
   return GridView.count(
  shrinkWrap: true,
  crossAxisCount: 2,
  crossAxisSpacing: 5.0,
  mainAxisSpacing: 5.0,
  children: List.generate(urls.length, (index) {
    //generating tiles with from list
    return   GestureDetector(
        key: UniqueKey(), //This made all the difference for me
        onTap: () => {
          setState(() {
            currentUrls.removeAt(index); // deletes the item from the gridView
          }) 

        },
        child: FadeInImage( // A custom widget I made to display an Image from 
            image:  NetworkImage(urls[index]),
            placeholder: AssetImage('assets/error_loading.png') 
            ),

    );
  }),

);