跳转至正文

Flutter Package 的开发和提交

如何编写和提交你的 Package。

Package 介绍

#

通过使用 package(的模式)可以创建易于共享的模块化代码。一个最基本的 package 由以下内容构成:

pubspec.yaml 文件
用于定义 package 名称、版本号、作者等其他信息的元数据文件。

lib 目录
包含共享代码的 lib 目录,其中至少包含一个 <package-name>.dart 文件。

Package 类别

#

Package 包含以下几种类别:

纯 Dart 库 (Dart packages)
用 Dart 编写的传统 package,比如 path。其中一些可能包含 Flutter 的特定功能,因此依赖于 Flutter 框架,其使用范围仅限于 Flutter,比如 fluro

原生插件 (Plugin packages)
使用 Dart 编写的,按需使用 Java 或 Kotlin、Objective-C 或 Swift 分别在 Android 和/或 iOS 平台实现的 package。

插件 package 可以针对 Android(使用 Kotlin 或 Java)、 iOS(使用 Swift 或 Objective-C)、Web、macOS、Windows 或 Linux,又或者它们的各种组合方式,进行编写。

一个较为具体的实现例子是 url_launcher 插件 package。想了解如何使用 url_launcher package,以及它如何扩展 Web 的实现,请阅读 Medium 上由 Harry Terkelsen 撰写的文章 如何编写 Flutter Web 插件,第一部分

FFI package
一个专用的 Dart package,用于通过 dart:ffi 调用原生代码。这些 package 可在 Dart 独立环境中运行,无需系统特定的构建文件。他们通过 flutter create --template=package_ffi 命令创建(参考 创建一个 FFI package)。自 Flutter 3.38 以来,这是构建和打包原生代码的推荐方法。

开发纯 Dart 的 packages

#

下面会为你介绍如何写 Flutter package。

第一步:创建 package

#

想要创建初始的 Flutter package,请使用带有 --template=package 标志的 flutter create 命令:

flutter create --template=package hello

这将在 hello 目录下创建一个 package 项目,其中包含以下内容:

LICENSE 文件
大概率会是空的一个许可证文件。

test/hello_test.dart 文件
Package 的 单元测试 文件。

hello.iml 文件
由 IntelliJ 生成的配置文件。

.gitignore 文件
告诉 Git 系统应该隐藏哪些文件或文件夹的一个隐藏文件。

.metadata 文件
IDE 用来记录某个 Flutter 项目属性的的隐藏文件。

pubspec.yaml 文件
pub 工具需要使用的,包含 package 依赖的 yaml 格式的文件。

README.md 文件
起步文档,用于描述 package。

lib/hello.dart 文件
package 的 Dart 实现代码。

.idea/modules.xml.idea/workspace.xml 文件
IntelliJ 的各自配置文件(包含在 .idea 隐藏文件夹下)。

CHANGELOG.md 文件
又一个大概率为空的文档,用于记录 package 的版本变更。

第二步:实现 package

#

对于纯 Dart 库的 package,只要在 lib/<package name>.dart 文件中添加功能实现,或在 lib 目录中的多个文件中添加功能实现。

如果要对 package 进行测试,在 test 目录下添加 单元测试

关于如何组织 package 内容的更多详细信息,请参考 Dart library package 文档。

开发原生插件类型的 packages

#

如果想要开发一个调用特定平台 API 的 package,你需要开发一个原生插件 packgae。

它的 API 通过 平台通道 连接到平台特定的实现。

联合插件

#

联合插件 是一种将插件的 API 拆分为平台接口、该接口的独立平台实现以及使用运行平台注册实现的面向应用的接口的方式。

Package 分离的联合插件 是指平台接口、平台实现和面向应用的接口都分离到各自的 Dart package 中的联合插件。

因此,一个 package 分离的联合插件可以使用一个 package 用于 iOS,另一个用于 Android,再一个用于 web,甚至另一个用于汽车(作为物联网设备的示例)。除了其他好处之外,这种方法允许领域专家扩展现有插件,使其适用于他们最熟悉的平台。

插件插件需要以下内容:

面向应用的接口
插件用户在使用插件时与之交互的接口。此接口指定了 Flutter 应用使用的 API。在 package 分离的联合插件中,这是插件用户依赖的 package,用于使用该插件。

