開發包與外掛
如何為 Flutter 編寫包和外掛。
包簡介
#包可以實現模組化程式碼的建立,並能輕鬆共享。一個最小化的包包含以下內容:
pubspec.yaml-
一個元資料檔案,宣告包名稱、版本、作者等資訊。
lib-
lib目錄包含包中的公共程式碼,最少包含一個<包名>.dart檔案。
包型別
#包可以包含多種型別的內容:
- Dart 包
-
使用 Dart 編寫的通用包,例如
path包。其中一些可能包含 Flutter 特定功能,因此依賴於 Flutter 框架,從而限制了其僅能在 Flutter 中使用,例如fluro包。 - 外掛包
-
一種專門的 Dart 包,包含用 Dart 程式碼編寫的 API 以及一個或多個特定於平臺的實現。
外掛包可以針對 Android(使用 Kotlin 或 Java)、iOS(使用 Swift 或 Objective-C)、Web、macOS、Windows 或 Linux,或者它們的任意組合進行編寫。
一個具體的例子是
url_launcher外掛包。要了解如何使用url_launcher包,以及它是如何擴充套件以實現 Web 支援的,請參閱 Harry Terkelsen 在 Medium 上發表的文章:如何編寫 Flutter Web 外掛,第 1 部分 (How to Write a Flutter Web Plugin, Part 1)。 - FFI 包
-
一種專門的 Dart 包,能夠使用
dart:ffi呼叫原生程式碼。這些包在獨立的 Dart 環境中執行,不需要特定於作業系統的構建檔案。它們透過flutter create --template=package_ffi命令建立(請參閱建立 FFI 包)。這是自 Flutter 3.38 以來構建和打包原生程式碼的推薦方法。
開發 Dart 包
#以下說明解釋瞭如何編寫 Flutter 包。
第一步:建立包
#要建立 Flutter 入門包,請在 flutter create 中使用 --template=package 標誌:
flutter create --template=package hello
這會在 hello 資料夾中建立一個包含以下內容的包專案:
- LICENSE
一個(大部分是空的)許可證文字檔案。
- test/hello_test.dart
該包的單元測試。
- hello.iml
IntelliJ IDE 使用的配置檔案。
- .gitignore
-
一個隱藏檔案,告訴 Git 在專案中忽略哪些檔案或資料夾。
- .metadata
-
一個隱藏檔案,供 IDE 用於跟蹤 Flutter 專案的屬性。
- pubspec.yaml
-
一個包含元資料的 yaml 檔案,指定包的依賴項。由 pub 工具使用。
- README.md
-
一個簡單的 markdown 檔案,簡要描述包的用途。
- lib/hello.dart
一個包含包的 Dart 程式碼的啟動應用。
- .idea/modules.xml, .idea/workspace.xml
-
一個隱藏資料夾,包含 IntelliJ IDE 的配置檔案。
- CHANGELOG.md
-
一個(大部分是空的)markdown 檔案,用於跟蹤包的版本更改。
第二步:實現包
#對於純 Dart 包,只需在主要的 lib/<包名>.dart 檔案中,或在 lib 目錄下的多個檔案中新增功能即可。
要測試包,請在 test 目錄中新增單元測試。
有關如何組織包內容的更多詳細資訊,請參閱 Dart 庫包文件。
開發外掛包
#如果你想開發一個呼叫特定平臺 API 的包,則需要開發一個外掛包。
API 透過平臺通道 (platform channel) 連線到特定平臺的實現。
聯合外掛 (Federated plugins)
#聯合外掛 (Federated plugins) 是一種將外掛 API 分割為平臺介面、該介面的獨立平臺實現,以及使用執行平臺註冊實現的面向應用的介面的方法。
包分離式聯合外掛 (Package-separated federated plugins) 是指將平臺介面、平臺實現和麵嚮應用的介面分別放入各自的 Dart 包中的聯合外掛。
因此,一個包分離式聯合外掛可以為 iOS 使用一個包,為 Android 使用另一個,為 Web 使用另一個,甚至為汽車(作為物聯網裝置示例)使用另一個。除了其他好處外,這種方法還允許領域專家擴充套件現有外掛,以支援他們最熟悉的平臺。
聯合外掛需要以下內容:
- 面向應用的介面 (app-facing interface)
-
外掛使用者在使用外掛時與之互動的介面。該介面指定了 Flutter 應用使用的 API。在包分離式聯合外掛中,這是外掛使用者為了使用外掛所依賴的包。
- 平臺實現 (platform implementation(s))
-
一個或多個包含特定平臺實現程式碼的實現。面向應用的介面會呼叫這些實現——除非它們包含終端使用者可訪問的特定平臺功能,否則在應用中不會直接使用或依賴它們(當採用包分離式結構時)。
- 平臺介面 (platform interface)
-
連接面嚮應用介面與平臺實現的介面。它聲明瞭任何平臺實現必須實現的內容,以支援面向應用的介面。擁有一個定義此介面的獨立包,可確保所有平臺包以統一的方式實現相同的功能。
背書的聯合外掛 (Endorsed federated plugin)
#理想情況下,在向包分離式聯合外掛新增平臺實現時,你會與包作者協調,將你的實現包含在內。這樣,原始作者就背書 (endorses) 了你的實現。
例如,假設你為(虛構的)foobar 外掛編寫了一個 foobar_windows 實現。在背書外掛中,原始的 foobar 作者將你的 Windows 實現作為面向應用包的 pubspec 中的一個依賴項新增。然後,當開發者在他們的 Flutter 應用中引入 foobar 外掛時,Windows 實現以及其他背書的實現將自動提供給應用。
非背書的聯合外掛 (Non-endorsed federated plugin)
#如果由於某種原因你無法讓原始外掛作者新增你的實現,那麼你的外掛就是非背書的。開發者仍然可以使用你的實現,但必須手動將該外掛新增到應用的 pubspec.yaml 檔案中。
dependencies:
foobar: ^1.0.0
foobar_windows: ^1.0.0 # Non-endorsed plugin implementation
此方法也適用於覆蓋已背書的 foobar 外掛實現。
有關聯合外掛的更多資訊、它們為何有用以及如何實現,請參閱 Harry Terkelsen 在 Medium 上發表的文章:如何編寫 Flutter Web 外掛,第 2 部分 (How To Write a Flutter Web Plugin, Part 2)。
指定外掛支援的平臺
#外掛可以透過在 pubspec.yaml 檔案中向 platforms 對映新增鍵來指定它們支援的平臺。例如,下面的 pubspec 檔案顯示了 hello 外掛的 flutter: 對映,它僅支援 iOS 和 Android:
flutter:
plugin:
platforms:
android:
package: com.example.hello
pluginClass: HelloPlugin
ios:
pluginClass: HelloPlugin
當為更多平臺新增外掛實現時,應相應地更新 platforms 對映。例如,這是 hello 外掛在更新以新增對 macOS 和 Web 支援後的 pubspec 檔案中的對映:
flutter:
plugin:
platforms:
android:
package: com.example.hello
pluginClass: HelloPlugin
ios:
pluginClass: HelloPlugin
macos:
pluginClass: HelloPlugin
web:
pluginClass: HelloPlugin
fileName: hello_web.dart
聯合平臺包
#平臺包使用相同的格式,但包含一個 implements 條目,指示它實現了哪個面向應用的包。例如,一個包含 hello 的 Windows 實現的 hello_windows 外掛將具有以下 flutter: 對映:
flutter:
plugin:
implements: hello
platforms:
windows:
pluginClass: HelloPlugin
背書的實現
#面向應用的包可以透過新增對平臺包的依賴,並將其作為 platforms: 對映中的 default_package 來背書該平臺包。如果上面的 hello 外掛背書了 hello_windows,它看起來會像這樣:
flutter:
plugin:
platforms:
android:
package: com.example.hello
pluginClass: HelloPlugin
ios:
pluginClass: HelloPlugin
windows:
default_package: hello_windows
dependencies:
hello_windows: ^1.0.0
請注意,如這裡所示,面向應用的包可以在包內實現某些平臺,而在背書的聯合實現中實現其他平臺。
共享 iOS 和 macOS 實現
#許多框架使用相同或基本相同的 API 同時支援 iOS 和 macOS,這使得用相同的程式碼庫實現某些針對 iOS 和 macOS 的外掛成為可能。通常每個平臺的實現都在其自己的資料夾中,但 sharedDarwinSource 選項允許 iOS 和 macOS 使用同一個資料夾。
flutter:
plugin:
platforms:
ios:
pluginClass: HelloPlugin
sharedDarwinSource: true
macos:
pluginClass: HelloPlugin
sharedDarwinSource: true
environment:
sdk: ^3.0.0
# Flutter versions prior to 3.7 did not support the
# sharedDarwinSource option.
flutter: ">=3.7.0"
當啟用 sharedDarwinSource 時,平臺不再分別使用 iOS 的 ios 目錄和 macOS 的 macos 目錄,而是使用一個共享的 darwin 目錄存放所有程式碼和資源。啟用此選項時,你需要將任何現有檔案從 ios 和 macos 移動到共享目錄。你還需要更新 podspec 檔案,以設定兩個平臺的依賴項和部署目標,例如:
s.ios.dependency 'Flutter'
s.osx.dependency 'FlutterMacOS'
s.ios.deployment_target = '13.0'
s.osx.deployment_target = '10.15'
第一步:建立包
#要建立外掛包,請在 flutter create 中使用 --template=plugin 標誌。
使用 --platforms= 選項後跟逗號分隔的列表,以指定外掛支援的平臺。可用平臺包括:android、ios、web、linux、macos 和 windows。如果不指定任何平臺,則生成的專案不支援任何平臺。
使用 --org 選項指定你的組織,使用反向域名錶示法。此值用於生成的外掛程式碼中的各種包和繫結識別符號。
預設情況下,外掛專案對 iOS 程式碼使用 Swift,對 Android 程式碼使用 Kotlin。如果你更喜歡 Objective-C 或 Java,可以使用 -i 指定 iOS 語言,使用 -a 指定 Android 語言。請選擇以下一種:
flutter create --org com.example --template=plugin --platforms=android,ios,linux,macos,windows -a kotlin hello
flutter create --org com.example --template=plugin --platforms=android,ios,linux,macos,windows -a java hello
flutter create --org com.example --template=plugin --platforms=android,ios,linux,macos,windows -i objc hello
flutter create --org com.example --template=plugin --platforms=android,ios,linux,macos,windows -i swift hello
這會在 hello 資料夾中建立一個包含以下專門內容的外掛專案:
lib/hello.dart外掛的 Dart API。
android/src/main/java/com/example/hello/HelloPlugin.kt-
外掛 API 的 Android 特定平臺實現(使用 Kotlin)。
ios/Classes/HelloPlugin.m-
外掛 API 的 iOS 特定平臺實現(使用 Objective-C)。
example/-
一個依賴於該外掛的 Flutter 應用,展示瞭如何使用它。
第二步:實現包
#由於外掛包包含用多種程式語言為多個平臺編寫的程式碼,因此需要採取一些特定的步驟來確保順暢的體驗。
第二步 (a):定義包 API (.dart)
#外掛包的 API 是在 Dart 程式碼中定義的。在你最喜歡的 Flutter 編輯器中開啟主要的 hello/ 資料夾,並找到 lib/hello.dart 檔案。
第二步 (b):新增 Android 平臺程式碼 (.kt/.java)
#建議使用 Android Studio 編輯 Android 程式碼。
在 Android Studio 中編輯 Android 平臺程式碼之前,請確保程式碼至少已構建過一次(也就是說,從你的 IDE/編輯器執行示例應用,或者在終端中執行以下命令):
cd hello/example; flutter build apk --config-only
然後執行以下步驟:
- 啟動 Android Studio。
- 在 Welcome to Android Studio 對話方塊中選擇 Open an existing Android Studio Project,或者從選單中選擇 File > Open,然後選擇
hello/example/android/build.gradle或hello/example/android/build.gradle.kts檔案。 - 在 Gradle Sync 對話方塊中,選擇 OK。
- 在 Android Gradle Plugin Update 對話方塊中,選擇 Don't remind me again for this project。
外掛的 Android 平臺程式碼位於 hello/java/com.example.hello/HelloPlugin。
你可以透過按下執行 (▶) 按鈕從 Android Studio 執行示例應用。
第二步 (c):新增 iOS 平臺程式碼 (.swift/.h+.m)
#建議使用 Xcode 編輯 iOS 程式碼。
在 Xcode 中編輯 iOS 平臺程式碼之前,請確保程式碼至少已構建過一次(也就是說,從你的 IDE/編輯器執行示例應用,或者在終端中執行 cd hello/example; flutter build ios --no-codesign --config-only)。
然後執行以下步驟:
- 啟動 Xcode。
- 選擇 File > Open,並選擇
hello/example/ios/Runner.xcworkspace檔案。
外掛的 iOS 平臺程式碼位於 Project Navigator 中的 Pods/Development Pods/hello/../../example/ios/.symlinks/plugins/hello/ios/Classes。(如果你使用的是 sharedDarwinSource,路徑將以 hello/darwin/Classes 結尾。)
你可以透過按下執行 (▶) 按鈕執行示例應用。
新增原生 Darwin 依賴 (Swift Package Manager)
#Flutter 使用 Swift Package Manager 作為管理原生 iOS 和 macOS 依賴的主要策略。
要使用 Swift Package Manager 將依賴項新增到你的外掛中:
- 在外掛的
ios/my_plugin_name或macos/my_plugin_name目錄中建立一個Package.swift檔案。 - 在
Package.swift描述檔案的dependencies陣列中宣告你的原生依賴項:
dependencies: [
.package(url: "https://github.com/path/to/HelloLibrary.git", from: "1.0.0")
]
有關構造原生資料夾、資源打包或處理混合設定的完整詳細資訊和說明,請訪問外掛作者的 Swift Package Manager 指南。
新增 CocoaPod 依賴 (遺留方式)
#Flutter 繼續支援 CocoaPods 以實現向後相容。如果你的外掛需要支援尚未遷移到 Swift Package Manager 的開發者,請在 ios/hello.podspec 的末尾指定你的 CocoaPods 依賴項:
s.dependency 'HelloPod', '0.0.1'
對於私有 pod,請參考 Private CocoaPods 以確保倉庫訪問許可權。
s.source = {
# For pods hosted on GitHub
:git => "https://github.com/path/to/HelloPod.git",
# Alternatively, for pods hosted locally
# :path => "file:///path/to/private/repo",
:tag => s.version.to_s
}
安裝外掛依賴項
#要獲取並連結外掛的依賴項,請將外掛新增到你應用專案的 pubspec.yaml 依賴項中,並執行 flutter pub get。Flutter 會在原生應用構建步驟中自動解析並連線 Swift Package Manager 描述符或 CocoaPods pod 檔案。
如果你的外掛需要隱私清單(例如,如果你使用了任何必需理由 API),請更新 PrivacyInfo.xcprivacy 檔案以描述你的外掛對隱私的影響,並將以下內容新增到你的 podspec 檔案末尾:
s.resource_bundles = {'your_plugin_privacy' => ['your_plugin/Sources/your_plugin/Resources/PrivacyInfo.xcprivacy']}
更多資訊,請檢視 Apple 開發者網站上的 隱私清單檔案 (Privacy manifest files)。
第二步 (d):新增 Linux 平臺程式碼 (.h+.cc)
#建議使用帶有 C++ 整合的 IDE 編輯 Linux 程式碼。以下說明適用於安裝了 "C/C++" 和 "CMake" 擴充套件的 Visual Studio Code,但也適用於其他 IDE。
在 IDE 中編輯 Linux 平臺程式碼之前,請確保程式碼至少已構建過一次(也就是說,從你的 Flutter IDE/編輯器執行示例應用,或者在終端中執行 cd hello/example; flutter build linux)。
然後執行以下步驟:
- 啟動 Visual Studio Code。
- 開啟
hello/example/linux/目錄。 - 在詢問
Would you like to configure project "linux"?的提示中選擇 Yes。這將允許 C++ 自動補全功能正常工作。
外掛的 Linux 平臺程式碼位於 flutter/ephemeral/.plugin_symlinks/hello/linux/。
你可以使用 flutter run 執行示例應用。注意: 在 Linux 上建立可執行的 Flutter 應用需要使用 flutter 工具的一部分步驟,因此即使你的編輯器提供了 CMake 整合,透過那種方式進行構建和執行也是無法正常工作的。
第二步 (e):新增 macOS 平臺程式碼 (.swift)
#建議使用 Xcode 編輯 macOS 程式碼。
在 Xcode 中編輯 macOS 平臺程式碼之前,請確保程式碼至少已構建過一次(也就是說,從你的 IDE/編輯器執行示例應用,或者在終端中執行 cd hello/example; flutter build macos --config-only)。
然後執行以下步驟:
- 啟動 Xcode。
- 選擇 File > Open,並選擇
hello/example/macos/Runner.xcworkspace檔案。
外掛的 macOS 平臺程式碼位於 Project Navigator 中的 Pods/Development Pods/hello/../../example/macos/Flutter/ephemeral/.symlinks/plugins/hello/macos/Classes。(如果你使用的是 sharedDarwinSource,路徑將以 hello/darwin/Classes 結尾。)
你可以透過按下執行 (▶) 按鈕執行示例應用。
第二步 (f):新增 Windows 平臺程式碼 (.h+.cpp)
#建議使用 Visual Studio 編輯 Windows 程式碼。
在 Visual Studio 中編輯 Windows 平臺程式碼之前,請確保程式碼至少已構建過一次(也就是說,從你的 IDE/編輯器執行示例應用,或者在終端中執行 cd hello/example; flutter build windows)。
然後執行以下步驟:
- 啟動 Visual Studio。
- 選擇 Open a project or solution,並選擇
hello/example/build/windows/hello_example.sln檔案。
外掛的 Windows 平臺程式碼位於 Solution Explorer 中的 hello_plugin/Source Files 和 hello_plugin/Header Files。
你可以透過在 Solution Explorer 中右鍵點選 hello_example 並選擇 Set as Startup Project,然後按下執行 (▶) 按鈕來執行示例應用。重要: 對外掛程式碼進行更改後,必須先選擇 Build > Build Solution,然後再重新執行,否則執行的將是已構建外掛的過期版本,而不是包含你更改的最新版本。
第二步 (g):連線 API 和平臺程式碼
#最後,你需要將 Dart 程式碼編寫的 API 與特定平臺的實現連線起來。這是透過平臺通道或透過平臺介面包中定義的介面來完成的。
為現有外掛專案新增平臺支援
#要將特定平臺支援新增到現有外掛專案,請在專案目錄中再次執行帶有 --template=plugin 標誌的 flutter create。例如,要為現有外掛新增 Web 支援,請執行:
flutter create --template=plugin --platforms=web .
如果此命令顯示有關更新 pubspec.yaml 檔案的訊息,請遵循提供的說明。
Dart 平臺實現
#在許多情況下,非 Web 平臺實現僅使用特定平臺的實現語言,如上所示。但是,平臺實現也可以使用特定平臺的 Dart 程式碼。
僅 Dart 的平臺實現
#在某些情況下,某些平臺可以完全用 Dart 實現(例如,使用 FFI)。對於非 Web 平臺上的僅 Dart 平臺實現,請用 dartPluginClass 替換 pubspec.yaml 中的 pluginClass。這是上面修改後的 hello_windows 示例,用於僅 Dart 的實現:
flutter:
plugin:
implements: hello
platforms:
windows:
dartPluginClass: HelloPluginWindows
在此版本中,你將沒有 C++ Windows 程式碼,而是將 hello 外掛的 Dart 平臺介面類子類化為 HelloPluginWindows 類,其中包含一個靜態的 registerWith() 方法。此方法在啟動期間呼叫,可用於註冊 Dart 實現。
class HelloPluginWindows extends HelloPluginPlatform {
/// Registers this class as the default instance of [HelloPluginPlatform].
static void registerWith() {
HelloPluginPlatform.instance = HelloPluginWindows();
}
混合平臺實現
#平臺實現也可以同時使用 Dart 和特定平臺的語言。例如,外掛可以為每個平臺使用不同的平臺通道,以便可以針對每個平臺進行自定義。
混合實現同時使用上述兩種註冊系統。這是上面修改後的 hello_windows 示例,用於混合實現:
flutter:
plugin:
implements: hello
platforms:
windows:
dartPluginClass: HelloPluginWindows
pluginClass: HelloPlugin
Dart 的 HelloPluginWindows 類將使用上面針對僅 Dart 實現展示的 registerWith(),而 C++ 的 HelloPlugin 類將與僅 C++ 實現中的相同。
測試你的外掛
#我們鼓勵你透過自動化測試來測試你的外掛,以確保在更改程式碼時功能不會倒退。
要了解有關測試外掛的更多資訊,請檢視測試外掛 (Testing plugins)。如果你正在為 Flutter 應用編寫測試,而外掛導致崩潰,請檢視外掛測試中的 Flutter (Flutter in plugin tests)。
開發 FFI 包
#如果你想開發一個使用 Dart 的 FFI 呼叫原生 API 的包,則需要開發一個 FFI 包。
第一步:建立包
#要建立 FFI 入門包,請在 flutter create 中使用 --template=package_ffi 標誌:
flutter create --template=package_ffi hello
這會在 hello 資料夾中建立一個包含以下專門內容的 FFI 包專案:
lib:定義包 API 的 Dart 程式碼,它使用 dart:ffi 呼叫原生程式碼。
src:原生原始碼。
hook/build.dart:編譯原生程式碼的構建鉤子指令碼。
第二步:繫結原生程式碼
#要使用原生程式碼,需要 Dart 繫結。
為了避免手動編寫,它們由 package:ffigen 從標頭檔案 (src/hello.h) 生成。請參考 ffigen 文件以獲取有關如何安裝此包的資訊。
要重新生成繫結,請執行以下命令:
dart run tool/ffigen.dart
第三步:呼叫原生程式碼
#執行時間極短的原生函式可以直接從任何隔離區 (isolate) 呼叫。例如,請參見 lib/hello.dart 中的 sum。
執行時間較長的函式應在輔助隔離區 (helper isolate) 上呼叫,以避免 Flutter 應用中出現丟幀。例如,請參見 lib/hello.dart 中的 sumAsync。
新增文件
#建議在所有包中新增以下文件:
- 一個介紹該包的
README.md檔案 - 一個記錄每個版本更改的
CHANGELOG.md檔案 - 一個
LICENSE檔案,包含包的許可條款 - 所有公共 API 的 API 文件(詳見下文)
API 文件
#當你釋出包時,API 文件會自動生成併發布到 pub.dev/documentation。例如,請檢視 device_info_plus 的文件。
如果你希望在開發機器上本地生成 API 文件,請使用以下命令:
切換到你的包所在目錄
cd ~/dev/mypackage告訴文件工具 Flutter SDK 的位置(修改以下命令以反映其實際位置)
export FLUTTER_ROOT=~/dev/flutter # on macOS or Linux set FLUTTER_ROOT=~/dev/flutter # on Windows- 執行
dart doc工具(包含在 Flutter SDK 中),如下所示:$FLUTTER_ROOT/bin/cache/dart-sdk/bin/dart doc # on macOS or Linux %FLUTTER_ROOT%\bin\cache\dart-sdk\bin\dart doc # on Windows
有關如何編寫 API 文件的建議,請參閱 Effective Dart 文件。
向 LICENSE 檔案新增許可證
#每個 LICENSE 檔案中的各個許可證應由 80 個連字元單獨佔一行分隔。
如果 LICENSE 檔案包含多個元件許可證,則每個元件許可證必須以應用該許可證的包名開頭,每個包名佔一行,並且包列表與實際許可文字之間應由空白行分隔。(包名不需要與 pub 包名匹配。例如,一個包本身可能包含來自多個第三方來源的程式碼,並可能需要為每一個包含一個許可證。)
以下示例展示了一個組織良好的許可證檔案:
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>
釋出你的包
#實現包後,你可以將其釋出到 pub.dev,以便其他開發者可以輕鬆使用它。
在釋出之前,請務必檢查 pubspec.yaml、README.md 和 CHANGELOG.md 檔案,確保其內容完整且正確。此外,為了提高包的質量和可用性(並使其更有可能獲得 Flutter Favorites 的狀態),請考慮包含以下內容:
- 多樣的程式碼使用示例
- 截圖、動圖或影片
- 指向相應程式碼倉庫的連結
接下來,以 dry-run(試執行)模式執行釋出命令,檢視一切是否透過分析:
flutter pub publish --dry-run
下一步是釋出到 pub.dev,但請確保你已準備好,因為釋出是永久性的。
flutter pub publish
有關釋出的更多詳細資訊,請參閱 dart.dev 上的 釋出文件。
處理包依賴關係
#如果你正在開發一個依賴於另一個包暴露的 Dart API 的 hello 包,則需要將該包新增到你的 pubspec.yaml 檔案的 dependencies 部分。以下程式碼使 url_launcher 外掛的 Dart API 可用於 hello:
dependencies:
url_launcher: ^6.3.2
現在,你可以在 hello 的 Dart 程式碼中 import 'package:url_launcher/url_launcher.dart' 並使用 launch(someUrl)。
這與你在 Flutter 應用或任何其他 Dart 專案中引入包的方式沒有區別。
但如果 hello 恰好是一個外掛包,且其平臺特定程式碼需要訪問 url_launcher 暴露的特定平臺 API,你還需要向特定平臺的構建檔案新增適當的依賴項宣告,如下所示。
Android
#以下示例在 hello/android/build.gradle 中為 url_launcher 設定了依賴項:
android {
// lines skipped
dependencies {
compileOnly rootProject.findProject(":url_launcher")
}
}
現在,你可以在 hello/android/src 的原始碼中 import io.flutter.plugins.urllauncher.UrlLauncherPlugin 並訪問 UrlLauncherPlugin 類。
有關 build.gradle 檔案的更多資訊,請參閱關於構建指令碼的 Gradle 文件。
iOS
#以下示例在 hello/ios/hello.podspec 中為 url_launcher 設定了依賴項:
Pod::Spec.new do |s|
# lines skipped
s.dependency 'url_launcher'
現在,你可以在 hello/ios/Classes 的原始碼中 #import "UrlLauncherPlugin.h" 並訪問 UrlLauncherPlugin 類。
有關 .podspec 檔案的更多詳細資訊,請參閱 CocoaPods 文件。
Web
#所有 Web 依賴項都像任何其他 Dart 包一樣由 pubspec.yaml 檔案處理。