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

List's icon state reverts when I scroll

我正在屏幕上呈现从 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);
                      });
                    },
                  )

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

你有多个列表项,很明显你不能只用一个变量来管理状态。您需要制作一个布尔值列表,列表的长度应等于列表的长度。然后在 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);
                  });
                },
              )