如何聆听状态属性的变化Flutter团体模式

时间:2020-03-03 00:14:13

标签: android flutter state bloc

我正在开发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包)。我不知道该怎么办。

希望您能理解我要做什么。谢谢大家!

2 个答案:

答案 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);

}