Как запустить прослушиватель блоков с одним и тем же состоянием несколько раз?

#flutter #bloc

Вопрос:

Мой блок возвращает состояние ошибки сети, если нет подключения к Интернету. И он покажет виджет с кнопкой «Повторить попытку». Когда я нажимаю кнопку, когда подключение к Интернету все еще отсутствует, она вернет то же состояние, то же сообщение и сбой. Как я снова вызову прослушиватель блока с тем же состоянием?

Состояние блока:

  class NetworkErrorState extends MyBlocState {
      final String message;
      final Failure failure;
    
      NetworkErrorState ({this.failure, this.message});
      @override
      List<Object> get props => [failure, message];
    }
 

Исключение:

 class ServerException implements Exception {
  final String message;

  ServerException({this.message});
}
 

Неудача:

 abstract class Failure extends Equatable {
  final List properties = const <dynamic>[];
  Failure([properties]);

  @override
  List<Object> get props => properties;
}

class ServerFailure extends Failure {
  final String message;

  ServerFailure({this.message});
  @override
  List<Object> get props => [message];
}
 

Комментарии:

1. Вероятно, добавление setState в прослушиватель помогло бы

Ответ №1:

Я не думаю, что это возможно по замыслу. Но я вижу два очень жизнеспособных варианта. Я бы, наверное, выбрал номер 1…

  1. выделите другое состояние между двумя вашими состояниями сетевых ошибок. Нажатие кнопки «повторить попытку» (вызываемая функция) может сначала вызвать, например, состояние повторной попытки подключения. Тогда ваш пользовательский интерфейс мог бы отображать что-то приятное?

Или…

  1. Другой способ обойти это-передать дополнительную переменную с изменяющимся состоянием, чтобы она не была распознана как одно и то же состояние (убедитесь, что переменная учитывается приравниваемыми реквизитами). Это может быть, например, номер попытки повторного подключения или отметка времени, когда была сделана последняя попытка.

Комментарии:

1. Лично я соглашусь с вашим первым решением. Именно такой подход я обычно использую при использовании блока

2. Да, конечно. На самом деле первое не означает, что у вас не может быть и второго. Пользовательский интерфейс, возможно, захочет указать, сколько попыток подключения было сделано 🙂

3. У меня не было необходимости отслеживать попытки подключения, но когда я это делаю, ваш подход определенно имеет смысл 🙂