
Я разработал двухуровневый Expandable ListView
. Сначала у меня есть список продуктов, и при расширении у меня есть список элементов, и когда я раскрываю элементы, он отображает список разных размеров элемента. У меня уже есть только одно расширение продукта. Но проблема, с которой я столкнулся, чтобы получить Single item Expansion
. Другими словами, я хочу, чтобы, если элемент расширен, и я нажимаю на другой элемент, первое расширение должно закрываться, и должно отображаться только описание одного элемента.
Я использую следующий код.
import 'package:flutter/material.dart';
import 'package:food_delivery_admin_app/Constants.dart';
class Short_Product extends StatefulWidget {
@override
_Short_ProductState createState() => _Short_ProductState();
}
class _Short_ProductState extends State<Short_Product> {
int selected;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Short Product"),
),
body: Theme(
data: Theme.of(context).copyWith(
textSelectionColor: Colors.green,
accentColor: Colors.green,
errorColor: Colors.red),
child:
Container(
margin: EdgeInsets.symmetric(vertical: 8,horizontal: 10),
decoration: BoxDecoration(
border: Border.all(width: 3,color: Colors.white24, ),
borderRadius: BorderRadius.all(Radius.circular(15))
),
child: ListView.builder(
key: Key('builder ${selected.toString()}'),
itemCount: Category_List.length,
itemBuilder: (context, i) {
return ExpansionTile(
key: Key(i.toString()),
initiallyExpanded: i == selected,
title: Text(
Category_List[i].cat_name,
style: TextStyle(
fontSize: 20.0,
color: Colors.green,
fontWeight: FontWeight.bold,
),
),
onExpansionChanged: ((newState) {
if (newState)
setState(() {
selected = i;
});
else
setState(() {
selected = -1;
});
}),
children: <Widget>[
Column(
children: _Product_ExpandAble_List_Builder(
Category_List[i].cat_id))
],
);
},
),
)
)
);
}
_Product_ExpandAble_List_Builder(int cat_id) {
List<Widget> columnContent = [];
Product_List.forEach((product) =>
{
if (product.cat_id == cat_id && product.total_Qty < 500)
{
columnContent.add(
ListTile(
title: ExpansionTile(
title: Text(
product.prod_name,
textAlign: TextAlign.start,
style: TextStyle(
fontSize: 20.0,
color: Colors.green,
fontWeight: FontWeight.bold,
),
),
children: _Size_ExpandAble_List_Builder(product.prod_id)),
trailing: Text("${product.total_Qty} (Kg)",
style: TextStyle(
fontSize: 20.0,
color: Colors.green,
fontWeight: FontWeight.bold,
),),
),
),
}
});
return columnContent;
}
_Size_ExpandAble_List_Builder(int prod_id) {
List<Widget> columnContent = [
ListTile(
leading: Text('Id',style: TextStyle(fontWeight: FontWeight.bold),),
title: Text('Packet (Kg)',style: TextStyle(fontWeight: FontWeight.bold),),
trailing: Text('Qty',style: TextStyle(fontWeight: FontWeight.bold),),
)
];
Product_Size_List.forEach((size) => {
if (size.prod_id == prod_id)
{
columnContent.add(
ListTile(
leading: Text("${size.size_id}",),
title: Text(
size.packet_size.toString(),
style: TextStyle(
fontSize: 20.0,
fontWeight: FontWeight.bold,
),
),
trailing: Text(
"${size.packet_qty} (Kg)",
style: TextStyle(
fontSize: 18.0,
),
),
),
)
}
});
return columnContent;
}
}
См. Изображение для получения дополнительной информации