拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Flutter与鸿蒙融合:从架构原理到工程落地的技术栈深度解析

Flutter与鸿蒙融合:从架构原理到工程落地的技术栈深度解析

1. 跨平台技术栈融合:Flutter遇上鸿蒙,到底在融合什么

先抛一个结论:Flutter鸿蒙开发,本质上不是"把Flutter跑在鸿蒙上"那么简单,而是两套完全不同的技术体系在底层做了一次深度握手。

我从2018年开始接触Flutter,从最早的1.0版本一路跟到现在,期间也陆续折腾过RN、小程序跨端方案,甚至还有一段用C++写引擎层的经历。2024年底我第一次在鸿蒙设备上把Flutter应用跑起来的时候,说实话内心是很复杂的——一方面觉得这套组合拳能解决很多实际问题,另一方面也清楚它背后埋着不少坑,这些坑不是"百度一下就能解决"级别的东西,而是要理解双方架构设计思路才能绕过去的。

先说清楚一个背景:鸿蒙生态目前有两条技术路线,一条是华为的商业发行版HarmonyOS NEXT,核心特点是从底层开始自研,去掉了安卓兼容层,只支持鸿蒙原生应用;另一条是OpenHarmony开源项目,任何设备厂商都可以基于它做自己的发行版。这两条路线的共同点是,应用层主要用ArkTS(基于TypeScript的UI语言)配合ArkUI框架开发,底层则是方舟编译器加自研运行时,再加上一套名为方舟(ArkCompiler)的多语言编译方案。这套东西和Flutter的Dart VM、Skia渲染引擎、dart:ui接口,完全是两个世界的概念。

那Flutter怎么和鸿蒙玩到一起?关键点在于,开源社区很早就有人在做OpenHarmony的Flutter适配,核心思路是给Flutter引擎单独整一个鸿蒙平台层的嵌入实现。具体来说,Flutter SDK本身是跨平台的,iOS和Android分别有对应的嵌入层代码,鸿蒙也照葫芦画瓢,实现一套FlutterEngine在鸿蒙侧的宿主管理、Surface创建、事件分发、生命周期同步。这样Flutter应用就可以作为鸿蒙应用的一个页面或者一个Module存在,Dart代码完全不用改,UI照常渲染,只是底层跑在了鸿蒙的图形栈和事件栈上。

我在实际项目里观察到一个特别有意思的现象:很多团队选择Flutter鸿蒙方案,不是因为Flutter社区宣传的"一套代码多端运行"有多吸引人,而是因为项目本身就已经有了一套成熟的Flutter业务代码,比如电商App的核心交易链路、视频产品的播放器控制台等,现在要求必须上鸿蒙,最省力的方式就是把这套代码搬到鸿蒙设备上。这在商业上叫存量复用,在工程上叫跨平台技术栈融合。但你真去动手做了以后会知道,所谓"融合"的代价,恰恰藏在那些看起来"应该能用"的地方。

还有一个容易被忽略的点:HarmonyOS NEXT的ArkUI本身就在强力对标Flutter的布局思想和声明式UI写法,ArkTS的装饰器语法(@Entry、@Component、@State这些)和Flutter的Widget概念在很多层面是互相呼应的。这就产生了一个很微妙的机会——UI层的设计语言和状态管理思路可以互相借鉴,比如你在Flutter里已经养成了"一切皆组件、状态驱动UI"的思维方式,那写ArkUI上手会快很多。这也是为什么我说技术栈融合带来的不只是运行层面的兼容,更是思维方式层面的迁移。

2. 架构拆解与关键技术点:Flutter鸿蒙方案的骨架和血肉

2.1 三层架构与通道机制:理解谁在负责画,谁在负责管

要搞懂Flutter鸿蒙开发,脑子里得有清晰的三层架构图:最上面是Dart业务层,中间是Flutter引擎层(包括Dart运行时、渲染管线、widget树),最下面是鸿蒙平台层(Ability生命周期、Surface、输入事件、插件注册)。

这三层之间的关系可以用一个比方来理解:Flutter引擎像一个自带全套厨师设备的移动餐厅,锅碗瓢盆都是自己的(Skia、Impeller渲染、Dart虚拟机),鸿蒙平台层则是餐厅所在的物业,负责提供水电、排污、消防通道这些基础设施。餐厅要正常营业,必须和物业把各种接口约定好——这就是Platform Channel机制存在的意义。

