我正在开发Flutter应用,但遇到标题提到的问题。
BLoC使用人员模型的属性来管理表单的行为。
所以我的状态类看起来像这样。
class SynchronizedForm extends Equatable {
final PersonModel savedModel;
final PersonModel actualModel;
SynchronizedForm(this.savedModel, this.actualModel);
}
注意:PersonModel还扩展了Equatable。
我已经向BLoC添加了一个简单的委托,目的是让我知道在应用程序运行期间到底发生了什么。
代表在所有状态转换上打印。
actualModel的属性通过事件(BLoC模式)进行更新。
class PersonBloc extends Bloc<PersonEvent, PersonState> {
PersonModel person;
PersonBloc (PersonModel person);
@override
PersonState get initialState => SynchronizedForm (person, person.copyWith());
@override
Stream<PersonState> mapEventToState(
PersonEvent event) async* {
if (event is ModifyPerson)
yield* _modifyPerson();
else if ...
}
Stream<PersonState> _modifyPerson(
ModifyPerson event) async* {
PersonModel actual = state.actualModel;
actual.prop = event.value;
yield SynchronizedForm (
state.savedModel,
actual);
}
}
所以主要的问题是我的屏幕上有使用此状态更改的小部件,但是当实际状态为SynchronizedForm且我修改人员时,我将再次返回SynchronizedForm。这里没有明确的过渡,但我需要一个。
我试着没有平等,有平等。使用BlocConsumer,BlocListener(全部来自flutter_bloc包)。我不知道该怎么办。
希望您能理解我要做什么。谢谢大家!
答案 0 :(得分:0)
据我了解,即使传递相同的状态,您也希望从根本上重建状态。为此,您需要创建状态属性的新副本,以便它捕获更改。
更多有关此内容: https://bloclibrary.dev/#/faqs
答案 1 :(得分:0)
您是否尝试覆盖模型的props
属性?
来自等价代码文档:
/// Equatables override their own `==` operator and [hashCode] based on their
/// `props`.
因此您的模型应如下所示:
class SynchronizedForm extends Equatable {
final PersonModel savedModel;
final PersonModel actualModel;
// Add this
@override
List<Object> get props => [savedModel, actualModel];
SynchronizedForm(this.savedModel, this.actualModel);
}