前言:批改挪动端在此次重构的时候,技术选型上咱们团队抉择了 Flutter 来进行本次挪动端的重构,因为应用 Flutter 能够在 UI 的开发效率上充沛节俭人效,能够把更多的工夫放在其余方面的钻研上。然而在理论开发中,有局部的性能 Flutter 是不反对的,还须要 native 端来进行反对,而如何使 native 端反对的性能能够不便的、高效的服务于咱们本人的同时又能够对外提供便当,在其余我的项目或者是其余团队在须要应用同样性能的时候能够不须要反复的造轮子,如 Java 的 jar 包,Android 的 aar 包,Web 的 npm 包, iOS 的 pod 包等,而在 Flutter 中,Flutter 也是反对应用由其余开发者奉献给 Flutter 和 Dart 生态系统的共享软件包,使咱们能够疾速构建应用程序,而无需从头开始开发所有应用程序,这就是咱们明天要介绍的 Package。
所以针对 package 的理解上就不能仅仅止步于会应用的档次,更须要理解如何开发一个属于本人的 package 以及如何将本人的 package 胜利公布到 pub 仓库或者是公有仓库供别人应用。
01 package 介绍
什么是 Package
应用 Package 能够创立能轻松共享的模块化代码,而一个最小的 Package 包含:
一个 pubspec.yaml 文件:申明了 package 的名称、版本、作者等的元数据文件。
一个 lib 文件夹:包含包中公开的 (public) 代码,起码应有一个 <package-name>.dart 文件。
Package 类型:
Flutter Package(dart 包):Flutter 纯 Dart 插件工程,仅蕴含 Dart 层的实现,往往定义一些公共 Widget
Flutter Plugin(插件包):一种专用的 Dart 包,其中蕴含用 Dart 代码编写的 API,以及针对 Android(应用 Java 或 Kotlin)和针对 iOS(应用 OC 或 Swift)平台的特定实现
Plugin 其实就是一个非凡的 Package。Flutter Plugin 提供 Android 或者 iOS 的底层封装,在 Flutter 层提供组件性能,使 Flutter 能够较不便的调取 Native 的模块。很多平台相关性或者对于 Flutter 实现起来比较复杂的局部,都能够封装成 Plugin。Flutter 与 native 之间的通信原理此篇文章咱们不深刻探讨,通信原理能够参考下图:
02 package 开发
咱们理解到了 Package 是什么之后,那如何开发咱们本人的 package 包呢?
创立一个包或者是插件个别有两种形式:
- 可视化形式
- 命令行形式
可视化形式 - 关上 Android Studio -> 抉择 Create New Flutter Project;
- 如果想要创立插件包 则抉择 Flutter Plugin;
- 如果想要创立 Dart 包 则抉择 Flutter Package;
- 依据须要批改相干内容,而后点击 Next;
- 依据须要批改 package name 以及抉择 package 开发中须要的语言(抉择 pulgin 包才会有此步骤)
- 创立胜利
命令行形式 - 创立 Dart 包
flutter create –template=package dartPackageNam - 创立 plugin 包
flutter create –org com.example –template=plugin –platforms=android,ios -a kotlin -i swift pluginPackageName
参数:
–org: 指定您的组织,应用反向域名表示法
–template: 指定是纯 Dart 包还是 Plugin 包
–platforms: 代表指定插件反对的平台 可用的平台有:android、ios、web、linux、macos 和 windows
-a 指定 Android 平台所应用的语言 java、kotlin
-i 指定 iOS 平台所反对的语言 objc、swift
Package 包创立胜利之后,查看工程下的文件:
纯 Dart 包 蕴含的文件:
- LICENSE 文件 # 许可证文件。
- test/flutter_package_first_test.dart 文件 ## Package 的 单元测试 文件。
- .gitignore 文件 ## 通知 git 零碎应该暗藏哪些文件或文件夹的一个暗藏文件。
- pubspec.yaml 文件 ## pub 工具须要应用的,蕴含 package 依赖的 yaml 格局的文件。
- README.md 文件 ## 起步文档,用于形容 package。
- lib/flutter_package_first.dart 文件 ## package 的 Dart 实现代码
- CHANGELOG.md 文件 ## 用于记录 package 的版本变更
Plugin 包 蕴含的文件: - lib/flutter_plugin.dart 文件 ## Dart 插件 API 实现。
- android/src/main/java/com/example/flutter_plugin/FlutterPlugin 文件 ## Android 平台原生插件 API 实现(应用 Kotlin 编程语言)。
- ios/Classes/FlutterPlugin.m 文件 ## iOS 平台原生插件 API 实现(应用 Objective-C 编程语言)。
- example/ 文件 ## 一个依赖于该插件并阐明了如何应用它的 Flutter 利用。
如果要编辑 iOS 目录下相干文件或者是 Android 目录下的相干文件 须要去特定的编辑器中关上各端的文件进行编辑 - iOS 端:
-
Android 端:
03 package 公布
咱们曾经理解了 package 包是什么,以及如何制作不同的 package 包,那如何公布 Package 包呢?(团体 pub 仓库公布文档)
package 公布地位能够抉择:- pub.dev
- 公有 pub 仓库(团体 pub 仓库)
- git 仓库
在公布 package 之前,要先查看这几个文件:pubspec.yaml、README.md、CHANGELOG.md 确保这几个文件残缺。
- pubspec.yaml 配置文件的配置:
- name: xxxx ## pub 库名称
- version: 0.0.1 ## 以后插件版本 确保每次公布与之前的版本不统一
- description: xxxxxxxxx ## pub 库简介
- homepage:https://github.com/xxxx ## pub 库 git 地址
- publish_to:http://pub.100tal.com/ ## 公有 pub 库上传地址 如果不是公有 pub 仓库 不必配置
- author:xxx<xxx@100tal.com> ## pub 库作者
- 检测配置文件:
flutter packages pub publish –dry-run -
公布
flutter packages pub publish04 package 应用
package 包公布胜利之后,咱们该如何在我的项目中应用呢?
首先是在 pubSpec.yaml 中增加依赖 - 依赖 pub.dev 仓库的 package 包
#实例 1 在该我的项目中,此插件指定版本为 1.4.0
flutter_plugin: ^1.4.0
#实例 2 在该我的项目中,此插件最低版本为 1.2.3
flutter_plugin: “>=1.2.3”
#实例 3 在该我的项目中,此插件最低反对 2.0.0 版本,但不反对 3.0.0 以上版本
flutter_plugin: “>=2.0.0 <3.0.0”
#实例 4 在该我的项目中,此插件最高反对到 1.2.3 以下版本
flutter_plugin: “<1.2.3” -
依赖 git 仓库的 package 包
-
flutter_plugin:
- git: url: https://github.com/xxxxxx/xxx… #git 仓库地址
- path: xxxxx #如果我的项目不是在 git 地址的根目录 则须要指定 path
- ref:‘1.0.0′ #指定的版本 对应 git 仓库中的 tag 标签 也能够指定分支 ref: some-branch
-
-
依赖公有 pub 仓库的 package 包
xes_recorder:hosted: name: xes_recorder url: http://pub.100tal.com version: 0.0.1
-
依赖本地 package
flutter_pub:path: ../ #能够是相对路径 也能够是绝对路径
05 公布过程中可能会遇到的问题记录
1)author 在最新版本进行‘flutter packages pub publish –dry-run’检测的时候 会报正告 须要移除掉能力检测通过。
2)执行发布命令的时候 会遇到须要登录以下地址去受权的状况 须要登录 google 账号 请应用 chrome 关上去验证。 - 验证通过 - 开始上传 - 上传胜利去 pub.dev 或者本人的公有 pub 仓库 查看是否公布胜利。
- 验证胜利 - 开始上传 - 如果超时未胜利则须要绕过 google 受权从新上传。
3)跳过 google 验证办法; - 下载 pub 我的项目[下载地址:https://github.com/ameryzhu/pub]
- 应用 Android Studio 关上下载的我的项目 并在 Terminal 程序执行:
pub get;
dart–snapshot=mypub.dart.snapshot bin/pu b.dart #执行完这个命令会在 pub 我的项目根目录下生成一个 mypub.dart.snapshot 文件;
4)把这个文件放到 ${flutterSDK Path}/bin/cache /dart-sdk/bin/snapshots/ 目录下;
5)而后用编辑器关上 ${flutterSDKPath}/bin/cache /da rt-sdk/bin/pub 文件;
6)把文件倒数第三行的:pub.dart.snapshot 替换为 mypub.dart.snapshot;
7)保留 - 退出
8)从新执行发布命令
如果执行了上述办法,在我的项目中执行 pub get 的时候会有版本抵触的谬误,须要将上述办法批改的 pub 文件中的 mypub.dart.snapshot 复原改为 pub.dart.snaps hot。
4 月 23 日世界读书日,微信公众号免费送书啦~
扫码关注「好将来技术」微信公众号回复「送书」即可参加本次流动
专属宠粉福利,还在等什么快来关注吧