只允许展开一个 ExpansionTile

3
我的问题是:
在Flutter中,是否有一种方法可以只允许动态生成的ListView中的一个ExpansionTile展开?
例如,我的ListView有三个ExpansionTiles,我点击第一个,它会展开。现在,如果我点击第二个,第二个应该展开,而第一个应该关闭自己。
我考虑使用这个修改后的ExpansionTile(https://dev59.com/jVUM5IYBdhLWcg3wYvXl#48935106),但是无法想出解决方案。
在我的脑海中,它应该像将此任务放入“onExpansionChanged”方法中一样工作,但我不知道如何做到。
我像这样构建我的ListView:
ListView.builder(
   itemCount: myArray.length,
   itemBuilder: (context, index) {
          return ExpansionTile(
             backgroundColor: Colors.grey[200],
                key: PageStorageKey('${myArray[index].name}'),
                title: Text(myArray[index].name),
                children: _buildChildrenWidgets(
                      groupName: myArray[index].name,
                      childrenNames: myArray[index].anotherArray),
                );
              });

ExpansionTile 构造函数中有一个 initiallyExpanded 参数,因此在创建新的 ExpansionTile 时请使用它。 - pskink
我知道这个问题。所有的 ExpansionTile 都是使用 initiallyExpanded 的默认值 false 创建的。问题出现在运行时:当我点击另一个 Tile 来展开它时,其他已经展开的 Tile 仍然保持展开状态。但是我希望当另一个 Tile 展开时,其他的都关闭。 - Kajetan Jauk
因此,在点击时构建您的三个“ExpansionTile” - 其中两个(未被点击)将具有“initiallyExpanded:false”,而被点击的“ExpansionTile”将具有“initiallyExpanded:true”。 - pskink
但是每次我点击ExpansionTile时重建布局对性能来说不是太重了吗? 因为我的瓷砖不是静态的,我使用FutureBuilder从json文件中加载它们的值 - 另外,ExpansionTile没有像ListTileInkWell那样的onTap - Kajetan Jauk
不会影响性能,而且它具有onExpansionChanged - pskink
所以我假设通过某种方式使用 onExpansionChanged 是正确的吗? - Kajetan Jauk
1个回答

0

您可以像这样使用ExpansionPanelList

 ListView.builder(
                  itemCount: snapshot.data.length,
                  itemBuilder: (BuildContext context, int i) {
                    return Card(
                      child: ExpansionPanelList(
                        expansionCallback: (int index, bool status) {
                          setState(() {
                            _activeMeterIndex =
                                _activeMeterIndex == i ? null : i;
                          });
                        },
                        children: [
                          ExpansionPanel(
                            isExpanded: _activeMeterIndex == i,
                            headerBuilder:
                                (BuildContext context, bool isExpanded) =>
                                    Container(
                              padding: const EdgeInsets.only(left: 15.0),
                              alignment: Alignment.centerLeft,
                              child: Text(
                                snapshot.data[i].category,
                              ),
                            ),
                            body: Column(
                              children: snapshot.data[i].subcategory.map((e) {
                                return Text(e);
                              }).toList(),
                            ),
                          ),
                        ],
                      ),
                    );
                  },
                );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接