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

Flutter ExpansionTile点击时仅更新当前展开项图标问题求助

解决Flutter ExpansionTile点击后所有trailing图标同步变化的问题

你当前的问题根源很明确:所有ExpansionTile共用了同一个isQuestionClicked布尔变量,只要这个全局状态改变,所有tile的trailing图标都会同步切换。要实现单个tile图标独立变化,只需要给每个tile单独维护展开状态即可,具体修改如下:

1. 替换全局状态为列表状态

在你的State类中,把单个布尔变量换成一个列表,用来记录每个tile的展开/收起状态:

late List<bool> expandedStates;

@override
void initState() {
  super.initState();
  // 初始化所有tile为收起状态
  expandedStates = List.generate(filteredFAQ.length, (index) => false);
}

2. 修改ExpansionTile的绑定逻辑

更新ExpansionTile的trailing图标判断和状态更新逻辑,让每个tile只对应自己的状态:

Column(
  children: List.generate(
    filteredFAQ.length,
    (index) => Column(
      children: [
        if (index > 0)
          Container(
            child: Column(
              children: <Widget>[
                ExpansionTile(
                  trailing: SvgPicture.string(
                    // 根据当前tile的状态显示对应图标
                    expandedStates[index] ? addPayeeArrowUp : rightArrow,
                    color: primary,
                  ),
                  onExpansionChanged: (bool expanded) {
                    setState(() {
                      // 只更新当前点击的tile的状态
                      expandedStates[index] = expanded;
                    });
                  },
                  // 注意:此处需补充title等ExpansionTile必填属性(原代码未体现)
                  title: Text(filteredFAQ[index].title),
                ),
              ],
            ),
          ),
      ],
    ),
  ),
);

关键改动说明

  • 用expandedStates列表替代单个变量,每个索引对应一个tile的独立状态
  • onExpansionChanged回调中仅修改当前点击tile对应的状态值,不会影响其他tile
  • trailing图标根据当前tile的状态单独判断,实现了点击哪个tile,只有哪个tile的图标切换

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 16:05:26