Я реализовал событие 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
Выход:
Привет!
Привет!
Привет!
Привет!
Привет!
это тоже произошло здесь вопрос по ссылке, там вы можете увидеть, предоставлен ли также код
Это может произойти из блока, пожалуйста, рассмотрите возможность включения минимального воспроизводимого примера
Я не понимаю, что нужно вам обоим, поэтому я следую тому, чего вы все хотите. теперь вы оба можете ответить на мою проблему? я уже прикрепил свой код
Поведение, которое вы наблюдаете, происходит из-за того, как события обрабатываются в вашем 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());
},
);
Вы должны предоставить полную демонстрацию, а также ожидаемые и фактические результаты выполнения.