Одно изменяемое состояние вместо нескольких неизменяемых состояний?

Использую библиотеку flutter_bloc v 6.0.0. Я ищу правильный способ использования одного изменяемого объекта, который содержит несколько состояний.

Например, вместо нескольких состояний:

enum RaisedButtonState {
  loading, idle
}
enum FlatButtonState {
  loading, idle
}

Я хочу использовать один объект состояния:

class MyState {
  bool raisedButtonLoading;
  bool flatButtonLoading;
  MyState({
    this.flatButtonLoading = false,
    this.raisedButtonLoading = false,
  });
}

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

emit(this.state..raisedButtonLoading = false);

потому что функция emit() имеет валидацию для проверки идентичных состояний

if (state == _state && _emitted) return;

В настоящее время для решения этой проблемы я добавил в MyState следующее:

@override
int get hashCode => super.hashCode;

@override
bool operator ==(Object o) {
  return false;
}

Я понимаю, что это может нарушить основную концепцию библиотеки. Однако необходимость создавать отдельные enum/class для разных состояний кажется немного избыточной, особенно в проекте, над которым я сейчас работаю, со сложной структурой пользовательского интерфейса.

Хотите знать, есть ли лучший или правильный способ добиться этого?


person Guster    schedule 23.07.2020    source источник


Ответы (1)


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

Кроме того, нет никакой полиции Блока, которая могла бы прийти и забрать вас, если у вас есть только одно государство с множеством переменных. Я бы все равно подумал о том, чтобы сделать это состояние неизменным и каждый раз генерировать новое состояние, даже если это один и тот же класс. Вы можете получить подсказку из основных классов и использовать copyWith метод, например ThemeData, чтобы упростить создание новых состояний.

person nvoigt    schedule 23.07.2020