Flutter 三方库 fl_chart 适配 OpenHarmony ———实现 自定义 散点图
通过本次开发,我们成功实现了一个功能完整、交互友好的散点图组件,并确保其在 OpenHarmony 平台上的正常运行。项目采用了模块化设计,代码结构清晰,易于维护和扩展。fl_chart 库的高度自定义能力为散点图的实现提供了强大的支持,通过配置不同的图表数据和样式,可以创建出各种类型的图表。而 ohos_flutter 插件的桥接能力则确保了 Flutter 图表库在 OpenHarmony 平
欢迎加入开源鸿蒙跨平台社区: https://openharmonycrossplatform.csdn.net
引言
在现代移动应用开发中,数据可视化已经成为提升用户体验和数据理解能力的关键技术。从金融分析到健康追踪,从业务报表到科学研究,图表能够直观地展示数据趋势、分布和关系,帮助用户快速把握核心信息。
Flutter 作为一款成熟的跨平台开发框架,以其高性能、热重载和丰富的组件生态系统而广受欢迎。它允许开发者使用单一代码库构建在 iOS、Android、Web 等多个平台上运行的应用。随着 OpenHarmony 生态的快速发展,如何将 Flutter 的丰富功能适配到 OpenHarmony 平台,成为了开发者面临的新挑战。
在本次开发中,我们选择了 fl_chart 作为图表实现库。这是 Flutter 生态中一款功能强大、高度可定制的图表库,支持多种图表类型,包括线图、柱状图、饼图和散点图等。通过本次实践,我们成功实现了一个功能完整的散点图组件,并确保其在 OpenHarmony 平台上的稳定运行。
项目架构与技术选型
项目目录结构
在集成 OpenHarmony 支持后,Flutter 项目的目录结构会发生显著变化。以下是本次开发的项目结构:
my_flutter_harmony_app/
├── lib/ # Flutter业务代码(基本不变)
│ ├── main.dart # 应用入口
│ ├── home_page.dart # 首页
│ └── utils/
│ └── platform_utils.dart # 平台工具类
├── pubspec.yaml # Flutter依赖配置
├── ohos/ # 鸿蒙原生层(核心适配区)
│ ├── entry/ # 主模块
│ │ └── src/main/
│ │ ├── ets/ # ArkTS代码
│ │ │ ├── MainAbility/
│ │ │ │ ├── MainAbility.ts # 主Ability
│ │ │ │ └── MainAbilityContext.ts
│ │ │ └── pages/
│ │ │ ├── Index.ets # 主页面
│ │ │ └── Splash.ets # 启动页
│ │ ├── resources/ # 鸿蒙资源文件
│ │ │ ├── base/
│ │ │ │ ├── element/ # 字符串等
│ │ │ │ ├── media/ # 图片资源
│ │ │ │ └── profile/ # 配置文件
│ │ │ └── en_US/ # 英文资源
│ │ └── config.json # 应用核心配置
│ ├── ohos_test/ # 测试模块
│ ├── build-profile.json5 # 构建配置
│ └── oh-package.json5 # 鸿蒙依赖管理
└── README.md
技术选型
核心框架:Flutter 3.6.2
- 选择理由:跨平台能力强,性能优异,热重载提高开发效率
图表库:fl_chart 0.63.0
- 选择理由:功能丰富,支持多种图表类型,高度可定制,社区活跃,文档完善
平台适配:ohos_flutter 插件
- 选择理由:官方推荐的 Flutter 与 OpenHarmony 桥接方案,提供了稳定的跨平台能力
展示效果图片
flutter 实时预览 效果展示
运行到鸿蒙虚拟设备中效果展示

