【问题标题】:How to listen to state properties changes Flutter bloc pattern如何监听状态属性变化 Flutter bloc 模式
【发布时间】:2020-06-15 07:29:36
【问题描述】:

我正在开发一个 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 的人时。这里没有明确的过渡,但我需要一个。

我尝试不使用 Equatable,使用 Equatable。使用 BlocConsumer、BlocListener(所有这些都来自 flutter_bloc 包)。我不知道还能做什么。

我希望你明白我想要做什么。谢谢大家!

【问题讨论】:

    标签: android flutter state bloc


    【解决方案1】:

    您是否尝试过覆盖模型的 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);
    
    } 
    

    【讨论】:

      【解决方案2】:

      据我了解,即使您传递相同的状态,您也希望基本上重建状态。为此,您需要创建状态属性的新副本,以便它捕获更改。

      更多信息在这里: https://bloclibrary.dev/#/faqs

      【讨论】:

        猜你喜欢
        • 2021-02-17
        • 2020-03-26
        • 2022-10-23
        • 2020-04-29
        • 2020-03-27
        • 2011-01-31
        • 2019-08-04
        • 2017-05-31
        • 2015-05-23
        相关资源
        最近更新 更多