该项目是一个极简的记账项目,主要用到的 Bloc 状态管理,Moor 数据库存储,Dio 网络请求,和 Js 后端
应用内大多数数据是通过监听数据库实现,数据驱动的方式来更新 UI,数据库转换成 broadCaseStream,从而满足多次多个 Widget 多次订阅,减少实际 IO 次数。 为了更为细致的控制局部刷新,基本上没有使用 StatefulWidget,大部分逻辑处理工作放到 Bloc 去操作,通过 BlocBuilder 进行更细致的控制,并且可以将每一个 Bloc 拆分到更细的地 步。
项目内部使用了非常多的 ImplicitlyAnimatedWidget,改变内部元素即可自动进行动画,将 动画逻辑封装,将注意力集中放到数据而不是控制本身。相关文章:Flutter 自定义 ImplicitlyAnimatedWidget 及源码解析。
SliverPersistentHeader 的使用上需要确定尺寸,而实际上往往很少能够得出具体尺寸,为 了更方便使用,Header 部分实现了一个 SliverPinnedBoxAdapter,通过自定义 layout 和 hitTest 实现 pinned Header 效果。
在账单月份切换的界面,需要监听 scrollView 内部 widget,通过自定义 Element,重写 mount 和 unmount 确定每次内部 widget 更新,然后通过 element 获取 renderObject 和 Viewport 来确定 Element 具体位置,并通过监听 ScrollNotification 变化增加计算频率从而 达到实时监听 scrollView 内 widget 变化。顺带获取了 ScrollNotification,根据滑动速度可 以满足运营场景的曝光埋点跟踪需求。现已封装开源:widgets_visibility_provider。 使用颜色的对比度关系,通过多颜色模型,来生成暗黑模式配色方案。
Widget 封装复用,减少 UI 编写的回调地狱