平台实现
一个或多个包含平台特定实现代码的实现。面向应用的接口会调用这些实现——它们不会在应用中直接使用,或者在 package 分离时直接依赖,除非它们包含最终用户可访问的平台特定功能。

平台接口
将面向应用的接口与平台实现连接起来的接口。它声明了一个接口,任何平台实现都必须实现该接口才能支持面向应用的接口。拥有一个单独的 package 来定义此接口可确保所有平台 package 以统一的方式实现相同的功能。

整合的联合插件

#

理想情况下,当你在向一个 package 分离模式的联合插件添加某个平台的实现时,你会与 package 的作者合作,将你的实现纳入 package。

假设你开发了 foobar_windows 插件,用于对应 foobar 插件的实现。在整合的联合插件里,foobar 的原作者会将你的 Windows 实现作为依赖添加在 pubspec 文件中,供面向应用的 package 调用。而后在开发者使用 foobar 插件时,Windows 及已包含的其他平台的实现就自动可用了。

未整合的联合插件

#

如果你因任何原因无法让原始插件作者添加你的实现,那么你的插件 受认可。开发者仍然可以使用你的实现,但必须手动将插件添加到应用的 pubspec.yaml 文件中:

yaml
dependencies:
  foobar: ^1.0.0
  foobar_windows: ^1.0.0 # Non-endorsed plugin implementation

如果你的实现出于某些原因无法被原作者整合,那么你的插件属于 未整合 的联合插件。开发者仍然可以使用你的实现,但是必须手动在 pubspec 文件里添加引用。意味着开发者需要同时引用 foobar foobar_windows 依赖,才能使用对应平台的完整功能。

有关联合插件的更多信息、它为什么非常强大,以及如何实现联合插件,你可以阅读 Harry Terkelsen 在 Medium 撰写的 如何撰写 Flutter Web 插件,第 2 部分

指定一个插件支持的平台

#

插件可以通过向 pubspec.yaml 中的 platforms map 添加 keys 来指定其支持的平台。例如,以下是 hello 插件的 flutter: map,它仅支持 Android 和 iOS:

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

当为更多平台添加插件实现时,应相应地更新 platforms map,例如这是支持 Android、iOS、macOS 和 web 的 hello 插件的 map:

yaml
flutter:
  plugin:
    platforms:
      android:
        package: com.example.hello
        pluginClass: HelloPlugin
      ios:
        pluginClass: HelloPlugin
      macos:
        pluginClass: HelloPlugin
      web:
        pluginClass: HelloPlugin
        fileName: hello_web.dart

联合平台 package

#

平台 package 有着同样的格式,但会包含 implements 入口,用于指明 package 实现的平台。例如,实现了 hello package 的 Windows 平台的 hello_windows 插件,会在 flutter: 映射下包含以下内容:

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

认可的实现

#

提供给 App 项目使用的 package 可以通过在 platform: 映射下声明 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

注意如上所示,面向 App 项目的 package 可能已经包含了某些平台的实现,同时也有认可的其他平台的实现。

共享 iOS 和 macOS 的实现

#

许多框架支持 iOS 和 macOS,其 API 完全相同或大部分相同,这使得可以用同一代码库来实现一些适用于 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'

第一步:创建 package

#

想要创建原生插件 package,请使用带有 --template=plugin 标志的 flutter create 命令。

你可以使用 --platforms= 命令行选项指定插件支持的平台,后面参数是用逗号分隔的列表。可用的平台有:androidiosweblinuxmacoswindows。如果没有指定平台,则生成的项目不支持任何平台。

使用 --org 选项,以反向域名表示法来指定你的组织。该值用于生成的 Android 及 iOS 代码。

默认情况下,插件项目中 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 文件
Android 平台原生插件 API 实现(使用 Kotlin 编程语言)。

ios/Classes/HelloPlugin.m 文件
iOS 平台原生插件 API 实现(使用 Objective-C 编程语言)。

example/ 文件
一个依赖于该插件并说明了如何使用它的 Flutter 应用。

第二步:实现 package

#

由于原生插件类型的 package 包含了使用多种编程语言编写的多个平台代码,因此需要一些特定步骤来保证体验的流畅性。

步骤 2a:定义 package API(.dart)

#

原生插件类型 package 的 API 在 Dart 代码中要首先定义好,使用你钟爱的 Flutter 编辑器,打开 hello 主目录,并找到 lib/hello.dart 文件。

步骤 2b:添加 Android 平台代码(.kt/.java)

#

