我有一个带有三个按钮的模态底部表。每个按钮都有一个名为 isSelectedStatusButton 的属性。当为 true 时,按钮的颜色将变为蓝色。我遇到的问题是 onPressed 函数不会更新状态变量的状态。这会导致按钮不改变颜色并且 showModalBottom 工作表返回 null。我觉得我对 StatefulBuilder 的实现是不正确的。如果我需要提供任何父代码,请告诉我。
class StatusBottomSheet {
final SearchState state;
StatusBottomSheet(this.state);
Future<TransitionableState?> showStatusBottomSheet(BuildContext context) {
return showModalBottomSheet<TransitionableState>(
context: context,
builder: (context) {
return StatefulBuilder(builder: (BuildContext context, StateSetter setModalState) {
TransitionableState? status = state.filteredStatus;
return Container(
child: Padding(
padding: const EdgeInsets.only(left: 16.0, right: 16, top: 18, bottom: 18),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Padding(
padding: const EdgeInsets.only(bottom: 16.0),
child: Text(
'Status',
style: GoogleFonts.sourceSansPro(
color: CoreTheme.black, fontWeight: FontWeight.bold, fontSize: 16),
),
),
Divider(color: CoreTheme.gray),
Padding(
padding: const EdgeInsets.only(top: 25.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
StatusButton(
labelText: 'To Do',
isSelectedStatusButton: status == TransitionableState.toDo,
onPressed: () {
setModalState(() => status = TransitionableState.toDo);
},
),
StatusButton(
labelText: 'In Progress',
isSelectedStatusButton: status == TransitionableState.inProgress,
onPressed: () {
setModalState(() => status = TransitionableState.inProgress);
},
),
StatusButton(
labelText: 'Complete',
isSelectedStatusButton: status == TransitionableState.complete,
onPressed: () {
setModalState(() => status = TransitionableState.complete);
},
),
],
),
),
Padding(
padding: const EdgeInsets.only(top: 25),
child: Row(
children: [
Spacer(),
TextButton(
onPressed: () => Navigator.of(context).pop(),
child: Text(
'CANCEL',
style: GoogleFonts.sourceSansPro(
color: CoreTheme.primary,
fontSize: 16,
fontWeight: FontWeight.bold),
),
),
TextButton(
onPressed: () => Navigator.of(context).pop(status),
child: Text(
'OK',
style: GoogleFonts.sourceSansPro(
color: CoreTheme.primary,
fontSize: 16,
fontWeight: FontWeight.bold),
),
)
],
),
),
],
),
),
);
});
});
}
}
我叫它这里
class _Filters extends StatelessWidget {
final SearchState sessionState;
_Filters({required this.sessionState});
_onStatusPressed(BuildContext context) async {
TransitionableState? status =
await StatusBottomSheet(sessionState).showStatusBottomSheet(context);
if (status != null) {
context.read<SearchCubit>().onFilteredStatusChanged(status);
await context.read<SearchCubit>().searchSessions(
sessionState.searchTerm,
sessionId: sessionState.filteredSessionType?.id,
userIds: sessionState.filteredUserIds,
status: status,
);
}
}
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.only(left: 16.0, top: 24, bottom: 28, right: 16),
child: Container(
height: 32,
child: ListView(
scrollDirection: Axis.horizontal,
shrinkWrap: true,
children: [
_FilterButton(
isActive: sessionState.filteredStatus != null,
labelText: _getStatusLabel(),
onPressed: () async => await _onStatusPressed(context),
),
],
),
),
);
}