Equatable не работает в событии блока и всегда запускается с одним и тем же значением

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

push event

BlocProvider.of<FeedbackBloc>(context) 
      .add(SubmitFeedbackEvent(userFeedback: 'Hallo!'));

from event file

sealed class FeedbackEvent extends Equatable {
  const FeedbackEvent();

  @override
  List<Object> get props => [];
}

final class SubmitFeedbackEvent extends FeedbackEvent {
  const SubmitFeedbackEvent({required this.userFeedback});

  final String userFeedback;

  @override
  List<Object> get props => [userFeedback];
}

from bloc file

class FeedbackBloc extends Bloc<FeedbackEvent, FeedbackState> {
  FeedbackBloc() : super() {
    on<SubmitFeedbackEvent>((event, emit) async {

      final userFeedback = event.userFeedback;

      print(userFeedback);

    });
  }
}

Но когда я проверяю событие, оно все равно срабатывает каждый раз, когда я нажимаю одно и то же значение userFeedback.

when i click button 5 times to push event:

expectation

Выход: Привет!

reality

Выход:

Привет!

Привет!

Привет!

Привет!

Привет!

Вы должны предоставить полную демонстрацию, а также ожидаемые и фактические результаты выполнения.

Chihiro 22.08.2024 04:51

это тоже произошло здесь вопрос по ссылке, там вы можете увидеть, предоставлен ли также код

ryandra 22.08.2024 04:56

Это может произойти из блока, пожалуйста, рассмотрите возможность включения минимального воспроизводимого примера

Md. Yeasin Sheikh 22.08.2024 05:24

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

ryandra 22.08.2024 05:43
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Поведение, которое вы наблюдаете, происходит из-за того, как события обрабатываются в вашем FeedbackBloc.

Пакет Equatable помогает сравнить два объекта, чтобы определить, считаются ли они равными. Это особенно полезно для сравнения состояний, чтобы предотвратить ненужную перестройку пользовательского интерфейса. Однако это не мешает Bloc обрабатывать идентичные события. Даже если два события равны, Bloc их обработает, поскольку каждый вызов добавления создает новый экземпляр SubmitFeedbackEvent. Таким образом, Bloc обрабатывает каждое событие, поскольку они являются отдельными экземплярами.

Если ваша цель — предотвратить обработку одного и того же события несколько раз, вам потребуется реализовать дополнительную логику в вашем FeedbackBloc, чтобы отслеживать последнее обработанное событие и сравнивать его с новым.

class FeedbackBloc extends Bloc<FeedbackEvent, FeedbackState> {
  FeedbackBloc() : super() {
    on<SubmitFeedbackEvent>((event, emit) async {
      if (_lastEvent == event) {
        print('Duplicate event detected, ignoring.');
        return;
      }

      _lastEvent = event;

      final userFeedback = event.userFeedback;
      print(userFeedback);

      // Handle your event logic here
    });
  }

  SubmitFeedbackEvent? _lastEvent;  // Track the last processed event
}
Ответ принят как подходящий

Я согласен с заявлением @Waseem Abbas выше,

Пакет Equatable помогает сравнивать два объекта, чтобы определить, считаются ли они равными. Это особенно полезно для сравнения состояний, чтобы предотвратить ненужную перестройку пользовательского интерфейса. Однако это не мешает Блоку обрабатывать идентичные события. Even if two events are equal, the Bloc will handle them because each add call creates a new instance of SubmitFeedbackEvent. Таким образом, Bloc обрабатывает каждое событие, поскольку они являются отдельными экземплярами.

Другой разработчик тоже испытал это. Но у меня есть другое решение, более аккуратное и предоставленное создателем Блока.

Моё решение: я использую bloc_concurrency

Итак, я реализую «transformer: droppable()» из bloc_concurrency. Почему я использую dropable? потому что я пытаюсь отменить все push-события, когда первое push-событие все еще продолжается. Таким образом, когда пользователь последовательно нажимает кнопку 5 раз, событие принимает триггер только один раз.

// file_bloc.dart

on<SubmitFeedbackEvent>(
  transformer: droppable(),
  (event, emit) async {

    // do your code in here

    emit(ToState());

  },
);

Другие вопросы по теме