如何监听状态属性变化 Flutter bloc 模式
Posted
技术标签:
【中文标题】如何监听状态属性变化 Flutter bloc 模式【英文标题】:How to listen to state properties changes Flutter bloc pattern 【发布时间】: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 包)。我不知道还能做什么。
我希望你明白我想要做什么。谢谢大家!
【问题讨论】:
【参考方案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
【讨论】:
以上是关于如何监听状态属性变化 Flutter bloc 模式的主要内容,如果未能解决你的问题,请参考以下文章
为啥尽管观察者的状态发生变化,但应用程序重启后 Flutter BloC UI 没有更新?