Flutter私有库开发总结

550 阅读7分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

前言

iOS有Pod库,前端有npm库,同样Flutter也有自己的库依赖,通过依赖库,我们可以把代码以组建的形式引入我们的工程

为什么要使用库

使用库可以更好的复用代码,单测代码,可以清晰的划分项目结构,便于项目管理,保持项目活力

如何使用库

Dart工程依赖的四种方式:

1.官网依赖

dependencies:
  http_parser: ^3.0.0

2. 自定义服务器

dependencies:  
  mypackage:    
    hosted:      
      name: mypackage      
      url: http://my-package-server.com    
      version: ^1.0.0

3.git仓库依赖

//通过Tag

dependencies:  
  mypackage:    
    git:      
      url: ssh://git@git.bg.baidu.cn:10022/mypackage.git
      tag: 1.0.0


//通过Commit
dependencies:  
  mypackage:    
    git:      
      url: ssh://git@git.bg.baidu.cn:10022/mypackage.git
      ref: *************************(Commit号码)

4.本地依赖

dependencies:  
  mypackage:    
    path: ../../mypackage

不同的依赖方式由库的发布位置、使用方式有关。

Flutter库的种类

Flutter中的package就是Flutter库,可以分为

  • 纯 Dart 库:用 Dart 编写的传统 package,比如 path。其中一些可能包含 Flutter 的特定功能,因此依赖于 Flutter 框架,其使用范围仅限于 Flutter,比如 fluro。
  • 原生插件:使用 Dart 编写的,按需使用 Java 或 Kotlin、ObjC 或 Swift 分别在 Android 和/或 iOS 平台实现的 package。一个具体的例子是 battery。

如何构建一个自己的库

Flutter官网介绍很清晰:flutter.cn/docs/develo…

这里引用基础创建流程

Flutter为我们提供了很方便的脚手架工具来创建一个库,Android Studio同时提供了可视化界面创建,这里就不过多介绍,下面我们主要讲解用命令行创建一个库;

创建

纯Dart插件

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 的版本变更。

原生插件

如果想要开发一个调用特定平台 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:

flutter:
  plugin:
    platforms:
      android:
        package: com.example.hello
        pluginClass: HelloPlugin
      ios:
        pluginClass: HelloPlugin
        
environment:
  sdk: ">=2.1.0 <3.0.0"
  # Flutter versions prior to 1.12 did not support the
  # flutter.plugin.platforms map.
  flutter: ">=1.12.0"

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

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

  sdk: ">=2.1.0 <3.0.0"
  # Flutter versions prior to 1.12 did not support the
  # flutter.plugin.platforms map.
  flutter: ">=1.12.0"
联合平台 package

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

flutter:
  plugin:
    implements: hello
    platforms:
      windows:
        pluginClass: HelloPlugin
认可的实现

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

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

创建 package

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

从 Flutter 1.20.0 版本,我们开始使用 --platforms= 这个选项,后面参数是用逗号分隔的列表,这个参数代表指定插件支持的平台。可用的平台有:android、ios、web、linux、macos 和 windows。如果没有指定平台,则生成的项目不支持任何平台。

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

使用 -a 选项指定 Android 的语言,或使用 -i 选项指定 iOS 的语言。请选择以下 任一项

flutter create --org com.example --template=plugin --platforms=android,ios -a kotlin hello

lutter create --org com.example --template=plugin --platforms=android,ios -a java hello

flutter create --org com.example --template=plugin --platforms=android,ios -i objc hello

flutter create --org com.example --template=plugin --platforms=android,ios -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 应用。

默认情况下,插件项目中 iOS 代码使用 Swift 编写, Android 代码使用 Kotlin 编写。如果你更喜欢 Objective-C 或 Java,你可以通过 -i 指定 iOS 所使用的语言和/或使用-a 指定 Android 所使用的语言。比如:

flutter create --template=plugin --platforms=android,ios -i objc hello
flutter create --template=plugin --platforms=android,ios -a java hello

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

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

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