开发Package和插件
Flutter Packages 的开发和提交
Packages & pluginschevron_right开发和提交
Package 介绍
通过使用 package(的模式)可以创建易于共享的模块化代码。一个最基本的 package 由以下内容构成:
pubspec.yaml 文件
用于定义 package 名称、版本号、作者等其他信息的元数据文件。
lib 目录
包含共享代码的 lib 目录,其中至少包含一个 <package-name>.dart 文件。
info提示
有关编写高效插件的注意事项列表,请参考 Medium 上的文章: Writing a good plugin。
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 插件
用 Dart 语言编写针对一个或多个特定平台的 API,使用 Dart FFI (Android、iOS、macOS)。
开发纯 Dart 的 packages
下面会为你介绍如何写 Flutter package。
第一步:创建 package
想要创建初始的 Flutter package,请使用带有 --template=package 标志的 flutter create 命令:
flutter create --template=package hello
content_copy
这将在 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 通过 平台通道 连接到平台特定的实现。
联合插件
Federated plugins (联合插件) 是一种将对不同平台的支持分为单独的软件包。所以,联合插件能够使用针对 iOS、Android、Web 甚至是针对汽车 (例如在 IoT 设备上)分别使用对应的 package。除了这些好处之外,它还能够让领域专家在他们最了解的平台上扩展现有平台插件。
联合插件需要以下 package:
面向应用的 package
该 package 是用户使用插件的的直接依赖。它指定了 Flutter 应用使用的 API。
平台 package
一个或多个包含特定平台代码的 package。面向应用的 package 会调用这些平台 package—— 除非它们带有一些终端用户需要的特殊平台功能,否则它们不会包含在应用中。
平台接口 package
将面向应用的 package 与平台 package 进行整合的 package。该 package 会声明平台 package 需要实现的接口,供面向应用的 package 使用。使用单一的平台接口 package 可以确保所有平台 package 都按照各自的方法实现了统一要求的功能。
整合的联合插件
理想情况下,当你在为一个联合插件添加某个平台的实现时,你会与 package 的作者合作,将你的实现纳入 package。
假设你开发了 foobar_windows 插件,用于对应 foobar 插件的实现。在整合的联合插件里,foobar 的原作者会将你的 Windows 实现作为依赖添加在 pubspec 文件中,供面向应用的 package 调用。而后在开发者使用 foobar 插件时,Windows 及已包含的其他平台的实现就自动可用了。
未整合的联合插件
如果你的实现出于某些原因无法被原作者整合,那么你的插件属于 未整合 的联合插件。开发者仍然可以使用你的实现,但是必须手动在 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
content_copy
当为更多平台添加插件实现时,应相应地更新 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
content_copy
联合平台 package
平台 package 有着同样的格式,但会包含 implements 入口,用于指明 package 实现的平台。例如,实现了 hello package 的 Windows 平台的 hello_windows 插件,会在 flutter: 映射下包含以下内容:
yaml
flutter:
  plugin:
    implements: hello
    platforms:
      windows:
        pluginClass: HelloPlugin
content_copy
认可的实现
提供给 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
content_copy
注意如上所示,面向 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"
content_copy
当 sharedDarwinSource 启用时, iOS 的 ios 目录和 macOS 的 macos 目录将被共享的 darwin 目录取代,此目录包含所有的代码和资源。启用此选项后,你需要将任何现有的 ios 和 macos 文件移动到共享目录。你还需要更新 podspec 文件,设置两个平台的依赖关系和部署目标,例如:
ruby
  s.ios.dependency 'Flutter'
  s.osx.dependency 'FlutterMacOS'
  s.ios.deployment_target = '11.0'
  s.osx.deployment_target = '10.14'
