单个可变状态而不是多个不可变状态?
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
)来简化创建新状态的过程。
我正在使用库 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
)来简化创建新状态的过程。