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

Single mutable state instead of multiple immutable states?

我正在使用库 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 结构的项目中。

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

你的 operator == 中不应该只有 return false。如果一个状态相等意味着两个布尔值相等,那么就这样编程。

除此之外,如果你只有一个有很多变数的州,就没有 Bloc 警察来抓你。我仍然会考虑使该状态不可变并每次都生成一个新状态,即使它是相同的 class。您可以从核心 classes 中得到提示,并使用 copyWith 方法(例如 ThemeData)来简化创建新状态的过程。