備忘
有關編寫高效插件的注意事項列表,請參考 Medium 上的文章:Writing a good plugin。
連結:
https://medium.com/flutter/writing-a-good-flutter-plugin-1a561b986c9c
1.1 Package 類別Package 包含以下兩種類別:
純 Dart 庫:用 Dart 編寫的傳統 package,比如 path。其中一些可能包含 Flutter 的特定功能,因此依賴於 Flutter 框架,其使用範圍僅限於 Flutter,比如 fluro。
原生插件:使用 Dart 編寫的,按需使用 Java 或 Kotlin、ObjC 或 Swift 分別在 Android 和/或 iOS 平臺實現的 package。一個具體的例子是 battery。
步驟1:創建 package
想要創建純 Dart 庫的 package,請使用帶有 --template=package 標誌的 flutter create 命令:
這將在 hello/ 目錄下創建一個 package 項目,其中包含以下內容:
lib/hello.dart
package 的 Dart 實現代碼。
test/hello_test.dart
Package 的 單元測試。
對於純 Dart 庫的 package,只要在 lib/<package name>.dart 文件中添加功能實現,或在 lib 目錄中的多個文件中添加功能實現。如果要對 package 進行測試,在 test 目錄下添加 單元測試。如果想要開發一個調用特定平臺 API 的 package,你需要開發一個原生插件 packgae。原生插件 packgae 是 Dart package 的特別版本,除了要實現 Dart package 要實現的內容,還需要按需使用 Java 或 Kotlin、ObjC 或 Swift 分別在 Android 和/或 iOS 平臺實現,你可以使用 platform channel 中的 API 來實現特定平臺的調用。https://flutter.cn/docs/development/platform-integration/platform-channels想要創建原生插件 package,請使用帶有 --template=plugin 標誌的 flutter create 命令。使用 --org 選項,以反向域名表示法來指定你的組織。該值用於生成的 Android 及 iOS。這將在 hello/ 目錄下創建一個插件項目,其中包含以下內容:android/src/main/java/com/example/hello/HelloPlugin.kt:ios/Classes/HelloPlugin.m:一個依賴於該插件並說明了如何使用它的 Flutter 應用。默認情況下,插件項目中 iOS 代碼使用 Swift 編寫,Android 代碼使用 Kotlin 編寫。如果你更喜歡 Objective-C 或 Java,你可以通過 -i 指定 iOS 所使用的語言和/或使用-a 指定 Android 所使用的語言。比如:由於原生插件類型的 package 包含了使用多種程式語言編寫的多個平臺代碼,因此需要一些特定步驟來保證體驗的流暢性。步驟 2a:定義 package API(.dart)原生插件類型 package 的 API 在 Dart 代碼中要首先定義好,使用你鍾愛的 Flutter 編輯器,打開 hello/ 主目錄,並找到 lib/hello.dart 文件。步驟 2b:添加 Android 平臺代碼(.java/.kt)我們建議你使用 Android Studio 來編輯 Android 代碼。使用 Android Studio 編輯 Android 平臺代碼之前,首先確保代碼至少被構建過一次(換句話說,即從 IDE/編輯器執行示例程序,或在終端中執行以下命令:cd hello/example; flutter build apk)。(2)在「Welcome to Android Studio」對話框中選擇「Import project」,或在菜單中選擇「File > New > Import Project…」,然後選擇 hello/example/android/build.gradle 文件;(3)在「Gradle Sync」對話框中,選擇「OK」;(4)在「Android Gradle Plugin Update」對話框中,選擇「Don’t remind me again for this project」。插件的 Android 平臺代碼位於 hello/java/com.example.hello/HelloPlugin。你可以在 Android Studio 中點擊 ▶ 按鈕來運行示例程序。步驟 2c:添加 iOS 平臺代碼(.h+.m/.swift)我們建議你使用 Xcode 來編輯 iOS 代碼。使用 Xcode 編輯 iOS 平臺代碼之前,首先確保代碼至少被構建過一次(即從 IDE/編輯器執行示例程序,或在終端中執行以下命令:cd hello/example; flutter build ios --no-codesign)。(2)選擇「File > Open」,然後選擇 hello/example/ios/Runner.xcworkspace 文件。插件的 iOS 平臺代碼位於項目導航中的 Pods/Development Pods/hello/Classes/。步驟 2d:關聯 API 和平臺代碼最後,你需要將 Dart 編寫的 API 代碼與特定平臺的實現相互關聯。(1)README.md 文件用來對 package 進行介紹(2)CHANGELOG.md 文件用來記錄每個版本的更改(3)LICENSE 文件用來闡述 package 的許可條款(4)API 文檔包含所有的公共 API(詳情參見下文)當你提交一個 package 時,會自動生成 API 文檔並將其提交到 dartdocs.org,示例請參見 device_info docs如果你希望在本地開發環境中生成 API 文檔,可以使用以下命令:(1)將當前工作目錄切換到 package 所在目錄:cd ~/dev/mypackage
(2)告知文檔工具 Flutter SDK 所在位置(更改以反應它所在的位置):export FLUTTER_ROOT=~/dev/flutter(適用於 macOS 或 Linux 作業系統)
set FLUTTER_ROOT=~/dev/flutter(適用於 Windows 作業系統)
(3)運行 dartdoc 工具(作為 Flutter SDK 的一部分):$FLUTTER_ROOT/bin/cache/dart-sdk/bin/dartdoc(適用於 macOS 或 Linux 作業系統)
%FLUTTER_ROOT%\bin\cache\dart-sdk\bin\dartdoc(適用於 Windows 作業系統)
每個 LICENSE 文件中的各個許可證應由 80 個短線字符組成的線段進行分割。如果 LICENSE 文件中包含多個組件許可證,那麼每個組件許可證必須以其所在 package 的名稱開始,每個 package 名稱單獨一行顯示,並且 package 名稱列表與實際許可證內容由空行隔開。(package 名稱無需與 pub package 相匹配。比如,一個 package 可能包含多個第三方代碼,並且可能需要為每個 package 添加許可證。)package_1
<some license text>
package_2
<some license text>
package_1
<some license text>
package_1
package_2
<some license text>
<some license text>
<some license text>
package_1
<some license text>
<some license text>
dependencies:
url_launcher: ^0.4.2
android {
dependencies {
provided rootProject.findProject(":url_launcher")
}
}
Pod::Spec.new do |s|
s.dependency 'url_launcher'