鸿蒙Flutter开发故事:不,你不需要鸿蒙化

在华为牵头下,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 里面增加了鸿蒙的入口,可有可无,这么一通操作,不仅没有实际贡献,还给开发者造成了困扰,不了解的还以为适配鸿蒙平台需要使用这个版本呢,引入以后还容易出错,最终,鸿蒙化了个寂寞。

相关推荐
Kratos2 小时前
鸿蒙状态管理中V1和V2的区别(3)(HarmonyOS API14版本)
harmonyos
Nathan202406163 小时前
Flutter - 基础组件的内容及框架
flutter
Zsnoin能3 小时前
3分钟实现git托管软件安装包,并实现版本检测和更新功能
git·flutter
小藤神3 小时前
鸿蒙ArtTS 中如何实现地图打卡功能 比如公司打卡 文章配置完整代码
前端·harmonyos·arkts
仙魁XAN6 小时前
Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听(断网/网络恢复事件监听)
flutter·网络状态·network·connectivity
Nathan202406167 小时前
Dart - 基本语法与Kotlin的对比
android·flutter·面试
苏杰豪7 小时前
鸿蒙特效教程09-深入学习animateTo动画
华为·harmonyos
Kousi7 小时前
旧时代的船?来看看鸿蒙V1状态管理装饰器
前端·面试·harmonyos
Sinyu10128 小时前
Flutter 自定义 CustomPaint 实现流体液态加载动画
前端·flutter·ui kit