Flutter的Platform Channel分为三种:MethodChannel用于方法调用,EventChannel用于事件订阅,BasicMessageChannel用于双向消息传递。鸿蒙侧的适配基本沿用这套设计,Dart侧代码不用区分你底下跑的是Android还是鸿蒙,你只要知道MethodChannel调过去之后,鸿蒙侧会有一个对应的平台实现来接住。

这里有个很重要的坑:鸿蒙的Ability模型和Android的Activity模型有本质区别,一个应用可以包含多个UIAbility,每个UIAbility都有自己的生命周期回调。Flutter引擎挂载在哪个Ability上,直接决定了应用前后台切换时Dart侧拿到的生命周期事件是什么。我一开始做生命周期监听就踩了坑,用Android的习惯去监听visibility状态变化,结果在鸿蒙上时序完全不同,后来老老实实按鸿蒙的onForeground/onBackground事件去做映射,问题才解决。

2.2 EventChannel和PlatformView:跨端通信的两个关键时刻

EventChannel在Flutter里常用于原生层向Dart层推送高频事件,比如电量变化、网络状态、定位信息。鸿蒙侧的EventChannel适配实现,本质上是在鸿蒙原生侧构建一个事件源,然后通过一个流式接口把事件数据传给Flutter引擎。

实际操作中我建议你把事件流的生命周期和服务自身的生命周期绑定清楚。举个例子,如果是一个蓝牙扫描事件,需要在Ability的onDestroy里把EventChannel的收尾逻辑也一并处理掉,否则会出现"页面关了事件还在源源不断往上推"的内存泄漏问题。这和Android上忘记注销Receiver是一个道理,但是因为鸿蒙的组件销毁路径更扁平,泄漏问题的隐蔽性反而更高。

PlatformView则解决的是"鸿蒙原生组件能不能直接嵌到Flutter页面里"的问题。常见的场景包括:地图组件、视频播放器、WebView、自定义绘制控件。Flutter的PlatformView机制在Android上经历过好几代演进(AndroidView的Virtual Display模式到TextureLayerHybridComposition模式),鸿蒙侧的实现也面临着差不多的渲染层冲突问题——原生组件和Flutter纹理画面叠加的时候,谁在上面谁在下面,触摸事件怎么穿透,焦点怎么分配。

我自己的经验是,能不用PlatformView就别用,把Native能力封装成数据通道而不是视图通道,是更稳的做法。实在绕不开的时候,优先考虑把PlatformView包成一个独立的Widget,并且严格控制它的尺寸变化频率,因为频繁改变尺寸会导致鸿蒙侧视图重建,帧率会明显跳水。

2.3 Impeller渲染引擎与鸿蒙适配:为什么画面能润起来

Flutter 3.10之后的版本里,iOS端默认开启Impeller渲染引擎,它的核心目标是用预编译的Shader和更现代的图像API(Metal、Vulkan)解决Skia在iOS上的首帧白屏和掉帧问题。那么问题来了:Flutter跑在鸿蒙上,用什么渲染?

鸿蒙设备底层支持两种图形环境:一种是兼容层的OpenGL ES,另一种是新一代的方舟图形栈,底层是自研的图形接口,对标Vulkan的作用。Flutter引擎在鸿蒙侧目前主要走OpenGL ES路径,这是最稳妥的兼容方案。也就是说,绝大多数Flutter鸿蒙应用在渲染层面跑的还是Skia+OpenGL ES的组合,Impeller目前尚未完整适配鸿蒙的图形接口。

这带来的直接后果是:你在iOS上体验到的Impeller流畅度提升,在鸿蒙上暂时享受不到,但鸿蒙的方舟图形栈也不是完全没用。如果你的Flutter应用和鸿蒙原生页面混排——也就是一个页面里一半是Flutter引擎渲染,一半是ArkUI原生渲染——那两边的性能差异会变得很直观。我做性能比对的时候发现,在帧率要求极高的滚动场景里,ArkUI页面比Flutter引擎跑得稳,但在复杂动画场景里,Flutter自身的动画框架又明显强于ArkUI的实现。最佳实践是把每一项技术的优势用在它擅长的场景里,不是强行统一。

2.4 包管理与工程结构:HAR包、ohpm和Flutter插件的共处之道