我们建议你使用 Android Studio 来编辑 Android 代码。

在 Android Studio 中编辑 Android 平台的代码之前,请先确保代码至少已经构建过一次(换句话说,在 IDE 或编辑器中运行一次示例应用,或者在终端中执行指令:

cd hello/example; flutter build apk --config-only

接下来进行如下步骤:

  1. 启动 Android Studio;

  2. 在 Android Studio 的欢迎菜单 (Welcome to Android Studio) 对话框中选择打开现有的 Android Studio 项目 (Open an existing Android Studio Project),或在菜单中选择 File > Open,然后选择 hello/example/android/build.gradle 文件或者 hello/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 中点击运行 ▶ 按钮来运行示例程序。

步骤 2c:添加 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. 创建一个 Package.swift 文件,位于你插件的 ios/my_plugin_namemacos/my_plugin_name 目录中。

  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,请参阅 私有 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 文件。

如果你的插件需要隐私清单,例如,如果它使用了任何 required reason API,请更新 PrivacyInfo.xcprivacy 文件以描述你的插件的隐私影响,并将以下内容添加到你的 podspec 文件底部:

ruby
s.resource_bundles = {'your_plugin_privacy' => ['your_plugin/Sources/your_plugin/Resources/PrivacyInfo.xcprivacy']}

想要了解更多信息,请查看 Apple 开发者网站上的 隐私清单文件

步骤 2d:添加 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"? 的提示中选择 。这将启用 C++ 的自动补全。

你的插件的 Linux 平台代码位于 flutter/ephemeral/.plugin_symlinks/hello/linux/

你可以使用 flutter run 来运行示例应用。 注意: 在 Linux 上创建可运行的 Flutter 应用需要执行 flutter 工具中的步骤,所以即使你的编辑器提供了 CMake 集成,以那种方式构建和运行也不会正确工作。

步骤 2e:添加 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 结束。)

你可以点击运行 ▶ 按钮来运行示例程序。

步骤 2d:关联 API 和平台代码

#

我们建议你使用 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 平台代码位于解决方案资源管理器中的 hello_plugin/Source Fileshello_plugin/Header Files

你可以通过右键单击解决方案资源管理器中的 hello_example 并选择 Set as Startup Project,然后按下运行 (▶) 按钮来运行示例应用。 重要提示: 在更改插件代码后,你必须在再次运行之前选择 Build > Build Solution,否则将运行构建的插件的过时副本,而不是包含你的更改的最新版本。

步骤 2g:连接 API 和平台代码

#

最后,你需要将 Dart 编写的 API 代码与特定平台的实现相互关联。这是通过 平台通道 完成的。

为现有的插件项目加入平台的支持

#

要在现有的插件项目中添加对特定平台的支持,请在项目目录运行 flutter create 命令,并加入 --template=plugin。例如,要对现有的插件项目添加 Web 支持,请运行以下命令。

flutter create --template=plugin --platforms=web .

如果这个命令返回了一个关于需要更新 pubspec.yaml 文件的提醒,请按照提示的说明进行操作。

Dart 的平台实现

#

在很多场景中,非 web 平台的实现仅仅使用了上述的平台特定语言。然而,Dart 也是平台特定的语言之一。

纯 Dart 平台的实现

#

如先前描述,通常插件会使用第二种语言,实现对应平台的功能。然而,在某些场景下,部分平台可能会完全使用 Dart 进行实现(例如使用 FFI)。若需要仅 Dart 的平台实现,你可以将 pubspec.yaml 里的 pluginClass 替换为 dartPluginClass。下面是 hello_windows 示例替换为仅 Dart 实现的代码:

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

在这样的模式下,插件内不包含 Windows 的 C++ 代码,它将继承 hello 插件的 Dart 平台接口,使用包含静态 registerWith() 方法的 HelloPluginWindows 类进行实现。该方法会在启动时调用,用于注册 Dart 实现:

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

混合平台的实现

#

平台实现可能同时会使用 Dart 以及某个特定平台的语言。例如,plugin 可能会在不同平台使用不同的 platform channel,这样 channel 就可以根据不同平台进行定制。

就和之前说的那样,混合实现将会使用多种注册方式。这里有一个使用混合实现的 hello_windows 样例:

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

Dart 类 HelloPluginWindows 会使用 registerWith() 方法做纯 Dart 的实现, HelloPlugin 类则用来做纯 C++ 代码的实现。

