BLoC 模式最佳实践 - 在 BLoC 类中存储数据是否合法?

Avi*_*Avi 6 bloc

我是 Flutter 和 BLoC 设计模式的新手。然而,BLoC 的概念看起来很简单,我想我很好理解。

有时,在查看我同事的代码时,我发现在实现 BLoC 时,他们倾向于将数据存储在 BLoC 类中。我相信这是错误的,数据属于状态类。如果需要在可以创建状态之前将其传递或存储在某处,则应将其存储在触发更改的事件实例中,而不是 BLoC 本身。

我的理解是 BLoC 类是一个状态机,其唯一目的是将事件映射到状态并且除了定义的“状态”类之外没有其他状态。这是关注点分离 - 事件类应该存储触发更改的数据,状态类应该存储更改后的数据,并且 BLoC 应该处理操作该数据并将其从事件映射到状态。

如果将数据存储在 BLoC 类中,状态机将其功能从 更改(event, state0) => state1(event, state0, blocData) => state1。很明显,如果你想对你的 BLoC 进行单元测试,你的测试的复杂性会增加,因为你需要测试用例|event| X |state| X |blocData|而不是用|event| X |state|例(意味着每种类型的可能值数量的笛卡尔乘法)。可以声称它并没有真正影响可能值的数量,因为我们只会移动blocDatastate. 但是,我的主张是,如果将数据封装在一起,通常会发现它们是相互依赖的,有些组合是无关紧要的,但是只有在将它们封装在一起时才能保持这种依赖关系,或者至少在封装在一起时才能保护它不被破坏.

另一个原因是,查看状态并发送事件的应用程序代码可能会产生不确定的结果。这是因为 BLoC 实例具有影响其功能的“脏”状态。

我想听听在这种设计模式方面有更多经验的开发人员的意见。如果您可以发布一些有关此问题的文章的参考资料,那也很棒。我没有找到有关此问题的任何具体信息。