鸿蒙应用开发里,代码共享的单位是HAR包(HarmonyOS Archive),类似安卓的AAR和Flutter的Package。你可以在鸿蒙工程里同时引入Flutter的插件模块(通常是一个独立工程或二进制产物)和HAR包,它们之间通过ohpm(鸿蒙的包管理器)和Flutter的pub包管理器分别维护。

就我的实际体验来说,维护一个同时包含Flutter模块和鸿蒙原生模块的工程,最怕的是依赖版本管理混乱。建议从一开始就明确:Flutter侧的所有依赖统一锁版本(pubspec.lock里锁死),鸿蒙侧的所有HAR包在oh-package.json5里锁死,两边都不要轻易漂移版本。因为这个项目一旦进入联调阶段,你根本没时间排查"到底是Flutter版本升级导致的定位偏差,还是鸿蒙包的SDK版本升级导致的行为变化"。

3. 从零跑通Flutter鸿蒙项目的实操记录

3.1 环境准备与版本选型:一步错步步错的环节

如果你的目标设备是HarmonyOS NEXT(也就是纯血鸿蒙),那前提是你手上得有适配了OpenHarmony的Flutter SDK分支,以及配套的DevEco Studio版本。目前主流的方案是使用社区维护的flutter_flutter分支(适配OpenHarmony的fork版本),配合OpenHarmony SDK进行开发。

版本选型上,我的建议是别追新。很多教程会鼓励你直接装最新版SDK,但事实上最新版往往伴随着flutter工具链和鸿蒙工具链的兼容性问题。一个稳妥的组合是:Flutter SDK用3.22.x左右的稳定分支,OpenHarmony SDK用API 11或API 12的稳定版本,DevEco Studio保持更新到能正常创建Stage模型工程的版本就行。

安装过程中有个坑需要提前说:Flutter鸿蒙分支的环境变量配置和官方Flutter略有不同,尤其是flutter doctor的输出里,HarmonyOS相关的检查项未必默认启用,需要你手动导入鸿蒙SDK路径。我第一天配置环境时卡了将近三小时,最后发现是因为环境变量里多了一个空格导致路径解析失败。另外,一定记得把OpenHarmony的SDK目录加到DevEco Studio的SDK Manager里,否则后面创建工程时会提示"可用的SDK为空"。

3.2 创建项目并配置鸿蒙平台:一个Flutter工程如何长出双生能力

整个创建过程可以分为三步:

第一步,用Flutter命令创建标准工程:flutter create --org com.yourcompany --project-name your_app your_app。此时工程里还只有android、ios、web这些平台目录。

第二步,添加鸿蒙平台支持。社区适配版的Flutter通常提供了额外的命令或脚本,运行后会在工程根目录生成一个harmony目录,这个目录里就是鸿蒙工程的Stage模型结构——entry模块、app.json5配置、module.json5配置、以及主UIAbility的入口代码。

第三步,在鸿蒙工程里配置Flutter依赖。你需要把Flutter引擎的鸿蒙产物(so库和Flutter.h头文件等)引入到鸿蒙工程里,这一步通常是修改entry模块的build-profile.json5文件添加依赖路径,同时在模块里配置CMake或者直接引用预编译产物。

配置完成后,entry/src/main/ets/entryability/EntryAbility.ets就是你的启动入口,里面会加载Flutter引擎并把它挂载到一个FlutterContainer组件上。我的建议是,不要在EntryAbility里堆业务代码,只做Flutter引擎的初始化和生命周期转发,所有业务逻辑都放在Dart侧,这样后续如果要把Flutter页面拆成多个Ability模块,迁移成本会小很多。

3.3 原生能力桥接:一个EventChannel完整示例

假设你现在要从鸿蒙侧向Flutter侧推送设备电池电量数据,Dart侧代码如下:

import 'package:flutter/services.dart'; class BatteryChannel { static const EventChannel _batteryChannel = EventChannel('com.example/battery'); Stream<int> getBatteryStream() { return _batteryChannel.receiveBroadcastStream().map((event) => event as int); } }

鸿蒙侧需要做的事情是在一个Ability里创建一个EventChannel,名字必须和Dart侧完全一致,然后往channel里推送数据:

