如何在 Flutter 中一次只扩展一个 ExpansionTile
How to Expand only one ExpansionTile at a time in Flutter
我用 ExpansionTile
构建了一个 Listview
。但是现在我希望如果我点击 ExpansionTile
,那么只有那个 ExpansionTile
应该打开,其他扩展 ExpansionTile
应该关闭。
请帮助我如何实现这一目标?
这是我的 ExpansionTile
代码
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Short Product"),
),
body: ListView.builder(
itemCount: Category_List.length,
itemBuilder: (context, i) {
return ExpansionTile(
title: Text(Category_List[i].cat_name),
children:_Product_ExpandAble_List_Builder(Category_List[i].cat_id)
);
},
)
);
}
_Product_ExpandAble_List_Builder(int cat_id) {
List<Widget> columnContent = [];
Product_List.forEach((product) => {
columnContent.add(
ListTile(
title: ExpansionTile(
title: Text(product.prod_name),
),
trailing: Text("${product.total_Qty} (Kg)"),
),
),
});
return columnContent;
}
}
提前致谢。
您可以通过编程方式更改应打开或关闭的扩展磁贴。
我做了类似你的代码。
int selected; //attention
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Short Product"),
),
body: ListView.builder(
key: Key('builder ${selected.toString()}'), //attention
itemCount: 10,
itemBuilder: (context, i) {
return ExpansionTile(
key: Key(i.toString()), //attention
initiallyExpanded: i == selected, //attention
title: Text(i.toString()),
children: _Product_ExpandAble_List_Builder(i),
onExpansionChanged: ((newState) {
if (newState)
setState(() {
selected = i;
});
else
setState(() {
selected = -1;
});
}));
},
),
);
}
_Product_ExpandAble_List_Builder(int cat_id) {
List<Widget> columnContent = [];
[1, 2, 4, 5].forEach((product) => {
columnContent.add(
ListTile(
title: ExpansionTile(
title: Text(product.toString()),
),
trailing: Text("$product (Kg)"),
),
),
});
return columnContent;
}
我用 ExpansionTile
构建了一个 Listview
。但是现在我希望如果我点击 ExpansionTile
,那么只有那个 ExpansionTile
应该打开,其他扩展 ExpansionTile
应该关闭。
请帮助我如何实现这一目标?
这是我的 ExpansionTile
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Short Product"),
),
body: ListView.builder(
itemCount: Category_List.length,
itemBuilder: (context, i) {
return ExpansionTile(
title: Text(Category_List[i].cat_name),
children:_Product_ExpandAble_List_Builder(Category_List[i].cat_id)
);
},
)
);
}
_Product_ExpandAble_List_Builder(int cat_id) {
List<Widget> columnContent = [];
Product_List.forEach((product) => {
columnContent.add(
ListTile(
title: ExpansionTile(
title: Text(product.prod_name),
),
trailing: Text("${product.total_Qty} (Kg)"),
),
),
});
return columnContent;
}
}
提前致谢。
您可以通过编程方式更改应打开或关闭的扩展磁贴。
我做了类似你的代码。
int selected; //attention
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Short Product"),
),
body: ListView.builder(
key: Key('builder ${selected.toString()}'), //attention
itemCount: 10,
itemBuilder: (context, i) {
return ExpansionTile(
key: Key(i.toString()), //attention
initiallyExpanded: i == selected, //attention
title: Text(i.toString()),
children: _Product_ExpandAble_List_Builder(i),
onExpansionChanged: ((newState) {
if (newState)
setState(() {
selected = i;
});
else
setState(() {
selected = -1;
});
}));
},
),
);
}
_Product_ExpandAble_List_Builder(int cat_id) {
List<Widget> columnContent = [];
[1, 2, 4, 5].forEach((product) => {
columnContent.add(
ListTile(
title: ExpansionTile(
title: Text(product.toString()),
),
trailing: Text("$product (Kg)"),
),
),
});
return columnContent;
}