草稿-2
草稿
一些缩写
由于懒得打太多的代码块 (并且我真不认为有除了我以外的人来看这玩意) ,所以规定一些缩写:
| 名字 | 含义 |
|---|---|
| repo | Repository,没有特殊说明就是AbstractRepository |
| uc | UseCase |
| notifier | StateNotifier<T> |
| aNotifier | AsyncNotifier<T>,异步版的notifier |
| aValue | AsyncValue<T>,一个目前看来只有3个实现的抽象类 |
| 数据键 | 一般是EnhancedPrefKey<OT,ET>,被我PrefKey<T> |
进展
重构的进度很顺利,先简单做个小小的总结:
- 删掉了大多数的uc,然后将多个uc抽象成一个,感觉不错
- 将所有(?)数据持久化的操作移动到了Data层,包括成功后自动保存账密的逻辑,也放到了Data层
- 以前的情况是:
- 在首次登录时,Domain层写数据repo,然后再通过repo来获取账密,传入Data层
- 以后的登录,Domain层都是通过repo来获取账密,然后传入Data层
- 登录失败时,持久化那块无事发生
- 登录成功时,Domain层接收到登录成功的Result后,由Domain层写repo来实现持久化
- 现在的情况是:
- 在首次登录时,Domain层仍然给Data层传账密,不过现在Data层负责操作repo,然后给数据做持久化
- 以后的登录,Data层自己读repo,Domain层不需要再传东西了
- 登录失败时,持久化那层仍然无事发生
- 登录成功时,Data层来负责写repo
- 以前的情况是:
- 给Data层的Api(这里指的是第二级封装,第一级是retrofit的rawApi;第三级可以说是repo),加了回滚重试wrapper,这样就可以轻松处理登录token过期的问题
- 新造了几个好用的工具,例如给
extension on String的扩展方法加了一个能处理JSON数据键的方法,好像叫EnhancedPrefKey<String, Option<OT>> toEnhancedKeyJson<OT>(OT defaultValue,OT Function(Map<String, dynamic>) fromJson),有了这个,就可以一下解决JSON数据序列化和持久化的问题了 - 摸了一点UI,加了一个等待mask(叫wrapper好像更合适?),叫做
Widget loadWaitingMask({required List<AsyncValue<Option<dynamic>>> values,required List<AsyncValue<Option<dynamic>>> requiredValues,required BuildContext context,required Widget child})(我写的函数怎么连签名都这么长啊喂!)它的作用是等待多个被watch的aNotifier所产生的aValue,在等待完成之前,就显示加载画面,如果requiredValues有失败的,就显示失败画面,至少我认为,它很适合处理一些同时需要多个异步状态的页面虽然说造这么多轮子之后自己都不会用了也说不定
还有什么要做的吗
很多:
- 完善异常(更确切的说,是结果(
Result,或者Either))的处理,现在它们的处理还是有点不健壮,我的目标是在Dart中将真正的异常扼杀在摇篮里(其实就是异常不应该抛到很上层的位置,应该及时被转成Either),我承认我口气不小,并且过于傲慢,但是至少我认为这可以让代码变得好看(至少不会一个小小的异常啪的一下抛到顶层) - 写完最基本的功能,例如课表的查看……好麻烦
- 完善UI的动画,是的,这个Flutter的动画效果和基础设施完全没法和Jetpack Compose比,连最基本的AnimatedVisibility都没有,天哪,这就要求我花不少力气来还原之前软件的效果……
- 以及,还完技术的债——至少把之前有的功能都实现了
- 这里就包括了自定义主题、以及一堆个性化的设置
- 但是显然, 设置的实现本身比这些更重要