单个可变状态而不是多个不可变状态?

时间:2020-07-23 04:53:47

标签: flutter bloc state-management flutter-bloc

我正在使用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似乎有点多余,尤其是在我目前正在研究的一个具有复杂UI结构的项目中。

想知道是否有更好或正确的方法来实现这一目标?

1 个答案:

答案 0 :(得分:2)

您不应该只在false中返回operator ==。如果状态相等,则意味着两个布尔相等,然后用这种方式编程。

除此之外,如果您只有一个状态且变量很多,那么就没有Bloc警察来接您。我仍然会考虑使该状态不可变并每次都生成一个新状态,即使它是同一类。您可以从核心类中获取提示,并使用copyWith之类的ThemeData方法来简化创建新状态的过程。