在华为牵头下,Flutter 鸿蒙化如火如荼进行,当第一次看到一份上百个插件的Excel 列表时,我也感到震惊,排名前 100 的插件赫然在列,这无疑是一次大规模的军团作战。
然后,参战团队鱼龙混杂,难免有人要浑水摸鱼。
某天,一名小伙伴发来一条消息,上来就发来几行代码
bash
dependency_overrides:
get:
git:
url: "https://gitcode.com/openharmony-sig/fluttertpc_get.git"
引入以后,出现了以下错误:
bash
../../../pub-cache/git/fluttertpc_get-fcb370a5094adf8f93261bbad5691de233ec6276/lib/get_navigation/src/extension_navigation.dart:222:62: Error: The getter 'backgroundColor' isn't defined for the class 'ThemeData'.
'ThemeData' is from 'package:flutter/src/material/theme_data.dart' ('../../../versions/versions/custom_3.22.0-ohos/packages/flutter/lib/src/material/theme_data.dart').
Try correcting the name to the name of an existing getter, or defining a getter or field named 'backgroundColor'.
TextStyle(color: confirmTextColor ?? theme.backgroundColor),
^^^^^^^^^^^^^^^
Target kernel_snapshot failed: Exception
看到错误信息,询问之后,确认对方使用的是 Flutter 版本为 3.21,由此可以得出结论,版本不匹配。
同时,让我感到疑惑的是,getx 不是纯 dart 库吗,这也要鸿蒙化?吓得我赶紧打开仓库源码,查看目录和依赖,并没有发现 ohos 相关的平台实现,这让我更迷惑了。于是,我点击提交日志,挨个查看最近的每条记录,查看代码变更,这一看可不得了,我乐了。

简单探究之后,我回复对方,直接用官方社区的插件和版本,没过几分钟,问题得到解决。
第二天,百无聊赖之际,我又想起这个仓库,很好奇到底发生了什么,于是我再次打开仓库,仔细研究一番。
先看变更文件类型,只有几个 markdown 文件,查看其中一个 README 的介绍
"本方案采用插件化的适配器模式实现get库鸿蒙化版本的兼容。",既然是插件化实现,必然要有鸿蒙原生代码,我们知道,Flutter 如果要实现插件化,就需要有平台实现,那么就应该有类似 ohos 的目录工程,类似于下面这样的目录结构:

这是一个标准的 Flutter 插件,webview_flutter 为抽象层,相当于抽象接口(Interface),我们的调用就发生在这里,至于 webview_flutter_ohos, webview_flutter_web 则是每个平台的具体实现(Implement),在 webview_flutter 的 pubspec 文件中,定义了每个平台的实现
yaml
flutter:
plugin:
platforms:
android:
default_package: webview_flutter_android
ios:
default_package: webview_flutter_wkwebview
ohos:
default_package: webview_flutter_ohos
同时将各个平台的实现 package 依赖进来,这种方式通过拆分不同平台实现了解耦。
当然,插件还可以有另外一种实现形式,也就是早期的耦合式结构,将所有的平台实现放在一个 package 里面,类似于这样:

这种结构也有自身的优点,适用于私有项目,方便统一管理,减少项目结构复杂度。
然而,对于现在这个 get 仓库,啥也没有。
还有一个困扰开发者的问题,如何判断一个插件是否需要鸿蒙化,这里可以从几个方面判断:
1.纯 dart 代码自然跨平台,也就不需要单独适配,这是因为 dart vm 已经适配了鸿蒙(基于鸿蒙社区的 Flutter SDK)
2.依赖于原生平台实现的插件需要鸿蒙化,这里的原生平台指的是 ios/android/ohos 等,可以查看插件的代码仓,查看是否有 ohos 目录或 xxx_ohos 的平台包
3.插件本身为纯 dart 实现,但其依赖的插件有可能需要鸿蒙化,这就需要对其依赖的其他插件逐个排查
总结一下都干了啥,一行核心代码没改,改了些无关痛痒的 markdown,版本信息,example 里面增加了鸿蒙的入口,可有可无,这么一通操作,不仅没有实际贡献,还给开发者造成了困扰,不了解的还以为适配鸿蒙平台需要使用这个版本呢,引入以后还容易出错,最终,鸿蒙化了个寂寞。