content_copy
第一步:创建 package
想要创建原生插件 package,请使用带有 --template=plugin 标志的 flutter create 命令。
你可以使用 --platforms= 命令行选项指定插件支持的平台,后面参数是用逗号分隔的列表。可用的平台有:android、ios、web、linux、macos 和 windows。如果没有指定平台,则生成的项目不支持任何平台。
使用 --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
content_copy
flutter create --org com.example --template=plugin --platforms=android,ios,linux,macos,windows -a java hello
content_copy
flutter create --org com.example --template=plugin --platforms=android,ios,linux,macos,windows -i objc hello
content_copy
flutter create --org com.example --template=plugin --platforms=android,ios,linux,macos,windows -i swift hello
content_copy
这将在 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)。
接下来进行如下步骤:
- 启动 Android Studio;
- 在 Android Studio 的欢迎菜单 (Welcome to Android Studio) 对话框中选择打开现有的 Android Studio 项目 (Open an existing Android Studio Project),或在菜单中选择 File > Open,然后选择 hello/example/android/build.gradle文件;
- 在Gradle Sync 对话框中,选择 OK;
- 在“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)。
接下来执行下面步骤:
- 启动 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 结束。)
你可以点击运行按钮 (▶) 来运行这个示例应用。
Add CocoaPod dependencies
warning请注意
Flutter is migrating to Swift Package Manager to manage iOS and macOS native dependencies. Flutter's support of Swift Package Manager is under development. The implementation might change in the future. Swift Package Manager support is only available on Flutter's main channel. Flutter continues to support CocoaPods.
Use the following instructions to add HelloPod with the version 0.0.1:
- 
Specify the dependency at the end of ios/hello.podspec:ruby s.dependency 'HelloPod', '0.0.1'content_copy For private pods, refer to Private CocoaPods to ensure repo access: 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 }`content_copy 
- 
Installing the plugin - Add the plugin in the project’s pubspec.yamldependencies.
- Run flutter pub get.
- In the project’s ios/directory, runpod install.
 
- Add the plugin in the project’s 
The pod should appear in the installation summary.
If your plugin requires a privacy manifest, for example, if it uses any required reason APIs, update the PrivacyInfo.xcprivacy file to describe your plugin's privacy impact, and add the following to the bottom of your podspec file:
ruby
s.resource_bundles = {'your_plugin_privacy' => ['your_plugin/Sources/your_plugin/Resources/PrivacyInfo.xcprivacy']}
content_copy
For more information, check out Privacy manifest files on the Apple developer site.
步骤 2d:添加 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"?的提示中选择 是。这将启用 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)。
然后按照以下步骤操作:
- 启动 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 结束。)
你可以点击运行 ▶ 按钮来运行示例程序。
步骤 2d:关联 API 和平台代码
We recommend you edit the Windows code using Visual Studio.
Before editing the Windows platform code in Visual Studio, first make sure that the code has been built at least once (in other words, run the example app from your IDE/editor, or in a terminal execute cd hello/example; flutter build windows).
Then use the following steps:
- Launch Visual Studio.
- Select Open a project or solution, and select the hello/example/build/windows/hello_example.slnfile.
The Windows platform code for your plugin is located in hello_plugin/Source Files and hello_plugin/Header Files in the Solution Explorer.
You can run the example app by right-clicking hello_example in the Solution Explorer and selecting Set as Startup Project, then pressing the run (▶) button. Important: After making changes to plugin code, you must select Build > Build Solution before running again, otherwise an outdated copy of the built plugin will be run instead of the latest version containing your changes.
Step 2g: Connect the API and the platform code
最后,你需要将 Dart 编写的 API 代码与特定平台的实现相互关联。这是通过 平台通道 完成的。
为现有的插件项目加入平台的支持
要在现有的插件项目中添加对特定平台的支持,请在项目目录运行 flutter create 命令,并加入 --template=plugin。例如,要对现有的插件项目添加 Web 支持,请运行以下命令。
flutter create --template=plugin --platforms=web .
content_copy
如果这个命令返回了一个关于需要更新 pubspec.yaml 文件的提醒,请按照提示的说明进行操作。
Dart 的平台实现
在很多场景中,非 web 平台的实现仅仅使用了上述的平台特定语言。然而,Dart 也是平台特定的语言之一。
info提示
下方的例子仅适用于非 web 平台。 Web 平台的插件是用 Dart 编写的,通过 pluginClass 和 fileName 来指定实现。
纯 Dart 平台的实现
如先前描述,通常插件会使用第二种语言,实现对应平台的功能。然而,在某些场景下,部分平台可能会完全使用 Dart 进行实现(例如使用 FFI)。若需要仅 Dart 的平台实现,你可以将 pubspec.yaml 里的 pluginClass 替换为 dartPluginClass。下面是 hello_windows 示例替换为仅 Dart 实现的代码:
yaml
flutter:
  plugin:
    implements: hello
    platforms:
      windows:
        dartPluginClass: HelloPluginWindows
content_copy
在这样的模式下,插件内不包含 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();
  }
content_copy
混合平台的实现
平台实现可能同时会使用 Dart 以及某个特定平台的语言。例如,plugin 可能会在不同平台使用不同的 platform channel,这样 channel 就可以根据不同平台进行定制。
就和之前说的那样,混合实现将会使用多种注册方式。这里有一个使用混合实现的 hello_windows 样例:
yaml
flutter:
  plugin:
    implements: hello
    platforms:
      windows:
        dartPluginClass: HelloPluginWindows
        pluginClass: HelloPlugin
content_copy
Dart 类 HelloPluginWindows 会使用 registerWith() 方法做纯 Dart 的实现, HelloPlugin 类则用来做纯 C++ 代码的实现。
测试你的插件
我们鼓励你通过自动化测试来测试你的插件,以确保你对代码进行更改时,功能不会退化。
要了解更多关于测试你的插件的信息,请查阅 测试插件。如果你正在为你的 Flutter 应用编写测试,并且插件导致崩溃,请查看 在插件测试中的 Flutter。
开发 FFI 插件
如果你想开发一个通过 Dart 的 FFI 调用原生 API 的 package,你需要开发一个 FFI 插件。
FFI 插件和非 FFI 插件都支持捆绑原生代码,需要注意的是,FFI 插件不支持方法通道 (method channel),但支持方法通道注册码 (method channel registration code)。如果你想实现同时使用方法通道和 FFI 的插件,请使用非 FFI 插件。每个平台都可以使用 FFI 或非 FFI 平台。
第 1 步:创建 package
要创建 FFI 插件,请在 flutter create 指令中使用 --template=plugin_ffi 标志:
flutter create --template=plugin_ffi hello
content_copy
上面的指令执行完成后,会在 hello 文件夹中创建一个 FFI 插件项目,主要结构说明如下:
lib:定义插件 API 的 Dart 代码,使用 dart:ffi 调用本地原生代码。
src:本地原生源代码,以及一个用于将源代码构建为动态库的 CMakeLists.txt 文件。
平台文件夹(android、ios、windows 等等):用于构建本地原生代码库并与不同平台应用程序绑定。
第 2 步:构建和绑定本地原生代码
pubspec.yaml 中指定 FFI 插件的平台如下:
yaml
  plugin:
    platforms:
      some_platform:
        ffiPlugin: true
content_copy
上面这种配置调用了各个目标平台的本地原生构建,并使 FFI 插件将二进制文件绑定在 Flutter 应用程序中。
这可以与 dartPluginClass 结合使用,例如实现 FFI 被用于联合插件中的一个平台:
yaml
  plugin:
    implements: some_other_plugin
    platforms:
      some_platform:
        dartPluginClass: SomeClass
        ffiPlugin: true
content_copy
一个插件可以同时实现 FFI 和方法通道 (method channel):
yaml
  plugin:
    platforms:
      some_platform:
        pluginClass: SomeName
        ffiPlugin: true
content_copy
被 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 中进行绑定。
To avoid writing these by hand, they are generated from the header file (src/hello.h) by package:ffigen. Reference the ffigen docs for information on how to install this package.
为了避免手工编写,它们由头文件 (src/hello.h) 中的 package:ffigen 生成。运行以下指令重新生成绑定:
 dart run ffigen --config ffigen.yaml
content_copy
第 4 步:调用本地原生代码
运行时间很短的本地原生函数可以在任何 isolate 中直接调用。例如,请查看 lib/hello.dart 中的 sum。
运行时间较长的本地原生函数应在 helper isolate 上调用,以避免在 Flutter 应用程序中掉帧。例如,请查看 lib/hello.dart 中的 sumAsync。
添加文档
建议将下列文档添加到所有 package 中:
- README.md文件用来对 package 进行介绍
- CHANGELOG.md文件用来记录每个版本的更改
- LICENSE文件用来阐述 package 的许可条款
- API 文档包含所有的公共 API(详情参见下文)
API 文档
当你提交一个 package 时,会自动生成 API 文档并将其提交到 pub.dev/documentation,示例请参见 device_info_plus 文档。
如果你希望在本地开发环境中生成 API 文档,可以使用以下命令:
- 
将当前工作目录切换到 package 所在目录: cd ~/dev/mypackagecontent_copy 
- 
告知文档工具 Flutter SDK 所在位置(请自行更改以下指令,告知 Flutter SDK 所在的位置): export FLUTTER_ROOT=~/dev/flutter # on macOS or Linux (适用于 macOS 或 Linux 操作系统) set FLUTTER_ROOT=~/dev/flutter # on Windows (适用于 Windows 操作系统)content_copy 
- 
运行 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 操作系统content_copy 
关于如何编写 API 文档的建议,请参阅 高效 Dart 指南。
将许可证添加到 LICENSE 文件中
每个 LICENSE 文件中的各个许可证应由 80 个短线字符组成的线段进行分割。
如果 LICENSE 文件中包含多个组件许可证,那么每个组件许可证必须以其所在 package 的名称开始,每个 package 名称单独一行显示,并且 package 名称列表与实际许可证内容由空行隔开。(package 名称则需与 pub package 相匹配。比如,一个 package 可能包含多个第三方代码,并且可能需要为每个 package 添加许可证。)
如下是一些优秀的许可证文件:
package_1
<some license text>
--------------------------------------------------------------------------------
package_2
<some license text>
content_copy
这些也是可以的:
package_1
<some license text>
--------------------------------------------------------------------------------
package_1
package_2
<some license text>
content_copy
这些是一些不太好的示例:
<some license text>
--------------------------------------------------------------------------------
<some license text>
content_copy
这也是一些不太好的示例:
package_1
<some license text>
--------------------------------------------------------------------------------
<some license text>
content_copy
提交 package
lightbulb小提示
你是否注意到一些 package 和插件旁边的 Flutter Favorites 标识?这是官方挑选出的、由认证的开发者发布的 packages,并建议 Flutter 开发者们需要使用时首要考虑的 package。了解更多 Flutter Favorites 项目。
一旦完成了 package 的实现,你便可以将其提交到 pub.dev 上,以便其他开发者可以轻松地使用它。
发布你的 package 之前,确保检查了这几个文件:pubspec.yaml、README.md 和 CHANGELOG.md,确保它们完整且正确,另外,为了提高 package 的可用性,可以考虑加入如下的内容:
- 代码的示例用法
- 屏幕截图,GIF 动画或者视频
- 代码库的正确指向链接
接下来,运行 dry-run 命令以检验是否所有内容都通过了分析:
flutter pub publish --dry-run
content_copy
最后一步是发布,请注意:发布是永久性 的,运行以下提交命令:
flutter pub publish
content_copy
info提示
设置了中国镜像的开发者们请注意:目前所存在的镜像都不能(也不应该)进行 package 的上传。如果你设置了镜像,执行上述发布代码可能会造成发布失败。网络设定好后,无需取消中文镜像,执行下述代码可直接上传:
flutter pub publish --server=https://pub.dartlang.org
content_copy
有关提交的详细信息,请查阅关于 Pub 站点的 提交文档。
Package 依赖处理
如果你正在开发的 hello 依赖于另外一个 package 所公开的 Dart API,你需要将该 package 添加到文件 pubspec.yaml 的 dependencies 段中。以下代码使得插件 url_launcher 的 Dart API 在 hello 中可用:
yaml
dependencies:
  url_launcher: ^5.0.0
content_copy
现在你可以在 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")
    }
}
content_copy
现在你可以在 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'
content_copy
现在你可以在 hello/ios/Classes 目录下的源代码文件中使用 #import "UrlLauncherPlugin.h" 并访问 UrlLauncherPlugin 这个类了。
如果希望了解更多有关 .podspec 文件更多的信息,请参阅 CocoaPods 文档 了解。
 
                    
                     
                    
                 
                    
                 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号