import { FlutterEventChannel, FlutterEventSink } from '@ohos/flutter_ohos'; export class BatteryEventChannel { private channel: FlutterEventChannel | null = null; private sink: FlutterEventSink | null = null; constructor(flutterEngine: FlutterEngine) { this.channel = new FlutterEventChannel(flutterEngine, 'com.example/battery'); this.channel.setStreamHandler({ onListen: (args, sink) => { this.sink = sink; // 模拟电量推送,真实场景在这里注册系统电池回调 const timer = setInterval(() => { this.sink?.success(85 + Math.floor(Math.random() * 10)); }, 3000); }, onCancel: (args) => { this.sink = null; } }); } }

这里有几个细节值得注意:EventChannel的Sink对象是单例的,onListen之前往sink里写数据是无效的;推送完一定要做类型转换,鸿蒙侧的number类型在Dart侧默认映射成double,如果你Dart侧声明的Stream类型是int,需要在.map里先cast一下;取消订阅后鸿蒙侧的定时器必须清理,否则会一直推数据到死。

3.4 构建、签名与真机部署:绕不开的鸿蒙发布流程

鸿蒙应用和安卓应用一样,上架和安装都需要签名。开发阶段可以用DevEco Studio里配置的自动签名,但如果你要做Debug构建给测试团队安装,建议手动创建一个本地签名配置。

签名文件是一个.p12格式的证书文件,配合.csr证书请求文件和.cer证书文件,三件套组装成profiles文件夹,在build-profile.json5里指定。要注意的是,签名文件的过期时间和管理流程跟安卓的keystore完全不同,最好单独建一个文档记录证书的生效时间和续期方式。

构建命令在Flutter鸿蒙分支里通常是flutter build hap --debug或者--release,产物是.hap结尾的鸿蒙应用包。真机部署时有两种方式:一种是用DevEco Studio的连接设备按钮,另一种是用hdc工具命令行安装。我强烈建议命令行方式,因为可以集成到CI/CD流水线里。命令是hdc install -r your_app.hap,如果设备没有解锁或者签名不匹配,会提示安装失败,需要检查设备是否开启了"允许安装未上架应用"的开发者选项。

4. 常见问题与排查实录:Flutter鸿蒙开发避坑指南

4.1 构建阶段报错:Gradle同步失败与索引损坏

用Flutter鸿蒙分支构建的时候,最让人头疼的是Gradle相关报错。我之前遇到一个很典型的错误:

Could not close index

这个问题本质上是Gradle的构建缓存和索引文件发生了损坏,常见原因是工程里同时存在Maven依赖、ohpm包和本地har包引用,Gradle在尝试编译多个模块时,索引文件的写入顺序出了问题。

解决办法分三步:清掉Gradle缓存目录(~/.gradle/caches),删除工程根目录下的build目录和.gradle目录,最后在DevEco Studio里执行一次"Sync Project"。如果还是不行,把Gradle的版本固定到工程build.gradle里指定的版本,不要使用Gradle自动下载的最新版。

还有一个高频报错和Flutter主Gradle插件相关,类似:

You are applying Flutter's main Gradle plugin imperatively using the apply method

这个报错出现在你把Flutter模块当成普通Gradle library集成时,需要改用plugins块方式引入Flutter Gradle插件,而不要用apply命令。这属于Flutter Gradle插件既有API变化导致的问题,和你用的鸿蒙版本没有直接关系,但如果你同时集成了鸿蒙插件,两边的插件声明方式必须保持一致,否则会出现插件冲突。

4.2 运行期崩溃:Dart VM初始化失败与ABI不匹配

运行期一个让人头皮发麻的崩溃长这样:

E/flutter (31173): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled exception: Invalid argument(s): Unsupported class version

这个报错的经典原因有三个。最常见的是Dart SDK和鸿蒙侧构建产物的ABI不一致,比如Flutter SDK是x86_64的模拟器版本,但你安装到的是arm64的真机设备。解决方法是检查flutter_harmony和鸿蒙SDK的版本匹配关系,确保Flutter引擎层产物和设备CPU架构对应。

第二类原因是混合编译模式下,ks和dill文件(Dart的中间产物)损坏。删掉build目录重新构建通常能解决。第三类原因是鸿蒙真机的系统版本和OpenHarmony SDK API level不匹配,比如用API 12编译的应用安装到API 11的设备上,部分系统调用会失败。

排查崩溃时最有效的手段是抓鸿蒙侧的系统日志,命令是hdc shell hilog,它会输出鸿蒙系统层的所有运行日志,包括Flutter引擎初始化过程的完整堆栈。我强烈建议在开发调试阶段就把Flutter的日志输出级别调到verbose,这样Dart侧、引擎侧和平台侧三层日志都能看到,定位问题快很多。

4.3 状态丢失与导航错乱:Flutter页面切换的鸿蒙适配坑

热词里有人问"Flutter Navigator切换页面后会不会丢失状态",这问题在纯Flutter环境里答案是"不会",但在鸿蒙混合场景里,答案就没那么绝对了。

鸿蒙的Ability本身就是一种"可销毁"的组件,系统在内存压力大时可能会回收后端的UIAbility。如果你的Flutter根ViewController是挂在UIAbility上的,Ability被回收后Flutter引擎也会随之释放,等用户再切回来时,系统重建Ability,Flutter引擎从零启动,页面状态自然丢了。这和Android上Activity被系统回收是同一个道理,只是鸿蒙的回收策略在某些设备上更加激进。

规避方案有三个层次:第一,在鸿蒙侧配置UIAbility的launchMode,尽量使用singleton模式,减少Ability被回收的概率;第二,把关键业务数据(购物车、表单输入等)放到鸿蒙侧的用户首选项(Preferences)或者应用级数据库里,Flutter侧监听生命周期在onBackground时做一次持久化快照;第三,如果一定要恢复Dart侧的Widget状态,可以尝试用Flutter的RestorationManager机制,但跨引擎重启后RestorationId的对应关系需要你在鸿蒙侧做好映射。

还有一个偏门但真实碰到过的场景:Flutter页面里嵌了PlatformView,切换页面后PlatformView闪白或者消失。这多半是PlatformView在鸿蒙侧的Surface生命周期没有跟随Flutter页面的dispose逻辑,需要在Widget的dispose方法里主动通知鸿蒙侧释放Surface,否则下次切换回来时Surface句柄已经失效了。

4.4 微任务队列与事件循环:Future的then回调到底什么时候执行

热词里有个很哲学的问题:Flutter里Future的then回调是放进微任务队列吗?答案是:Dart里Future的then回调确实是通过scheduleMicrotask方式调度的,不是普通的事件循环任务。也就是说,它在同一轮事件循环结束后、下一轮事件开始前就会执行。

理解这个原理在鸿蒙开发里有什么用?有,而且有大用。鸿蒙原生侧的事件分发有自己的线程模型,Flutter引擎里的Dart事件循环和鸿蒙UI线程是两个独立的循环。当你从鸿蒙侧通过MethodChannel发起一次异步调用时,Dart侧的then回调会被投递到Dart的事件循环的微任务队列里,没跑完的微任务会阻塞Dart侧UI的后续帧渲染。如果鸿蒙侧回调特别频繁(比如传感器数据每秒30次),微任务队列积压会导致Flutter页面肉眼可见的卡顿。

所以我的建议是,在MethodChannel的参数传递上做好节流,高频数据流优先用EventChannel并让鸿蒙侧合并批次,低频请求才用MethodChannel逐条触发。有人会在鸿蒙侧用setInterval高频推送消息,这在Debug模式下的表现和Release模式完全不同,Release模式更容易暴露卡顿问题。

4.5 性能适配:帧率、内存和渲染管线的平衡术

Flutter鸿蒙应用的性能优化,和安卓平台的思路既相似又不同。相似的地方是都需要关注widget树重建频率、图片内存占用、列表懒加载。不同的地方在于鸿蒙的图形栈和系统后台管理策略有自己的脾气。

先说帧率。鸿蒙设备上如果Flutter页面出现滚动掉帧,先诊断的是不是Dart侧在build阶段做了重活,用flutter run --profile模式观察帧时间线,如果每帧build阶段超过8ms,就得优化布局层级,减少不必要的setState范围,用RepaintBoundary隔离重绘区域,这些都是常规手段。

再说内存。鸿蒙系统对后台应用的内存回收策略比Android更激进,你在开发时感觉良好,一旦切到后台再切回来,进程可能被杀了重开。应对方案是:Flutter侧图片缓存设置合理上限(PaintingBinding.instance.imageCache.maximumSize),列表组件复用不要无上限创建,另外在鸿蒙侧给Flutter引擎设置低内存回调,收到回调后主动清理Dart侧的图片缓存和Cache对象。

最后说说渲染管线。我之前提到Impeller在鸿蒙上还没完全落地,所以现在的Flutter鸿蒙应用走的是Skia渲染管线。Skia在鸿蒙设备上有一个老毛病:首帧渲染时Shader编译会有明显卡顿,页面越复杂卡顿越明显。缓解方法是尽量减少复杂Shader的使用,尤其是避免一进入页面就触发大量模糊效果和高斯阴影,把这些效果的启用时机延后到用户实际交互时再触发。

5. 机遇与挑战:我对这套技术栈融合的个人判断

5.1 机遇:存量Flutter团队进入鸿蒙生态的巨大红利

从市场层面看,鸿蒙应用生态的扩张速度和开发者的供给相比存在明显缺口,而这个缺口对于存量Flutter团队来说是结构性红利。

为什么这么说?因为鸿蒙原生开发目前的主力语言ArkTS虽然在语法上对前端开发者和安卓开发者都相对友好,但真正能高效产出复杂应用的资深开发人员依然稀缺。而一个成熟的Flutter团队,项目代码、组件库、业务模块、CI/CD流水线都是现成的,只要搞定引擎层的鸿蒙适配,就能在很短时间内把手里的成熟应用搬到鸿蒙生态里。这在竞标和交付场景下是巨大的先发优势。

我看到的现实案例是,很多研发团队做鸿蒙适配时不会选"把原生应用重写一遍"这条路,而是走"Flutter为核、鸿蒙外壳"的混合架构,用Flutter承载核心业务页面,用鸿蒙欢迎页、登录SDK、系统设置页承接生态隔离的部分。这种架构上线后,迭代效率比纯鸿蒙原生团队快一半以上,而且人力成本低不少。

5.2 挑战:混合生态的技术债和管理难题

机遇的另一面,是绕不开的技术债。

首先是维护成本。Flutter鸿蒙分支不是谷歌官方的Flutter发行线,而是社区适配版本,版本更新节奏、bug修复响应速度、API稳定性都跟官方主分支有差距。每次上游Flutter升级,鸿蒙分支的合并都意味着引擎层的重新适配,这个工作量和普通插件升级完全不是一个量级。

其次是人才梯队。你团队的成员需要同时理解Flutter的Dart运行时、鸿蒙的Stage模型、以及双方桥接层的生命周期映射关系。能在高并发状态下说清楚"一个页面从启动到渲染经历了哪些层的哪些调用"的开发人员,目前市场上并不多。对管理者来说,招这样的人不如从现有团队里花时间培养,但培养周期通常是两到三个月,期间项目进度可能会受到影响。

最后是生态工具的成熟度。Flutter的很多经典插件(比如地图、支付、Push推送)都是围绕Android和iOS生态做的,鸿蒙侧插件往往需要自己写。就算你写好了鸿蒙侧插件,能否顺利通过鸿蒙市场审核、是否有足够的真机测试覆盖,都需要额外投入。一些第三方SDK厂商对鸿蒙的支持力度参差不齐,遇到官方不支持的场景,你可能得自己逆向SDK协议再封装一遍。

5.3 我个人的实操体会与后续想做的事

踩过这么多坑之后,我对Flutter鸿蒙开发的态度是:这套技术路线适合在特定条件下使用,它不是一个万能的银弹,但如果你已经在Flutter生态里沉淀了足够多的业务资产,现在又面临多端交付的压力,那Flutter鸿蒙方案是目前性价比最高的选择之一。

如果要我给后来的团队一句忠告,我会说:不要只做"能跑通"就交付,一定要在项目初期把架构分层和依赖隔离做好——Dart侧业务代码不通感鸿蒙细节,鸿蒙侧只做平台的桥接和系统能力注入,所有跨端逻辑都走统一抽象的Service接口。这个原则听起来简单,但真正在项目周期里坚持下来并不容易,尤其是当业务方天天催需求的时候,很容易就写出一堆"Flutter和鸿蒙逻辑纠缠在一起"的代码,后面排查问题会痛不欲生。

我目前在推动的方向是:把Flutter鸿蒙方案里的引擎层适配做成团队内部可复用的基础组件仓库,把文档、调试工具、示例代码沉淀下来,未来如果有其他项目要接入,就不用再从零踩坑了。这条路还很长,但方向我认为是对的——跨平台技术栈融合不是一代人就能解决的问题,它需要在一次次的项目迭代里不断沉淀、打磨和验证。

返回列表