在華為牽頭下,Flutter 鴻蒙化如火如荼進行,當第一次看到一份上百個插件的Excel 列表時,我也感到震驚,排名前 100 的插件赫然在列,這無疑是一次大規模的軍團作戰。
然后,參戰團隊魚龍混雜,難免有人要渾水摸魚。
某天,一名小伙伴發來一條消息,上來就發來幾行代碼
dependency_overrides:get:git:url: "https://gitcode.com/openharmony-sig/fluttertpc_get.git"
引入以后,出現了以下錯誤:
../../../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 文件中,定義了每個平臺的實現
flutter:plugin:platforms:android:default_package: webview_flutter_androidios:default_package: webview_flutter_wkwebviewohos: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 里面增加了鴻蒙的入口,可有可無,這么一通操作,不僅沒有實際貢獻,還給開發者造成了困擾,不了解的還以為適配鴻蒙平臺需要使用這個版本呢,引入以后還容易出錯,最終,鴻蒙化了個寂寞。