Flutter-只允许扩展一个ExpansionTile

时间:2019-02-05 12:51:23

标签: listview flutter flutter-layout

所以,我的问题是:

在Flutter中是否有一种方法可以只扩展动态生成的ListView的一个ExpansionTile?

例如我的ListView有三个ExpansionTiles,然后单击第一个,它会扩展。现在,如果我点击第二个,则第二个应展开,而第一个应将其自身关闭。

我考虑过使用修改后的ExpansionTile(https://stackoverflow.com/a/48935106/3775957),但无法提出解决方案。

在我的脑海中,它应该像将任务放入“ 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),
                );
              });

1 个答案:

答案 0 :(得分: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(),
                            ),
                          ),
                        ],
                      ),
                    );
                  },
                );