测试你的插件

#

我们鼓励你通过自动化测试来测试你的插件,以确保你对代码进行更改时,功能不会退化。

要了解更多关于测试你的插件的信息,请查阅 测试插件。如果你正在为你的 Flutter 应用编写测试,并且插件导致崩溃,请查看 在插件测试中的 Flutter

开发 FFI package

#

如果你想开发一个通过 Dart 的 FFI 调用原生 API 的 package,你需要开发一个 FFI package。

第 1 步:创建 package

#

要创建初始的 FFI package,请在 flutter create 指令中使用 --template=package_ffi 标志:

flutter create --template=package_ffi hello

上面的指令执行完成后,会在 hello 文件夹中创建一个 FFI package 项目,主要结构说明如下:

lib:定义 package API 的 Dart 代码,使用 dart:ffi 调用本地原生代码。

src:本地原生源代码。

hook/build.dart:用于编译原生代码的 hook 脚本。

第 2 步:绑定本地原生代码

#

为了使用本地原生代码,需要在 Dart 中进行绑定。

为了避免手动编写这些内容,它们由 package:ffigen 从头文件 (src/hello.h) 生成。有关如何安装此 package 的信息,请参阅 ffigen 文档

运行以下指令重新生成绑定:

dart run tool/ffigen.dart

第 3 步:调用本地原生代码

#

运行时间很短的本地原生函数可以在任何 isolate 中直接调用。例如,请查看 lib/hello.dart 中的 sum

运行时间较长的本地原生函数应在 helper isolate 上调用,以避免在 Flutter 应用程序中掉帧。例如,请查看 lib/hello.dart 中的 sumAsync

添加文档

#

建议将下列文档添加到所有 package 中:

  1. README.md 文件用来对 package 进行介绍

  2. CHANGELOG.md 文件用来记录每个版本的更改

  3. LICENSE 文件用来阐述 package 的许可条款

  4. API 文档包含所有的公共 API(详情参见下文)

API 文档

#

当你提交一个 package 时,会自动生成 API 文档并将其提交到 pub.dev/documentation,示例请参见 device_info_plus 文档。

如果你希望在本地开发环境中生成 API 文档,可以使用以下命令:

  1. 将当前工作目录切换到 package 所在目录:

    cd ~/dev/mypackage
    
  2. 告知文档工具 Flutter SDK 所在位置(请自行更改以下指令,告知 Flutter SDK 所在的位置):

       export FLUTTER_ROOT=~/dev/flutter  # on macOS or Linux (适用于 macOS 或 Linux 操作系统)
    
       set FLUTTER_ROOT=~/dev/flutter     # on Windows (适用于 Windows 操作系统)
    
  3. 运行 `dart doc` 工具(已经包含到 Flutter SDK 了):
       $FLUTTER_ROOT/bin/cache/dart-sdk/bin/dart doc   # 适用于 macOS 或 Linux 操作系统
    
       %FLUTTER_ROOT%\bin\cache\dart-sdk\bin\dart doc  # 适用于 Windows 操作系统
    

关于如何编写 API 文档的建议,请参阅 高效 Dart 指南

将许可证添加到 LICENSE 文件中

#

每个 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>

提交 package

#

一旦完成了 package 的实现,你便可以将其提交到 pub.dev 上,以便其他开发者可以轻松地使用它。

发布你的 package 之前,确保检查了这几个文件:pubspec.yamlREADME.mdCHANGELOG.md,确保它们完整且正确,另外,为了提高 package 的可用性,可以考虑加入如下的内容:

  • 代码的示例用法

  • 屏幕截图,GIF 动画或者视频

  • 代码库的正确指向链接

接下来,运行 dry-run 命令以检验是否所有内容都通过了分析:

flutter pub publish --dry-run

最后一步是发布,请注意:发布是永久性 的,运行以下提交命令:

flutter pub publish

有关提交的详细信息,请查阅关于 Pub 站点的 提交文档

Package 依赖处理

#

如果你正在开发的 hello 依赖于另外一个 package 所公开的 Dart API,你需要将该 package 添加到文件 pubspec.yamldependencies 段中。以下代码使得插件 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 项目中引入 package 的方式没什么区别。

但碰巧 hello 是一个 原生插件 package,其特定的平台代码如果需要访问 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

#

与其他的 Dart package 一样,所有的 Web 依赖都由文件 pubspec.yaml 来处理。