【问题标题】:Where to perform state changes with Clean Architecture in Flutter?Flutter 中的 Clean Architecture 在哪里执行状态更改?
【发布时间】:2021-06-15 19:11:10
【问题描述】:

在 Flutter 中使用 Clean Architecture 时,我们会看到类似这样的图表:

(我写了 MobX 包作为示例,但它可以是 BLoC、Redux 之类的任何东西......)

我可能对此图有疑问,因为 Store 位于表示层中,负责更改状态

想象一下,应用程序通过 TodosStore 中名为“getTodos”的方法加载待办事项列表。 “getTodos”实现可能是:

 _state = State.loading();
 final result = GetTodos();
 _state = State.done();

(我把事情简单化了)

它首先将状态更新为加载,调用返回列表的用例并将状态设置为完成。

我在这里发现的问题:

  1. 商店负责调用 UC、更新状态、处理错误...
  2. 用例只是一个桥梁,不处理业务逻辑

这是一个相当简单的例子。 但是让我们想象一下,我有一个包含 3 个不同数据列表的视图(这可能是一个荒谬的例子)。 该视图与 3 个不同的商店交互。应用栏中有一个按钮。它的目标是清除 3 个列表。

如何实现这种行为?

  • 按钮 onPressed 方法需要为每个商店调用“clearData”
  • 每个商店的“clear”方法只会更新其属性

问题是视图并不像我们想要的那样愚蠢。 商店甚至没有与任何用例交互

ClearLists 用例在这里应该合法吗?

由于我不喜欢在表示层有太多逻辑,所以我倾向于遵循这个图表:

每个视图都有自己的 ViewModel。 VM 只是与用例交互。这些 UC 可能会也可能不会返回值。例如:我的 UC 是 ValidateNumberRange,我可能不会与商店交互。返回一个布尔值是有意义的。但如果我的 UC 是 ClearTodoList,它可能会与商店交互。成功或失败可以是一个存储值。这样返回值可能没有用。

有了这个新图表,“GetTodos”用例可调用方法实现可能是:

store.set(State.loading());
final result = repo.getTodos();
result.fold(
   (failureMsg) { store.set(State.failure(failureMsg)); },
   (newList) { store.set(State.done(newList)); },
);
  • 用例处理状态管理逻辑
  • View 调用 VM 方法。 VM 调用 UC 并观察 Store 中的变化(此处通过 MobX)

我问自己很多问题:

  • 我是否正确理解了 UC 在清洁架构中的作用?
  • 改变状态(加载、完成、失败)是否考虑了业务逻辑?
  • 您会将状态管理解决方案放在应用中的什么位置?

我期待听到你的想法

【问题讨论】:

    标签: flutter state-management clean-architecture


    【解决方案1】:

    用例封装了业务规则,它们与平台无关和交付机制无关(例如 UI)。 用例基于功能,但没有实现细节。 书: https://dannorth.net/introducing-bdd

    改变状态是表现层的责任;表示层!= UI 层

    这样想:

    Domain Layer <= infrastructure layer <= application layer <= presentation layer <= UI Layer
    

    依赖总是应该是向内的。 像这样想象:无副作用的业务逻辑(功能核心)始终位于中心,其余的(有状态元素、UI、框架)围绕它。

    从您的图表中: AppState 和 ViewModel 始终位于表示层。 Flutter 特定的类属于 UI。

    【讨论】:

    • 感谢您的回答哈希姆。如果状态不是特定于平台的怎么办?我的意思是,我有自己的状态解决方案,不是特定于颤动的。我对现有的过于依赖平台的状态管理解决方案并不完全满意。就我而言,平台特定代码(表示层)仅注册到存储并通过提供回调来观察更改。现在可以在 Web 项目中使用此代码。根据我在您的评论中的理解,它不尊重干净的拱门,我是对的吗?
    • 表示层与平台无关。所以你可以重复使用它。没有称为干净架构的模板。清洁架构是一个概念,它鼓励您通过使用抽象将低级细节(框架)与高级细节(应用程序逻辑)分离。因此,只要符合边界接口,您就可以轻松更换组件。这样想:您应该能够轻松更改您的 UI 层,并能够重用您的代码用于 windows、Mac、linux、web、移动
    猜你喜欢
    • 2022-05-06
    • 2020-10-01
    • 2020-01-10
    • 2022-11-26
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-14
    相关资源
    最近更新 更多