我正在尝试创建一个包含
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(),
);
所以需要明确的是:当选择一个图块时,它应该展开,如果有另一个已经展开的图块,它应该折叠,所以一次只有一个展开。
我认为您不需要 ListView,但我认为您可能想要使用 Silver List
SliverList 和 SliverGrid
如果您仍然想遵循 ListView 方法,您可以查找此链接,了解如何创建包含不同类型项目的列表
您必须定义自己的构建方法,以便定义项目的结构。
事实证明,我在 Widget 的
build
方法内部生成列表时犯了错误,因此它在每次重建时生成一个新列表,并且控制器不匹配。拿出来后,一切都按预期工作。
快速说明: 如果您使用带有大量
ListView.builder
的 ExpansionTiles
,则应指定 initiallyExpanded
属性,因为在滚动 ListView 重建时,否则它将折叠展开的图块。