软件包简介

#

软件包能够创建易于共享的模块化代码。一个最小的软件包包含以下内容:

pubspec.yaml
一个元数据文件,用于声明软件包名称、版本、作者等信息。
lib
lib 目录包含软件包中的公共代码,至少有一个 <package-name>.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 插件,第一部分

FFI 插件软件包

一种特殊的 Dart 软件包,包含用 Dart 代码编写的 API,并结合一个或多个使用 Dart FFI 的平台特定实现(AndroidiOSmacOS)。

开发 Dart 软件包

#

以下说明解释了如何编写 Flutter 软件包。

步骤 1: 创建软件包

#

要创建 starter Flutter 软件包,请在 flutter create 命令中使用 --template=package 标志:

flutter create --template=package hello

这会在 hello 文件夹中创建一个包含以下内容的软件包项目:

LICENSE
一个(大部分)为空的许可证文本文件。
test/hello_test.dart
软件包的单元测试
hello.iml
一个由 IntelliJ IDEs 使用的配置文件。
.gitignore
一个隐藏文件,用于告诉 Git 在项目中忽略哪些文件或文件夹。
.metadata
一个由 IDEs 使用的隐藏文件,用于跟踪 Flutter 项目的属性。
pubspec.yaml
一个包含元数据的 yaml 文件,用于指定软件包的依赖项。由 pub 工具使用。
README.md
一个入门 markdown 文件,简要描述软件包的用途。
lib/hello.dart
一个包含软件包 Dart 代码的 starter 应用。
.idea/modules.xml, .idea/workspace.xml
一个包含 IntelliJ IDEs 配置文件的隐藏文件夹。
CHANGELOG.md
一个(大部分)为空的 markdown 文件,用于跟踪软件包的版本更改。

步骤 2: 实现软件包

#

对于纯 Dart 软件包,只需在主 lib/<package name>.dart 文件中添加功能,或在 lib 目录中的多个文件中添加。

要测试软件包,请在 test 目录中添加单元测试

有关如何组织软件包内容的更多详细信息,请参阅 Dart 库软件包文档。

开发插件软件包

#

如果您想开发一个调用平台特定 API 的软件包,您需要开发一个插件软件包。

API 使用平台通道连接到平台特定的实现。

联邦插件

#

联邦插件是一种将对不同平台的支持拆分为单独软件包的方式。因此,一个联邦插件可以为 iOS 使用一个软件包,为 Android 使用另一个,为 Web 使用另一个,甚至为汽车(作为 IoT 设备的一个例子)使用另一个。除了其他好处,这种方法允许领域专家扩展现有插件以使其适用于他们最熟悉的平台。

联邦插件需要以下软件包:

面向应用的软件包
插件用户依赖此软件包来使用插件。此软件包指定了 Flutter 应用使用的 API。
平台软件包
一个或多个包含平台特定实现代码的软件包。面向应用的软件包会调用这些软件包——它们不会被包含在应用中,除非它们包含最终用户可访问的平台特定功能。
平台接口软件包
将面向应用的软件包与平台软件包连接起来的软件包。此软件包声明了一个接口,任何平台软件包都必须实现该接口才能支持面向应用的软件包。拥有一个定义此接口的单一软件包可确保所有平台软件包以统一的方式实现相同的功能。

认可的联邦插件

#

理想情况下,当向联邦插件添加平台实现时,您将与软件包作者协调以包含您的实现。通过这种方式,原始作者认可您的实现。

例如,假设您为(虚构的)foobar 插件编写了一个 foobar_windows 实现。在认可的插件中,原始 foobar 作者会将您的 Windows 实现作为依赖项添加到面向应用的软件包的 pubspec 中。然后,当开发人员在他们的 Flutter 应用中包含 foobar 插件时,Windows 实现以及其他认可的实现都会自动可用于该应用。

未认可的联邦插件

#

如果由于某种原因,您无法让原始插件作者添加您的实现,那么您的插件就未被认可。开发人员仍然可以使用您的实现,但必须手动将插件添加到应用的 pubspec.yaml 文件中:

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

这种方法也适用于覆盖 foobar 已经认可的插件实现。

有关联邦插件的更多信息、它们为何有用以及如何实现,请参阅 Harry Terkelsen 在 Medium 上发表的文章:如何编写 Flutter Web 插件,第二部分

指定插件支持的平台

#

插件可以通过在 pubspec.yaml 文件中的 platforms 映射中添加键来指定它们支持的平台。例如,以下 pubspec 文件显示了 hello 插件的 flutter: 映射,该插件仅支持 iOS 和 Android:

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

