You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter随机词列表心形图标点击无法切换填充状态及显示红色问题

问题根因

你的代码逻辑存在一个核心错误:ListView.builder的项构建回调中,没有读取你已经存入_pairList的词对数据,反而每次渲染列表项时都调用WordPair.random()生成全新的随机词对:

  • 点击时你存入_saved集合的是本次渲染临时生成的随机词对
  • 下次组件触发重绘时,同一个索引位置又会生成完全不同的新词对,永远无法和_saved里存储的旧词对匹配,因此点击后心形图标和颜色都不会发生预期变化。
修复方法

仅需要修改一行代码:把itemBuilder里生成随机词的逻辑,替换为从_pairList按当前索引取值即可。
修正后的完整代码如下:

final _pairList = <WordPair>[];
final _saved = <WordPair>{};

Widget wordListHolder() {
  return ListView.builder(
    padding: const EdgeInsets.all(26.0),
    itemBuilder: (BuildContext context, int index) {
      if (index >= _pairList.length) {
        _pairList.addAll(generateWordPairs().take(10));
      }
      // 这里修改为从已有的_pairList里取对应索引的词对,不要每次生成新的
      final _getword = _pairList[index];
      final alreadySaved = _saved.contains(_getword);

      return Column(
        children: <Widget>[
          ListTile(
            title: Text(_getword.asPascalCase),
            trailing: Icon(
              alreadySaved ? Icons.favorite : Icons.favorite_border,
              color: alreadySaved ? Colors.red : null,
            ),
            onTap: () {
              setState(() {
                if (alreadySaved) {
                  _saved.remove(_getword);
                } else {
                  _saved.add(_getword);
                }
              });
            },
          ),
          const Divider(),
        ],
      );
    },
  );
}

内容的提问来源于stack exchange,提问作者Nick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 00:15:03