[EP-007] 优雅弹窗处理

问题提出

在 EP-006 中我们提到了状态管理三个原语,其中加载状态可能会有特殊的需求。例如我们的 UI 设计师和产品一致的认为:我们需要弹出一个加载框,这样可以显式的表示加载状态,并中断用户操作实现伪防抖。或许有他们的道理,即使不够优雅。

但是无论如何加载这个动作总得有个地方去写,写在控制器里?还是说直接封装进网络服务里?请求之前弹出,请求之后关闭?显然这都不够优雅,而且易错,我们需要考虑以下情况:

  1. 你的网络请求可能正常执行了,但需要记得关闭加载框(主观的心智负担);
  2. 你的网络请求可能会变成错误,你需要在错误的时候关闭加载框;
  3. 你可能有多个网络请求,在哪里关闭加载呢?
  4. 不只是网络请求,本地的耗时操作也需要加载,完成的时候记得关闭加载框。

你可能会说这有什么,挨个写好就行了。但是错综复杂的业务逻辑,迟早会埋藏 bug,但是解决它仅仅只是个习惯问题,不需要添加太多代码。

优雅实践

弹窗处理需要 context,自然的我们需要在 UI 层去弹窗(TODO: EP-009 理解上下文),但是业务都在控制器层、服务层,我怎么知道什么时候应该弹窗?

思路改变一下,既然弹窗是 UI 层干的事,UI 层关心的肯定也不是业务发生了什么,而是关心当前的状态,我们只需要让控制器层暴露一个加载状态,就可以了,那么回到三个原语里,watchreadlisten,首先排除用于调用方法的 read,其次排除 watch,因为我不需要返回小组件,而且 watch 并不方便知道什么时候加载状态结束了。所以我们需要使用 listen 监听加载状态。

bloc 伪代码如下:

BlocListener<BlocA, BlocAState>(
  listenWhen: (previousState, state) {
    return previousState == BlocALoadingState 
      || state == BlocALoadingState;
  },
  listener: (context, state) {
    if (state == BlocALoadingState) showDialog(context);
    else closeDialog(context);
  },
  child: const SizedBox(),
);

riverpod 伪代码如下:

ref.listen(otherProvider, (previous, next) {
  if (next == BlocALoadingState) showDialog(context);
  if (previous == BlocALoadingState) closeDialog(context);
});

当进入加载状态,UI 弹出加载框,当退出加载状态,UI 关闭加载框。就是这样一个简单而优雅的逻辑,模块间解耦,状态明确。

Getx 怎么做?一样的可以监听状态去做,但我不会提供 Getx 文档以外的代码和教程,因为 bloc、riverpod 的伪代码都是在文档里抄过来改改,但是 Getx 不会告诉你怎么做,他更喜欢屏蔽掉你的上下文,同时告诉你:你可以任何地方弹窗,而不必关心是否合规,毕竟功能实现了。

Read more

[TS-001] Flutter 开发环境搭建思路

大家好,这里是优雅实践实验室,这一节将介绍如何搭建 Flutter 开发环境。 Flutter 开发环境是由什么组成的 eplab 只提供思路,不会手把手教学。 所以从思路出发。当提及配置 Flutter 开发环境的时候,我们到底在配置什么? 由 Flutter 的设计可知,Flutter 是编译后嵌入到目标平台的。 所以我们需要同时具备 Flutter 开发环境和目标平台的开发环境。 * Flutter 开发环境 * Flutter SDK * dart SDK * pub 命令 * IDE + Flutter 插件 * git 等环境杂项 * 目标平台的开发环境(按须配置) * 目标平台 SDK * 目标平台的模拟器(可选) Flutter 开发环境 需要配置基础的 Flutter SDK、IDE 及其插件、和一些杂项开发环境。

By lilua

[TS-999] Flutter 介绍

这个视频核心目的是扫盲,解答一些常见的 Flutter 相关的问题。 Flutter 跨平台开发支持哪些平台? 一般情况下说的是:生成产物可以运行在哪些平台,官方支持的是六大平台:Android、iOS、MacOS、Linux、Windows、Web。 开发平台支持使用四大平台:MacOS、Linux、Windows、ChromeOS。 容易被忽略的是 Flutter 是一个优秀的开源项目,良好的分层架构和可移植的 Dart 语言,让它本身就支持编译到任意一个嵌入式设备中,比如和丰田合作的车载系统、腾讯曾出过一个打印机系统、开源鸿蒙系统。 Flutter 是否支持鸿蒙开发? 正如上所示,Flutter 天生支持任何嵌入式设备开发,鸿蒙本质也是嵌入式设备。所以就技术本身而言,Flutter 是支持鸿蒙的。 就细而论,开源鸿蒙、鸿蒙Next、用户手上的鸿蒙,是否都可以用 Flutter 开发呢?还是那句话,技术本身是支持的,无论鸿蒙怎么变化。 Flutter

By lilua

[TS-000] Flutter 教学视频逐字稿介绍

这是优雅实践实验室产出视频之前的需要提前准备好的逐字稿脚本(Transcript),将会记录所有收集到的文档资料、代码片段、旁白台词和最终产出的视频。 💡注意:视频内容可能会过期,但是逐字稿会更新,在必要的时候重置当期对应的教学视频。 色彩搭配 主色 #042B59 #0553B1 #027DFD 辅色 #F25D50 #FFF275 #6200EE #1CDAC5 搭配方法 使用 Material Design 的配色,将主色和辅色两两搭配,得到一套主题,并遵循配色规范使用主题色卡。

By lilua