Flutter K线系统拆解(一):架构分层与领域模型
K 线在 demo 阶段通常不难,难的是进入真实交易场景之后的长期维护。
一旦业务进入高频迭代,常见问题很快会暴露出来:主题体系耦合、模式分支散落、改动范围不可控、扩展成本越来越高。
这一篇只讲架构层面的核心问题:
如何把 K 线从“能画出来的组件”做成“可长期演进的系统”。
一、推荐的系统分层
一套可维护的 K 线实现,通常至少要有这几层:
入口与装配层:图表 widget 生命周期与运行时状态
SDK 抽象层:主题、国际化、事件、屏幕适配等外部能力
数据与指标层:行情实体、指标结果、计算引擎
渲染核心层:坐标、可视区、渲染器管理
渲染阶段层:背景/网格/主图/十字线/叠加层等阶段化执行
策略扩展层:现货、合约等模式差异封装
工具叠加层:订单标记、绘图工具、信息浮层
分层的价值不在“看起来规范”,而在于改动隔离:
新增一个能力时,只需要改对应层,不会把整个系统拖下水。
二、外部依赖必须 SDK 化
K 线内核不要直接依赖宿主 App 的具体实现。
主题、国际化、事件总线、屏幕适配都应该通过接口注入。
推荐模式:
- 内核只依赖抽象接口
- 适配层负责把宿主能力映射为接口实现
- 页面层只负责装配,不写业务细节
这样做的直接收益是:
- 内核可复用,迁移成本低
- 单元测试可替换依赖
- 多项目接入时不会复制粘贴一堆 if/else
三、运行时状态要聚焦在“图表本身”
入口层状态建议只保留图表运行必需信息:
- 缩放与滚动
- 当前选中点
- 手势状态(拖拽/缩放/长按)
- 可见区边界与回弹信息
经验上最容易失控的是“把业务状态也塞进图表状态”。
一旦这样做,重建范围和排查复杂度都会快速上升。
四、领域模型要服务渲染链路
交易图表的实体模型不应只保存原始行情。
更实用的做法是把指标结果一并回填到数据实体,渲染阶段直接消费。
核心原则:
- 计算层写结果,渲染层只读结果
- 新数据优先增量更新,不做全量重算
- 展示格式化与数值计算分离
五、模式差异必须集中管理
现货和合约的差异通常会出现在:
- 是否显示成交量/副图
- 折线与蜡烛模式规则
- 时间对齐策略
- 日期与轴标签参数
这些差异应集中在策略层统一处理,不应该散落在渲染阶段和手势分支里。
一旦差异点分散,后续新增模式会持续放大维护成本。
总结
K 线架构的本质不是“把代码拆成多个目录”,而是控制复杂度传播。
只要把依赖注入、状态边界、领域模型、模式策略这四个点做稳,后面无论加功能还是做性能优化,都会顺很多。