Sxn*_*ome 8 state-management flutter clean-architecture
(我编写了 MobX 包作为示例,但它可以是 BLoC、Redux 之类的任何东西......)
我可能对该图有疑问,因为 Store 驻留在表示层中并负责更改状态。
想象一下,应用程序通过 TodosStore 中名为“getTodos”implementend 的方法加载待办事项列表。“getTodos”的实现可能是:
_state = State.loading();
final result = GetTodos();
_state = State.done();
Run Code Online (Sandbox Code Playgroud)
(我把事情过于简单化了)
它首先将状态更新为加载,调用返回列表的用例并将状态设置为完成。
我在这里发现的问题:
这是一个相当简单的例子。但是让我们想象一下,我有一个包含 3 个不同数据列表的视图(这可能是一个荒谬的例子)。该视图与 3 个不同的商店交互。应用栏中有一个按钮。其目标是清除 3 个列表。
如何实现这种行为?
问题是这个视图并不像我们想要的那么愚蠢。商店甚至不与任何用例交互
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)); },
);
Run Code Online (Sandbox Code Playgroud)
我期待听到你的想法
用例封装了业务规则,并且它们与平台无关并且与交付机制无关(例如UI)。用例基于功能,但没有实现细节。书籍: https: //dannorth.net/introducing-bdd
改变状态是表示层的责任;表示层!= UI 层
像这样思考:
Domain Layer <= infrastructure layer <= application layer <= presentation layer <= UI Layer
Run Code Online (Sandbox Code Playgroud)
依赖关系始终应该是向内的。想象一下:无副作用的业务逻辑(功能核心)始终位于中心,其余部分(有状态元素、UI、框架)围绕它。
从你的图表来看:AppState 和 ViewModel 始终驻留在表示层中。Flutter 特定的类属于 UI。
| 归档时间: |
|
| 查看次数: |
2886 次 |
| 最近记录: |