小编Sxn*_*ome的帖子

在 Flutter 中使用 Clean Architecture 在哪里执行状态更改?

当将 Clean Architecture 与 flutter 结合使用时,我们会看到类似这样的图表:

在此输入图像描述

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

我可能对该图有疑问,因为 Store 驻留在表示层中并负责更改状态

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

 _state = State.loading();
 final result = GetTodos();
 _state = State.done();
Run Code Online (Sandbox Code Playgroud)

(我把事情过于简单化了)

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

我在这里发现的问题:

  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)); },
); …
Run Code Online (Sandbox Code Playgroud)

state-management flutter clean-architecture

8
推荐指数
1
解决办法
2886
查看次数

如何在Flutter中像Youtube一样显示之前的时间

我正在编写一个 flutter 应用程序来使用Youtube API V3克隆一些 Youtube 功能。

该应用程序从 YouTube 视频 API获取字符串形式的视频时间戳

每个时间戳都具有以下格式:

YYYY-MM-DDTHH:MM:SSZ

一个例子是:

2020-07-12T20:42:19Z

我想以文本形式显示:

  • 1小时
  • 1 小时前
  • 4 周前
  • 11 个月前
  • 1年以前
  • ...

youtube-api datetime-format flutter

5
推荐指数
1
解决办法
5160
查看次数