ExpansionTile
立即关闭的原因是,当你滚动listview
时,特别是使用ListView.builder
创建的列表会被重新构建,因此,如果你想保留某个ExpansionTile
的状态,你应该在build
函数之外保存其状态值,并使用initiallyExpanded
属性: List<bool> status = <bool>[] ; //store the statuses of your tiles here
ExpansionTile(
title: Text('Item'),
backgroundColor: Colors.transparent,
initiallyExpanded: status[index],
),
使用onExpansionChanged
回调函数从列表中添加和删除索引,并在包含该索引时设置initiallyExpanded
。
class _WidgetState extends State<Widget> {
List expandedIndices = [];
@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView.builder(
physics: const BouncingScrollPhysics(
parent: AlwaysScrollableScrollPhysics()),
itemCount: 10,
itemBuilder: (BuildContext context, int index) {
return ExpansionTile(
title: Text('Item'),
onExpansionChanged: (expanded) {
if(expanded) {
expandedIndices.add(index);
}
else{
expandedIndices.remove(index);
}
},
initiallyExpanded: expandedIndices.contains(index),);
}
)
);
}
}