我有ListView和ExpansionTileCard。所有内容都正常显示,但是有一个问题,当我单击ExpansionTileCard小部件时,会打开其他信息,而当我单击另一张卡时,前面的卡片不会关闭。我想打一些卡,以便只有它是开放的。这是我的代码:
Widget _buildList(OrdersEntity ordersEntity) {
return ListView.separated(
itemCount: ordersEntity.length,
itemBuilder: (BuildContext context, int position) {
return _withButton(ordersEntity, position);
},
separatorBuilder: (BuildContext context, int index) {
return const Divider(
height: 0,
);
},
);
}
Widget _withButton(OrdersEntity ordersEntity, int position) {
return Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
_getRow(
name: ordersEntity.itemAtPositionName(position),
date: ordersEntity.itemAtPositionDate(position),
status: ordersEntity.itemAtPositionStatus(position),
id: ordersEntity.idAtPosition(position),
cost: ordersEntity.itemAtPositionCost(position),
warranty: ordersEntity.itemAtPositionWarranty(position),
master: ordersEntity.itemAtPositionMasterName(position),
bonus: '122',
onTap: (regionId) {
}),
],
);
}
Widget _getRow({
required String name,
required String date,
required String status,
required String cost,
required String warranty,
required String master,
required String bonus,
required String id,
required ValueChanged<String> onTap,
}) {
return Material(
color: Colorz.white,
child: InkWell(
splashColor: Colorz.selectedListItemBG2,
child: BlocBuilder<OrderHistoryBloc, OrderHistoryState>(
buildWhen: (previous, current) =>
current is OrdersRemoveItemState,
builder: (context, state) {
bool progress;
if (state is OrdersRemoveItemState && id == state.nameId) {
progress = state.isProgress;
} else {
progress = false;
}
return Stack(
children: [
progress
? Center(
child: Container(
color: Colorz.transparent30,
child: const PlatformProgressIndicator()),
)
: const EmptyWidget(),
_listItemColumn(
name: name,
date: date,
status: status,
cost: cost,
warranty: warranty,
bonus: bonus,
master: master,
id: id
)
],
);
}),
onTap: () {},
),
);
}
_listItemColumn({
required String name,
required String date,
required String status,
required String master,
required String bonus,
required String cost,
required String warranty,
required String id,
}) {
return Column(children: [
Padding(
padding: EdgeInsets.all(10),
child: Container(
padding: EdgeInsets.only(top: 5), //control green
decoration: BoxDecoration(
color: _colorStatus(status),
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(24),
topRight: Radius.circular(24),
),
),
child: Container(
decoration: const BoxDecoration(
color: Colors.white,
borderRadius:BorderRadius.only(
topLeft: Radius.circular(24),
topRight: Radius.circular(24),
),
),
child: ExpansionTileCard(
initiallyExpanded: false,
title: Text(name),
subtitle: Text(date),
trailing: Wrap(
spacing: 12, // space between two icons
children: <Widget>[
Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Material(
color: Colorz.transparents,
child: InkWrapper(
splashColor: Colorz.lighterGray,
child: IconButton(
alignment: Alignment.center,
icon: SvgPicture.asset(
Img.listItemMenu,
),
onPressed: null
),
onTap: () {
},
),
),
Text(
status,
textAlign: TextAlign.left,
maxLines: 1,
style: TextStyle(
color: _colorStatus(status),
overflow: TextOverflow.ellipsis,
fontSize: FontSize.tiny,
),
),
],
)
],
),
children: [
_buildTextLine(
Titles.orderMaster,
null,
master,
),
Container(
height: Margins.tiny,
)
],
),
),
)
),
]
);
}
}
发布于 2022-07-20 12:09:14
我认为在这种情况下最好使用ExpansionPanelList
。保持状态的int。
int? _selectedIndex;
@override
Widget build(BuildContext context) {
return Scaffold(
body: SingleChildScrollView(
child: ExpansionPanelList(
expansionCallback: (i, b) {
if (_selectedIndex == i)
_selectedIndex = null;
else
_selectedIndex = i;
setState(() {});
},
children: List.generate(
23,
(index) => ExpansionPanel(
canTapOnHeader: true,
isExpanded: index == _selectedIndex,
headerBuilder: (context, isExpanded) {
return Text("header $index");
},
body: Column(
children: [
Text("body $index"),
],
),
),
),
),
),
);
}
https://stackoverflow.com/questions/73050987
复制相似问题