У меня есть кнопка действия с плавающей точкой, при нажатии на нее открывается нижний лист. Я использую блок с замороженной библиотекой. когда я прикрепляю к нижней части действия с плавающей запятой после горячего перезапуска приложения, появляется приложение нижнего листа, когда я снова нажимаю кнопку действия с плавающей точкой, никаких действий не происходит.

код блока:

class NoteBloc extends Bloc<NoteEvent, NoteState> {
  NoteBloc() : super(const _Initial());

  @override
  Stream<NoteState> mapEventToState(
    NoteEvent event,
  ) async* {
    if(event is AddNoteClickedEvent){
      yield const AddNoteClickedState();
    }
  }
}

код события:

@freezed
class NoteEvent with _$NoteEvent {
  const factory NoteEvent.started() = _Started;
  const factory NoteEvent.addNoteClickedEvent() = AddNoteClickedEvent;
}

код штата:

@freezed
class NoteState with _$NoteState {
  const factory NoteState.initial() = _Initial;
  const factory NoteState.addNoteClickedState() = AddNoteClickedState;
}

код нижнего листа:

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
    return BlocConsumer<NoteBloc, NoteState>(
      listener: (context, state) {
        state.maybeMap(
          orElse: () {},
          addNoteClickedState: (AddNoteClickedState state) {
            return _scaffoldKey.currentState!.showBottomSheet(
              (context) => const AddNewNoteBottomSheet(),
            );
          },
        );
      },
      builder: (context, state) {
        return  Scaffold(
            key: _scaffoldKey,
            floatingActionButton: InkWell(
              onTap: () {
                BlocProvider.of<NoteBloc>(context)
                    .add(const NoteEvent.addNoteClickedEvent());
              },
              child: Icon(
                  Icons.add,
                  // Icons.save,
                  color: const Color(whiteColor),
                  size: 9.h,
        ),
      },
    );
  }
}
1
Winter 15 Сен 2021 в 10:37

2 ответа

Лучший ответ

При использовании замороженных классов оператор == выполняет глубокое равенство, поэтому каждый экземпляр состояния вашего блока равен предыдущему. В таком случае новое состояние не генерируется. Вам нужно, чтобы ваше новое состояние отличалось от предыдущего.

0
Avi 15 Сен 2021 в 18:09

Обычно я пишу такой код

class NoteBloc extends Bloc<NoteEvent, NoteState> {
  NoteBloc() : super(const _Initial());

  @override
  Stream<NoteState> mapEventToState(
    NoteEvent event,
  ) async* {
    yield* event.when(
     started: () async*{
        yield initial(),
      },
     addNoteClickedState: ()async*{
        yield addNoteClickedState();
      },
    );
  }
}

И это всегда работает

0
Mohamed Kamel 16 Сен 2021 в 23:21