滚动时列表的图标状态恢复

Posted

技术标签:

【中文标题】滚动时列表的图标状态恢复【英文标题】:List's icon state reverts when I scroll 【发布时间】:2021-10-18 07:15:58 【问题描述】:

我正在屏幕上呈现从 api 获取的列表。我为列表中的每个项目都有一个保存按钮,单击时会更改。它工作正常,但是当我滚动列表时它会恢复。我认为这是因为列表构建器一次又一次地构建列表,但我想不出解决用户单击时图标状态的解决方案。这是代码的一部分:

....
class NewsListBuilderItemsState extends State<NewsListBuilderItems> 
  final _repository = Repository();
  bool selected = false;
...

这是按钮:

                  GestureDetector(
                    child: Icon(selected
                        ? Icons.bookmark
                        : Icons.bookmark_border_outlined),
                    onTap: () 
                      setState(() 
                        selected = !selected;
                        _repository.addToDb(
                            widget.snapshot.data[widget.index]);

                        bloc.addToSavedNews(
                            widget.snapshot, widget.index);
                      );
                    ,
                  )

【问题讨论】:

【参考方案1】:

问题是,您仅在项目级别处理“选定”状态。因此,如果项目超出可见区域,它会自行销毁,如果您向后滚动,它会以初始状态重新创建自己。您需要从项目上方传递所选信息。最有可能在您映射所有新闻的地方。您应该从那里的 db (bloc) 中获取选定的值并将其作为参数传递给新闻项。

【讨论】:

我的按钮在此小部件上,并且图标在此处更改,因此此处所选内容将被更改。我该怎么做?【参考方案2】:

你有多个列表项,很明显你不能只用一个变量来管理状态。您需要制作一个布尔值列表,列表的长度应等于列表的长度。然后在 setState 中,您应该更改该项目索引处的布尔值。

....
   class NewsListBuilderItemsState extends State<NewsListBuilderItems> 
   final _repository = Repository();
   List<bool> selected = [];
...

注意:-

GestureDetector(
                child: Icon(selected[index]

                    ? Icons.bookmark
                    : Icons.bookmark_border_outlined),
                onTap: () 
                  setState(() 
                    selected[index] = !selected[index];
                    _repository.addToDb(
                        widget.snapshot.data[widget.index]);

                    bloc.addToSavedNews(
                        widget.snapshot, widget.index);
                  );
                ,
              )

【讨论】:

我认为 NewsListBuilderItems 是每个项目的有状态小部件。在小部件树中,上面的小部件,我的意思是你有列表视图的小部件。您需要更改该小部件的状态并将每个列表项设为无状态。

以上是关于滚动时列表的图标状态恢复的主要内容,如果未能解决你的问题,请参考以下文章

Jetpack Compose - 恢复 LazyColumn 滚动状态

UICollectionView 状态恢复:自定义滚动位置

如何删除视频上的状态栏和重叠图标?

在分页库 3 中恢复滚动位置

滚动列表中的项目时丢弃 SwiftUI 状态

单击操作栏项目复选框时,更改其状态