【免费下载链接】fl_chart
FL Chart is a highly customizable Flutter chart library that supports Line Chart, Bar Chart, Pie Chart, Scatter Chart, Radar Chart and Candlestick Chart.
本篇技术指南以 fl_chart 仓库的 CHANGELOG.md 为骨架,系统梳理这款 Flutter 图表库从 2019 年 0.0.1 至今 1.2.0 的完整演进脉络:六种图表类型如何逐步加入、渲染与触摸架构如何重构、标题与渐变系统如何统一,以及历次破坏性变更(BREAKING)对应的迁移路径。读完你将掌握 fl_chart 的能力边界、关键配置项的含义,以及在升级版本时如何借助仓库内迁移指南平滑过渡。
版本总览与当前状态
当前仓库的pubspec.yaml中记录的版本号为1.2.0,环境约束为sdk: ">=3.6.2 <4.0.0"与flutter: ">=3.27.4",核心依赖仅有equatable(数据相等性判断)与vector_math(2.2.0,矩阵与向量运算)。CHANGELOG 覆盖从0.0.1 - Released on (2019 June 4)到1.2.0的全部发布记录,是理解库能力演进的权威依据。
从 CHANGELOG 的条目结构看,每个版本条目包含FEATURE(新特性)、BUGFIX(缺陷修复)、IMPROVEMENT(改进)、BREAKING(破坏性变更)与IMPORTANT(重要声明)五类标记,并标注了贡献者与关联 Issue 编号。1.2.0 条目还提到项目已引入 PR 标题规范与 linter(checker),从下一个版本开始将采用自动化的 changelog 生成机制。
图表家族演进:从三件套到六种图表
fl_chart 的图表类型是逐步扩展的,CHANGELOG 记录了每一次新增:
| 版本 | 新增图表类型 | 说明 |
|---|---|---|
| 0.0.x | LineChart / BarChart / PieChart | 库的初始形态,0.0.3 将主组件统一命名为FlChart并规定从package:fl_chart/fl_chart.dart导入 |
| 0.5.0 | ScatterChart | 散点图,同时引入FlPanEnd速度属性用于区分 Tap 事件 |
| 0.20.1 | RadarChart | 雷达图,由贡献者 Payam Zahedi 实现 |
| 1.0.0 | CandlestickChart | K 线图,配套实现了展示 2024 年比特币价格的示例 |
从当前仓库的 lib/fl_chart.dart 看,公开导出已覆盖LineChart、BarChart、PieChart、ScatterChart、RadarChart、CandlestickChart以及GaugeChart七类;不过 CHANGELOG 中并未记录 GaugeChart 的引入版本,因此其加入时间以源码为准(lib/src/chart/gauge_chart/)。
1.0.0 是项目的一个重要里程碑:除了新增 CandlestickChart,还同步完成了多项收尾工作——移除已废弃的tooltipRoundedRadius属性(改用tooltipBorderRadius)、修复 BarChart 数据切换时的不匹配问题、为 RadarDataSet 增加fillGradient,并将最低 Flutter 版本提升至3.27.4。
渲染架构演进:从直接绘制到 RenderObject
早期版本(0.0.x~0.12.x)的绘制方式较为原始,CHANGELOG 中记录了两次关键架构升级:
- 0.12.2:引入
CanvasWrapper代理全部绘制函数。按 CHANGELOG 的说明,它不改变绘制结果,主要目的是让代码可测试——这一点从仓库中 test/utils/canvas_wrapper_test.dart 与其配套的canvas_wrapper_test.mocks.dart可以得到印证。 - 0.30.0:全面改用 Flutter 的
RenderObject作为默认绘制系统。CHANGELOG 明确指出它带来了尺寸处理、hitTest 触摸处理层面的稳定性,并使图表内可以绘制 Widget,修复了多个历史问题(#383、#556、#582 等)。这一架构沿用至今,lib/src/chart/base/base_chart/render_base_chart.dart 与各图表的*_renderer.dart文件即为其实现形态。
此外,0.9.0 引入equatable库,使所有数据模型具备值相等性判断能力,这为后续动画插值与数据热更新提供了性能基础。
动画系统演进:从内置动画到统一 curve/duration
动画能力自 0.3.0 起加入,handle_animations.md是专门的说明文档。演进的关键节点如下:
- 0.3.0:加入内置动画,数据变化时图表平滑过渡。
- 0.30.0:为所有图表 Widget 增加
swapAnimationCurve,可自定义动画曲线(Curve)。 - 0.69.1:将
swapAnimationDuration与swapAnimationCurve标记为废弃,改用统一的curve和duration属性,以保持全项目命名一致性。
从源码看,动画的实现依托数据类上的lerp方法,例如 pie_chart_data.dart 中PieChartData.lerp会对 sections、centerSpaceRadius、startDegreeOffset 等逐项做插值,其中sectionsSpace等使用 lerp.dart 提供的lerpDouble辅助函数。版本历史中多次出现与插值相关的缺陷修复(如 0.36.0 修复FlSpot.nullSpot的 lerp 问题),说明动画系统是持续打磨的重点。
触摸交互演进:从 touchCallback 到 FlTouchEvent
触摸系统是 fl_chart 迭代最频繁的子系统之一,其演进主线如下:
- 0.1.0:加入触摸交互,
handle_touches.md是配套文档。 - 0.4.0:移除旧的
touchedResultSink,改为每个 TouchData 上的touchCallback函数;TouchTooltipData更名为LineTouchTooltipData/BarTouchTooltipData。 - 0.40.0:触摸回调签名改为
(FlTouchEvent event, BaseTouchResponse? response)。FlTouchEvent(定义于 fl_touch_event.dart)统一表示各类指针事件(如FlTapUpEvent、FlPanUpdateEvent、FlLongPressStart等),取代了旧的touchInput与clickHappened属性;同时重新支持长按事件,并新增mouseCursorResolver回调用于根据触摸事件动态改变MouseCursor。 - 0.60.0:增加
longPressDuration可选属性,控制长按手势的触发时长。 - 0.69.0:反转 ScatterChart 的触摸命中顺序,让顶部的点优先被触摸到。
其他值得关注的触摸相关改进包括:0.45.0 为LineTouchData增加distanceCalculator用于计算触摸点与数据点间的距离;0.41.0 修复getNearestTouchedSpot此前"只返回阈值内第一个命中点而非最近点"的缺陷。tooltip 的样式定制能力也在逐步增强:0.30.0 增加direction(auto/top/bottom),0.35.0 支持TextSpan子文本与getTouchLineStart/getTouchLineEnd自定义触摸线,0.55.0 增加tooltipBorder,0.61.0 增加tooltipHorizontalAlignment与tooltipHorizontalOffset。
标题系统演进:从字符串到任意 Widget
标题系统是 fl_chart 定制能力最强的部分,0.50.0 是一次影响深远的重构:
- 0.50.0(BREAKING):
FlTitlesData、AxisTitles、SideTitles的结构整体调整,getTitlesWidget从返回String改为返回任意 FlutterWidget——这意味着标题可以是 Icon、图片或任意组合控件。同一版本将colors属性统一为color(单一实色),并引入gradient字段替代旧的colorStops/gradientFrom/gradientTo组合,涉及BarChartRodData、BarAreaData、LineChartBarData等多个类。 - 0.51.0:新增
SideTitleWidget作为getTitlesWidget的便捷包装,它让child始终贴近图表边缘,并提供angle(旋转角)与space(间距)属性。CHANGELOG 给出了标准用法:
getTitlesWidget: (double value, TitleMeta meta) { return SideTitleWidget( axisSide: meta.axisSide, space: 8.0, angle: 0.0, child: const Text("This is your widget"), ); },- 0.61.0:
AxisTitles.drawBehindEverything默认值改为true;同时移除 BarChartRodData 中"只能提供 color 或 gradient 之一"的断言限制。 - 1.2.0:为
LabelDirection枚举新增horizontalMirrored与verticalMirrored,用于水平/垂直辅助线的标签(HorizontalLineLabel、VerticalLineLabel)。从源码看,该枚举定义于 line_chart_data.dart,而镜像方向的绘制分支实现在 axis_chart_data.dart 与 axis_chart_painter.dart。
渐变与视觉特性:全库统一的 Gradient 能力
0.50.0 之后,Gradient 能力在各类图表中逐步铺开:
- 0.50.0:任何支持渐变的地方均可使用任意
Gradient(如LinearGradient、RadialGradient);同时修复 BarChart 柱状图渐变的缺陷。 - 0.65.0:为
FlLine增加渐变支持。 - 0.66.0:为
HorizontalLine、VerticalLine以及PieChartSectionData增加gradient属性。 - 0.62.0:为
RangeAnnotations的horizontalRangeAnnotations与verticalRangeAnnotations增加渐变颜色。 - 1.1.0:
BarChartRodStackItem增加gradient属性(与实色渲染二选一);LineChartBarData增加gradientArea用于控制渐变的作用范围。从 line_chart_data.dart 看,LineChartGradientArea枚举提供两种模式:rectAroundTheLine(渐变恰好环绕曲线)与wholeChart(整个图表区域作为渐变范围),默认值为rectAroundTheLine。
1.2.0 还为PieChartSectionData增加了cornerRadius属性,用于给饼图扇区添加圆角(对应仓库 pie_chart_data.dart 中的PieChartSectionData定义)。
图表交互增强:缩放、平移与旋转
0.70.0 实现了用户等待五年之久的滚动与缩放特性(Issue #71),由贡献者 @Peetee06 完成:
- 0.70.0:轴类图表(LineChart、BarChart、ScatterChart)支持缩放(scale)与平移(pan),通过
FlTransformationConfig类控制。从 transformation_config.dart 看,其默认配置为scaleAxis = FlScaleAxis.none(默认不缩放)、minScale = 1、maxScale = 2.5、panEnabled = true、scaleEnabled = true、trackpadScrollCausesScale = false,并支持传入TransformationController以程序化控制变换;minScale/maxScale均带有断言约束(minScale >= 1、maxScale >= minScale)。这一版本对应的迁移指南见 0.70.0 迁移指南,其中说明BarChart因新增"依据BarChartData.alignment校验变换是否允许"的断言而不再支持 const 构造。 - 0.70.1:
TransformationController增加panEnabled与scaleEnabled属性;轴类图表新增rotationQuarterTurns属性,每设置一次将图表顺时针旋转 90 度——例如设为 1 即可得到横向柱状图,其行为与 Flutter 的RotatedBox一致;同时 ScatterSpot 增加renderPriority、RadarChart 增加isMinValueAtCenter。 - 0.70.2:轴类图表加入误差范围(error range)特性:
FlSpot可设置xError/yError,BarChartRodData可设置toYErrorRange,LineChartData、BarChartData、ScatterChartData通过errorIndicatorData渲染误差条。CHANGELOG 指向的示例为 line_chart_sample13.dart 与 bar_chart_sample8.dart。
破坏性变更与迁移指南汇总
CHANGELOG 中标注的破坏性变更贯穿始终,以下是影响面较大、且仓库内配有迁移指南的几项:
0.50.0:标题 Widget 化与渐变属性统一
FlTitlesData、AxisTitles、SideTitles结构整体变更,getTitlesWidget改返回 Widget;colors改名为color,新增gradient字段。完整迁移步骤见 0.50.0 迁移指南。
0.66.0:ScatterSpot 使用 dotPainter
ScatterSpot移除color与radius属性,改用dotPainter自定义点绘制器,同时FlDotCirclePainter.strokeWidth默认值改为 0.0。CHANGELOG 给出的迁移示例:
/// This is the old way: ScatterSpot( 2, 5, color: Colors.red, radius: 12, ) /// This is the new way: ScatterSpot( 2, 8, dotPainter: FlDotCirclePainter( color: Colors.red, radius: 22, ), ),0.67.0:tooltipBgColor 改为 getTooltipColor
Bar、Line、Scatter 图表移除tooltipBgColor属性,改用getTooltipColor回调以支持动态背景色。迁移指南见 0.67.0 迁移指南,CHANGELOG 中的示例:
/// This is the old way: BarChartData( barTouchData: BarTouchData( touchTooltipData: BarTouchTooltipData( tooltipBgColor: Colors.blueGrey, ) ) ) /// This is the new way: BarChartData( barTouchData: BarTouchData( touchTooltipData: BarTouchTooltipData( getTooltipColor: (BarChartGroupData group) => Colors.blueGrey, ) ) )1.0.0:移除废弃属性与 Flutter 版本下限
- 移除已废弃的
tooltipRoundedRadius,改用tooltipBorderRadius(该替代属性自 0.71.0 引入)。 - Flutter 最低版本提升至
3.27.4,升级前需确认项目 Flutter 版本。
1.1.0:BarChartRodStackItem 的 borderSide 改为命名参数
borderSide从可选位置参数改为命名参数。虽然按语义化版本(semver)这属于微小的破坏性变更,项目选择在 minor release 中直接处理。迁移示例:
/// Old way: BarChartRodStackItem( 0, 10, Colors.green, BorderSide(color: Colors.white), ), /// New way: BarChartRodStackItem( 0, 10, Colors.green, borderSide: BorderSide(color: Colors.white), ),该构造函数当前形态可在 bar_chart_data.dart 中查看,BarChartRodStackItem同时支持gradient、label、labelStyle(1.1.0 新增)与borderSide。
仓库内全部迁移指南集中在 repo_files/documentations/migration_guides/,目录索引见 INDEX.md。其他未配独立指南的破坏性变更(如 0.40.0 的触摸回调签名、0.30.0 的 tooltip 属性更名、0.12.0 的color→colors等)均可在 CHANGELOG 对应版本条目中找到迁移代码片段。
工程质量与开发流程
CHANGELOG 也记录了项目工程化建设的历程:
- 0.8.1:加入首批基础单元测试。
- 0.41.0:补充单元测试并在 CI 中启用代码覆盖率报告。
- 0.12.2:
CanvasWrapper代理绘制函数以提升可测试性——当前仓库测试目录 test/ 已覆盖全部七种图表的数据、helper、painter、renderer 与 widget 层,并配合 mockito 生成 mock 文件(如*_test.mocks.dart)。 - 0.60.0:将 lint 规则从 flutter_lints 替换为 very_good_analysis(当前 pubspec 中为
very_good_analysis: ^10.2.0)。 - 0.69.2 / 0.69.3 前后:持续修复 analyzer 警告以维持 pub.dev 评分。
- 1.2.0:引入 PR 标题规范与 linter,为自动化 changelog 生成做准备。
- 仓库根目录提供 Makefile(0.35.0 引入)与 CONTRIBUTING.md 供贡献者在提交前快速校验代码。
此外,CHANGELOG 中多次出现double.nan/double.infinity相关的修复(如 0.8.1 的centerSpaceRadius、0.10.1 的enterSpaceRadius、0.11.0 将 PieChartData 默认centerSpaceRadius设为double.infinity、0.40.0 修复 infinity 崩溃),这些细节提醒使用者:饼图中心半径的"自适应"语义建立在double.infinity之上,改动默认值时需谨慎。
升级路径建议
综合 CHANGELOG 的演进脉络,升级 fl_chart 时可遵循以下策略:
- 逐大版本迁移:从 0.50.0 开始,标题、渐变、触摸三大系统的 API 形态已趋于稳定,后续改动多为增量;若项目停留在 0.4x 及更早版本,建议先对照 0.50.0 迁移指南 完成标题与渐变迁移,再逐级升级。
- 优先处理已废弃属性:
tooltipRoundedRadius(→tooltipBorderRadius)、swapAnimationDuration/swapAnimationCurve(→curve/duration)、tooltipBgColor(→getTooltipColor)、ScatterSpot 的color/radius(→dotPainter)均属此类,编译器警告会给出明确指引。 - 确认 Flutter 版本下限:1.0.0 起要求 Flutter
>=3.27.4,与当前pubspec.yaml的环境约束一致。 - 善用示例代码:每次大版本更新,example/lib/presentation/samples/ 中的示例(如误差条的 line sample 13、bar sample 8)都会同步更新,是理解新 API 用法的最直接参考。
【免费下载链接】fl_chart
FL Chart is a highly customizable Flutter chart library that supports Line Chart, Bar Chart, Pie Chart, Scatter Chart, Radar Chart and Candlestick Chart.
相关推荐
从 CHANGELOG 读懂 just-the-docs:Jekyll 文档主题的版本演进、核心特性与升级迁移指南
从 CHANGELOG 读懂 just the docs:Jekyll 文档主题的版本演进、核心特性与升级迁移指南 Just the Docs 是一款现代、高可
文档静态站点UI组件librosa Changelog 深度解读:从 v0.1 到 v1.0.0 稳定版的版本演进与迁移升级指南
librosa Changelog 深度解读:从 v0.1 到 v1.0.0 稳定版的版本演进与迁移升级指南 本文基于 docs/changelog.rst h
音频处理科研superagent 版本演进史:从 0.0.1 到 4.x 的 API 演化与升级迁移指南
superagent 版本演进史:从 0.0.1 到 4.x 的 API 演化与升级迁移指南 导读 本文以仓库根目录下 HISTORY.md https://l
开发工具
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考