ListView 一次扩展一个图块

问题描述 投票:0回答:2

我正在尝试创建一个包含

ListView
ExpansionTiles
小部件,并且我只想一次仅展开一个图块。我使用了相当多的数据,所以我使用
ListView.builder
,因此,当我尝试实现折叠时,它会抛出错误,并且文档指定您无法在构建器内调用控制器方法。

我的代码如下所示:

return ListView.builder(
          itemCount: data.length,
          itemBuilder: (context, index) {
            return ExpansionTile(
              controller: expansionControllers[index],
              leading: Text(data[index].code),
              title: Text(data[index].name),
              onExpansionChanged: (value) async {
                if (value) {
                  setState(() {
                    prevIndexExpanded = index;
                  });

                  //Do stuff
                }
              },
              children: 
                      Row(
                        children: [
                            ...
                          ],
                      ),
            );
          },
        );

我有一个

prevIndexExpanded
跟踪当前展开的图块,并且我为每个图块生成了
ExpansionTileController()
列表。

final expansionControllers = List.generate(
          data.length,
          (index) => ExpansionTileController(),
        );

所以需要明确的是:当选择一个图块时,它应该展开,如果有另一个已经展开的图块,它应该折叠,所以一次只有一个展开。

flutter listview flutter-listview
2个回答
1
投票

我认为您不需要 ListView,但我认为您可能想要使用 Silver List
SliverList 和 SliverGrid

如果您仍然想遵循 ListView 方法,您可以查找此链接,了解如何创建包含不同类型项目的列表

您必须定义自己的构建方法,以便定义项目的结构。


0
投票

事实证明,我在 Widget 的

build
方法内部生成列表时犯了错误,因此它在每次重建时生成一个新列表,并且控制器不匹配。拿出来后,一切都按预期工作。

快速说明: 如果您使用带有大量

ListView.builder
ExpansionTiles
,则应指定
initiallyExpanded
属性,因为在滚动 ListView 重建时,否则它将折叠展开的图块。

© www.soinside.com 2019 - 2024. All rights reserved.