0

我有一个带有三个按钮的模态底部表。每个按钮都有一个名为 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),
            ),
          ],
        ),
      ),
    );
  }
4

0 回答 0