ExpansionTile更新问题

来源:2-4 iOS开发者如何快速上手Flutter开发(一)

慕桂英5458379

2025-08-27

麻烦问下,为什么我调用setState后 页面没有更新 initiallyExpanded是只在第一次调用时生效吗?


https://img1.sycdn.imooc.com/szimg/0973696809ade03706580468.jpg

写回答

1回答

CrazyCodeBoy

2025-09-06

initiallyExpanded  仅在  ExpansionTile  第一次构建时生效,后续要改变展开/折叠状态,需通过动态更新状态 + 触发  setState  来让  ExpansionTile  重新渲染。
试试这个
class _YourPageState extends State<YourPage> {
  // 记录每个城市的展开状态,默认都为 false(折叠)
  Map<String, bool> _expandedStatus = {};

  Widget _item(String city, List<String> subCities) {
    return ExpansionTile(
      title: Text(city, style: TextStyle(fontSize: 20, color: Colors.black54)),
      // 初始展开状态由 _expandedStatus[city] 决定
      initiallyExpanded: _expandedStatus[city] ?? false,
      onExpansionChanged: (bool isExpanded) {
        // 核心:更新“当前城市”的状态,并把“其他城市”设为折叠
        setState(() {
          _expandedStatus = {
            for (var key in cityNames.keys) // cityNames 是所有城市的数据源
              key: key == city ? isExpanded : false,
          };
        });
      },
      children: _subCities(city, subCities),
    );
  }

  // ... 其他代码(如 _subCities 方法、build 方法等)
}
0
0

慕课甄选-Flutter零基础极速入门到进阶实战

全新Flutter从入门到进阶,实战仿携程网App

709 学习 · 334 问题

查看课程