跳到主內容

開發包與外掛

如何為 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 檔案中。

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:

yaml
flutter:
  plugin:
    platforms:
      android:
        package: com.example.hello
        pluginClass: HelloPlugin
      ios:
        pluginClass: HelloPlugin

當為更多平臺新增外掛實現時,應相應地更新 platforms 對映。例如,這是 hello 外掛在更新以新增對 macOS 和 Web 支援後的 pubspec 檔案中的對映:

yaml
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: 對映:

yaml
flutter:
  plugin:
    implements: hello
    platforms:
      windows:
        pluginClass: HelloPlugin

背書的實現

#

面向應用的包可以透過新增對平臺包的依賴,並將其作為 platforms: 對映中的 default_package 來背書該平臺包。如果上面的 hello 外掛背書了 hello_windows,它看起來會像這樣:

yaml
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 使用同一個資料夾。

yaml
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 目錄存放所有程式碼和資源。啟用此選項時,你需要將任何現有檔案從 iosmacos 移動到共享目錄。你還需要更新 podspec 檔案,以設定兩個平臺的依賴項和部署目標,例如:

ruby
  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= 選項後跟逗號分隔的列表,以指定外掛支援的平臺。可用平臺包括:androidiosweblinuxmacoswindows。如果不指定任何平臺,則生成的專案不支援任何平臺。

使用 --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

然後執行以下步驟:

  1. 啟動 Android Studio。
  2. Welcome to Android Studio 對話方塊中選擇 Open an existing Android Studio Project,或者從選單中選擇 File > Open,然後選擇 hello/example/android/build.gradlehello/example/android/build.gradle.kts 檔案。
  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 執行示例應用。

第二步 (c):新增 iOS 平臺程式碼 (.swift/.h+.m)

#

建議使用 Xcode 編輯 iOS 程式碼。

在 Xcode 中編輯 iOS 平臺程式碼之前,請確保程式碼至少已構建過一次(也就是說,從你的 IDE/編輯器執行示例應用,或者在終端中執行 cd hello/example; flutter build ios --no-codesign --config-only)。

然後執行以下步驟:

  1. 啟動 Xcode。
  2. 選擇 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 將依賴項新增到你的外掛中:

  1. 在外掛的 ios/my_plugin_namemacos/my_plugin_name 目錄中建立一個 Package.swift 檔案。
  2. Package.swift 描述檔案的 dependencies 陣列中宣告你的原生依賴項:
Package.swift
swift
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 依賴項:

ruby
s.dependency 'HelloPod', '0.0.1'

對於私有 pod,請參考 Private CocoaPods 以確保倉庫訪問許可權。

ruby
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 檔案末尾:

ruby
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)。

然後執行以下步驟:

  1. 啟動 Visual Studio Code。
  2. 開啟 hello/example/linux/ 目錄。
  3. 在詢問 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)。

然後執行以下步驟:

  1. 啟動 Xcode。
  2. 選擇 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)。

然後執行以下步驟:

  1. 啟動 Visual Studio。
  2. 選擇 Open a project or solution,並選擇 hello/example/build/windows/hello_example.sln 檔案。

外掛的 Windows 平臺程式碼位於 Solution Explorer 中的 hello_plugin/Source Fileshello_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 的實現:

yaml
flutter:
  plugin:
    implements: hello
    platforms:
      windows:
        dartPluginClass: HelloPluginWindows

在此版本中,你將沒有 C++ Windows 程式碼,而是將 hello 外掛的 Dart 平臺介面類子類化為 HelloPluginWindows 類,其中包含一個靜態的 registerWith() 方法。此方法在啟動期間呼叫,可用於註冊 Dart 實現。

dart
class HelloPluginWindows extends HelloPluginPlatform {
  /// Registers this class as the default instance of [HelloPluginPlatform].
  static void registerWith() {
    HelloPluginPlatform.instance = HelloPluginWindows();
  }

混合平臺實現

#

平臺實現也可以同時使用 Dart 和特定平臺的語言。例如,外掛可以為每個平臺使用不同的平臺通道,以便可以針對每個平臺進行自定義。

混合實現同時使用上述兩種註冊系統。這是上面修改後的 hello_windows 示例,用於混合實現:

yaml
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

新增文件

#

建議在所有包中新增以下文件:

  1. 一個介紹該包的 README.md 檔案
  2. 一個記錄每個版本更改的 CHANGELOG.md 檔案
  3. 一個LICENSE 檔案,包含包的許可條款
  4. 所有公共 API 的 API 文件(詳見下文)

API 文件

#

當你釋出包時,API 文件會自動生成併發布到 pub.dev/documentation。例如,請檢視 device_info_plus 的文件。

如果你希望在開發機器上本地生成 API 文件,請使用以下命令:

  1. 切換到你的包所在目錄

    cd ~/dev/mypackage
    
  2. 告訴文件工具 Flutter SDK 的位置(修改以下命令以反映其實際位置)

       export FLUTTER_ROOT=~/dev/flutter  # on macOS or Linux
    
       set FLUTTER_ROOT=~/dev/flutter     # on Windows
    
  3. 執行 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.yamlREADME.mdCHANGELOG.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

yaml
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 設定了依賴項:

groovy
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 設定了依賴項:

ruby
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 檔案處理。