当为更多平台添加插件实现时,platforms 映射应相应更新。例如,这是 hello 插件的 pubspec 文件中,更新后添加了 macOS 和 Web 支持的映射:

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 实现

#

许多框架支持 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 和 macOS 不再分别使用 ios 目录和 macos 目录,而是都使用共享的 darwin 目录来存放所有代码和资源。启用此选项时,您需要将 iosmacos 中所有现有文件移动到共享目录。您还需要更新 podspec 文件,以设置这两个平台的依赖项和部署目标,例如:

ruby
  s.ios.dependency 'Flutter'
  s.osx.dependency 'FlutterMacOS'
  s.ios.deployment_target = '11.0'
  s.osx.deployment_target = '10.14'

步骤 1: 创建软件包

#

要创建插件软件包,请在 flutter create 命令中使用 --template=plugin 标志。

使用 --platforms= 选项,后跟逗号分隔的列表,以指定插件支持的平台。可用平台包括:androidiosweblinuxmacoswindows。如果未指定任何平台,则生成的项目不支持任何平台。

使用 --org 选项,以反向域名表示法指定您的组织。此值用于生成的插件代码中的各种软件包和捆绑标识符。

默认情况下,插件项目使用 Swift 编写 iOS 代码,使用 Kotlin 编写 Android 代码。如果您更喜欢 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 在 Kotlin 中的 Android 平台特定实现。
ios/Classes/HelloPlugin.m
插件 API 在 Objective-C 中的 iOS 平台特定实现。
example/
一个依赖于该插件并演示如何使用它的 Flutter 应用。

步骤 2: 实现软件包

#

由于插件软件包包含用多种编程语言为多个平台编写的代码,因此需要一些特定步骤来确保流畅的体验。

步骤 2a: 定义软件包 API (.dart)

#

插件软件包的 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对话框中选择打开现有 Android Studio 项目,或从菜单中选择文件 > 打开,然后选择 hello/example/android/build.gradle 文件。
  3. Gradle 同步对话框中,选择确定
  4. Android Gradle 插件更新对话框中,选择此项目不再提醒我

您的插件的 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. 选择文件 > 打开,然后选择 hello/example/ios/Runner.xcworkspace 文件。

您的插件的 iOS 平台代码位于项目导航器中的 Pods/Development Pods/hello/../../example/ios/.symlinks/plugins/hello/ios/Classes。(如果您使用 sharedDarwinSource,路径将以 hello/darwin/Classes 结尾。)

您可以点击运行 (▶) 按钮来运行示例应用。

添加 CocoaPod 依赖
#