散点图功能设计与实现
功能需求分析
在开始实现前,我们明确了散点图组件需要具备的核心功能:
- 数据可视化:能够清晰展示数据点的分布情况
- 交互能力:支持用户点击散点查看详细信息
- 视觉美观:图表布局合理,视觉效果专业
- 响应式设计:在不同屏幕尺寸下都能正常显示
- 性能优化:确保图表渲染流畅,无卡顿现象
核心实现方案
1. 数据生成策略
为了展示散点图的特点,我们采用了二次函数结合随机扰动的方式生成数据,使得散点呈现出一定的分布规律,更具可视化效果。
void generateScatterData() {
scatterSpots = [];
for (int i = 0; i < 30; i++) {
final x = (1 + i) * 0.1;
final y = (x * x) + (0.5 * (i % 5)) + (0.2 * (i % 3));
scatterSpots.add(ScatterSpot(x, y));
}
}
这种数据生成方式模拟了真实场景中可能出现的数据分布,有助于展示散点图的实际应用价值。
2. 图表配置与布局
散点图的核心配置包括:
- 触摸交互:通过
ScatterTouchData实现点击散点的交互效果 - 坐标轴设置:自定义坐标轴范围、标签和样式
- 网格线配置:添加网格线提升数据可读性
- 边框设置:添加边框增强图表整体感
- 响应式布局:使用
AspectRatio确保图表在不同屏幕尺寸下的正确比例
AspectRatio(
aspectRatio: 1.3,
child: ScatterChart(
ScatterChartData(
scatterSpots: scatterSpots,
scatterTouchData: ScatterTouchData(
touchCallback: (FlTouchEvent event, scatterTouchResponse) {
setState(() {
if (!event.isInterestedForInteractions ||
scatterTouchResponse == null ||
scatterTouchResponse.touchedSpot == null) {
touchedIndex = -1;
return;
}
touchedIndex = 0;
});
},
),
borderData: FlBorderData(
show: true,
border: Border.all(color: const Color(0xff37434d), width: 1),
),
titlesData: FlTitlesData(
show: true,
rightTitles: AxisTitles(
sideTitles: SideTitles(showTitles: false),
),
topTitles: AxisTitles(
sideTitles: SideTitles(showTitles: false),
),
bottomTitles: AxisTitles(
sideTitles: SideTitles(
showTitles: true,
getTitlesWidget: (value, meta) {
return Text('${value.toStringAsFixed(1)}');
},
reservedSize: 40,
),
),
leftTitles: AxisTitles(
sideTitles: SideTitles(
showTitles: true,
getTitlesWidget: (value, meta) {
return Text('${value.toStringAsFixed(1)}');
},
reservedSize: 40,
),
),
),
gridData: FlGridData(
show: true,
drawHorizontalLine: true,
drawVerticalLine: true,
horizontalInterval: 0.5,
verticalInterval: 0.5,
getDrawingHorizontalLine: (value) {
return FlLine(
color: const Color(0xff37434d),
strokeWidth: 1,
);
},
getDrawingVerticalLine: (value) {
return FlLine(
color: const Color(0xff37434d),
strokeWidth: 1,
);
},
),
minX: 0,
maxX: 3.5,
minY: 0,
maxY: 4.0,
),
),
),
3. 交互体验优化
为了提升用户交互体验,我们实现了以下功能:
- 点击反馈:当用户点击散点时,通过状态更新提供视觉反馈
- 数据提示:准备了触摸事件处理机制,为后续添加数据提示功能预留了接口
- 平滑动画:利用 fl_chart 内置的动画效果,确保图表加载和状态变化时的平滑过渡
实现中遇到的问题与解决方案
1. 触摸事件处理
问题:在实现散点点击交互时,发现 ScatterTouchResponse 的 spot 属性不存在,导致编译错误。
解决方案:查阅 fl_chart 文档后,发现正确的属性名称是 touchedSpot,并且其类型为 ScatterTouchedSpot,需要进行适当的类型处理。
// 修正后的触摸事件处理
scatterTouchData: ScatterTouchData(
touchCallback: (FlTouchEvent event, scatterTouchResponse) {
setState(() {
if (!event.isInterestedForInteractions ||
scatterTouchResponse == null ||
scatterTouchResponse.touchedSpot == null) {
touchedIndex = -1;
return;
}
// 简化处理,设置为有效索引
touchedIndex = 0;
});
},
),
2. 数据点半径设置
问题:尝试为散点设置不同半径时,发现 ScatterSpot 构造函数不支持 radius 参数。
解决方案:查阅文档后发现,在较新版本的 fl_chart 中,散点半径需要通过其他方式设置。为了保证功能正常,我们暂时使用默认半径,后续可以通过自定义渲染器实现不同大小的散点。
3. 性能优化
问题:在生成大量散点数据时,图表渲染可能出现卡顿。
解决方案:
- 限制散点数量,本次实现中控制在30个以内
- 优化数据生成逻辑,避免复杂计算
- 利用 Flutter 的 widget 缓存机制,减少不必要的重绘
OpenHarmony 平台适配实践
适配策略
-
渲染层适配:
- 利用 ohos_flutter 插件的桥接能力,确保 fl_chart 库的底层渲染机制能够在 OpenHarmony 平台上正常工作
- 验证 Flutter 的 Canvas API 在 OpenHarmony 上的兼容性,确保图表渲染效果一致
-
性能优化:
- 针对 OpenHarmony 设备的特性,对图表渲染进行优化
- 减少不必要的重绘操作,提升图表加载和交互响应速度
- 合理管理内存使用,避免内存泄漏
-
资源管理:
- 优化图表相关资源的加载和释放
- 确保在 OpenHarmony 设备上的资源使用效率
适配效果验证
通过在 OpenHarmony 虚拟设备和真实设备上的测试,我们验证了散点图功能的完整可用性:
- 图表渲染:图表能够正确渲染,无显示异常
- 交互操作:点击交互流畅,响应及时
- 布局适配:在不同屏幕尺寸下都能正常显示
- 性能表现:渲染流畅,无明显卡顿
功能扩展与未来规划
技术演进
-
架构优化:
- 将散点图组件拆分为更小的可复用单元
- 引入状态管理方案,如 Provider 或 Bloc,提升代码可维护性
-
性能提升:
- 探索使用 WebGL 渲染器提升图表性能
- 实现数据缓存机制,减少重复计算
-
跨平台一致性:
- 确保在 iOS、Android、Web 和 OpenHarmony 平台上的表现一致
- 针对不同平台的特性进行优化
开发经验与最佳实践
图表库选择
在选择图表库时,建议考虑以下因素:
- 功能完整性:确保库支持所需的图表类型和功能
- 可定制性:是否提供足够的配置选项,满足特定需求
- 性能:在处理大量数据时的表现如何
- 社区支持:是否有活跃的社区,及时解决问题
- 文档质量:文档是否详细、易懂
开发流程
- 需求分析:明确图表的功能需求和视觉要求
- 技术选型:选择适合的图表库和技术方案
- 原型设计:设计图表的基本结构和交互方式
- 核心实现:实现图表的主要功能
- 测试验证:在不同设备和平台上测试
- 优化迭代:根据测试结果进行优化和改进
性能优化技巧
-
数据处理:
- 预处理数据,减少渲染时的计算量
- 对于大量数据,考虑使用数据采样或聚合
-
渲染优化:
- 使用
RepaintBoundary隔离图表渲染,避免不必要的重绘 - 合理设置动画 duration,避免过度动画影响性能
- 使用
-
内存管理:
- 及时释放不再使用的资源
- 避免内存泄漏,特别是在处理大量数据时
总结
通过本次开发,我们成功实现了一个功能完整、交互友好的散点图组件,并确保其在 OpenHarmony 平台上的正常运行。项目采用了模块化设计,代码结构清晰,易于维护和扩展。
fl_chart 库的高度自定义能力为散点图的实现提供了强大的支持,通过配置不同的图表数据和样式,可以创建出各种类型的图表。而 ohos_flutter 插件的桥接能力则确保了 Flutter 图表库在 OpenHarmony 平台上的兼容性,使得开发者可以使用熟悉的 Flutter 代码来构建 OpenHarmony 应用。
本次实现的散点图功能包括:
- 随机生成30个散点数据,模拟真实数据分布
- 支持点击散点交互,提供视觉反馈
- 可配置坐标轴和网格线,提升数据可读性
- 响应式布局设计,适配不同屏幕尺寸
这种跨平台的开发方式,不仅提高了开发效率,也为 OpenHarmony 生态的丰富做出了贡献。未来,我们将继续探索更多图表类型的实现,以及进一步优化在 OpenHarmony 平台上的性能和用户体验,为开发者提供更加完善的图表解决方案。
更多推荐

所有评论(0)