使用以下说明添加版本为 0.0.1HelloPod

  1. ios/hello.podspec 的末尾指定依赖项:

    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
      }`
  1. 安装插件

    • 在项目的 pubspec.yaml 依赖项中添加插件。
    • 运行 flutter pub get
    • 在项目的 ios/ 目录中,运行 pod install

该 pod 应该出现在安装摘要中。

如果您的插件需要隐私清单,例如,如果它使用了任何必需理由 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. 在提示框中选择您想配置项目 "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. 选择文件 > 打开,然后选择 hello/example/macos/Runner.xcworkspace 文件。

您的插件的 macOS 平台代码位于项目导航器中的 Pods/Development Pods/hello/../../example/macos/Flutter/ephemeral/.symlinks/plugins/hello/macos/Classes。(如果您使用 sharedDarwinSource,路径将以 hello/darwin/Classes 结尾。)

您可以点击运行 (▶) 按钮来运行示例应用。

步骤 2f: 添加 Windows 平台代码 (.h+.cpp)

#

我们建议您使用 Visual Studio 编辑 Windows 代码。

在 Visual Studio 中编辑 Windows 平台代码之前,请首先确保代码至少已构建过一次(换句话说,从您的 IDE/编辑器运行示例应用程序,或在终端中执行 cd hello/example; flutter build windows)。

然后使用以下步骤:

  1. 启动 Visual Studio。
  2. 选择打开项目或解决方案,然后选择 hello/example/build/windows/hello_example.sln 文件。

您的插件的 Windows 平台代码位于解决方案资源管理器中的 hello_plugin/Source Fileshello_plugin/Header Files

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

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

#

最后,您需要将用 Dart 代码编写的 API 与平台特定的实现连接起来。这可以通过使用平台通道,或者通过平台接口软件包中定义的接口来完成。

在现有插件项目中添加平台支持

#

要向现有插件项目添加特定平台支持,请在项目目录中再次运行带 --template=plugin 标志的 flutter create 命令。例如,要在现有插件中添加 Web 支持,请运行:

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

如果此命令显示有关更新 pubspec.yaml 文件的消息,请按照提供的说明进行操作。

Dart 平台实现

#

在许多情况下,非 Web 平台实现仅使用平台特定的实现语言,如上所示。但是,平台实现也可以使用平台特定的 Dart。

仅限 Dart 的平台实现

#

在某些情况下,某些平台可以完全用 Dart 实现(例如,使用 FFI)。对于非 Web 平台的纯 Dart 平台实现,请将 pubspec.yaml 中的 pluginClass 替换为 dartPluginClass。下面是上面为纯 Dart 实现修改的 hello_windows 示例:

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

在此版本中,您将没有 C++ Windows 代码,而是用一个包含静态 registerWith() 方法的 HelloPluginWindows 类来继承 hello 插件的 Dart 平台接口类。此方法在启动期间调用,可用于注册 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 类将使用上面所示的 registerWith() 方法(用于纯 Dart 实现),而 C++ 的 HelloPlugin 类将与纯 C++ 实现中的相同。

测试您的插件

#

我们鼓励您使用自动化测试来测试您的插件,以确保在更改代码时功能不会退化。

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

开发 FFI 插件软件包

#

如果您想开发一个使用 Dart 的 FFI 调用原生 API 的软件包,您需要开发一个 FFI 插件软件包。

FFI 插件软件包和非 FFI 插件软件包都支持捆绑原生代码。然而,FFI 插件软件包不支持方法通道,但它们确实支持方法通道注册代码。要实现一个同时使用方法通道 FFI 的插件,请使用非 FFI 插件。每个平台都可以使用 FFI 或非 FFI 平台。

步骤 1: 创建软件包

#

要创建 starter FFI 插件软件包,请在 flutter create 命令中使用 --template=plugin_ffi 标志:

flutter create --template=plugin_ffi hello

这会在 hello 文件夹中创建一个包含以下特殊内容的 FFI 插件项目:

lib:定义插件 API 的 Dart 代码,并使用 dart:ffi 调用原生代码。

src:原生源代码,以及一个用于将源代码构建为动态库的 CMakeLists.txt 文件。

平台文件夹androidioswindows 等):用于构建原生代码库并将其与平台应用程序捆绑的构建文件。

步骤 2: 构建和捆绑原生代码

#

pubspec.yaml 按如下方式指定 FFI 插件:

yaml
  plugin:
    platforms:
      some_platform:
        ffiPlugin: true

此配置会调用各种目标平台的原生构建,并使用这些 FFI 插件在 Flutter 应用程序中捆绑二进制文件。

这可以与 dartPluginClass 结合使用,例如当 FFI 用于联邦插件中某个平台的实现时:

yaml
  plugin:
    implements: some_other_plugin
    platforms:
      some_platform:
        dartPluginClass: SomeClass
        ffiPlugin: true

一个插件可以同时拥有 FFI 和方法通道

yaml
  plugin:
    platforms:
      some_platform:
        pluginClass: SomeName
        ffiPlugin: true

FFI(和方法通道)插件调用的原生构建系统是:

  • 对于 Android:Gradle,它调用 Android NDK 进行原生构建。
    • 请参阅 android/build.gradle 中的文档。
  • 对于 iOS 和 macOS:Xcode,使用 CocoaPods。
    • 请参阅 ios/hello.podspec 中的文档。
    • 请参阅 macos/hello.podspec 中的文档。
  • 对于 Linux 和 Windows:CMake。
    • 请参阅 linux/CMakeLists.txt 中的文档。
    • 请参阅 windows/CMakeLists.txt 中的文档。

步骤 3: 绑定到原生代码

#

要使用原生代码,需要 Dart 中的绑定。

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

要重新生成绑定,请运行以下命令:

dart run ffigen --config ffigen.yaml

步骤 4: 调用原生代码

#

非常短时间运行的原生函数可以直接从任何 isolate 调用。例如,请参见 lib/hello.dart 中的 sum

长时间运行的函数应该在辅助 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 文档的提示,请参阅高效 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 精选状态),请考虑包含以下项目:

  • 多样化的代码使用示例
  • 截图、动图或视频
  • 相应代码仓库的链接

接下来,以 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.1

您现在可以在 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 依赖项都由 pubspec.yaml 文件处理,与任何其他 Dart 软件包一样。