Flutter Package 开发、发布、使用三部曲
前言: 批改移动端在此次重构的时候,技术选型上我们团队选择了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:xxxxxx@100tal.com ## pub库作者
- 检测配置文件: flutter packages pub publish --dry-run
- 发布 flutter packages pub publish
04 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/xxxxxx.git #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日世界读书日,微信公众号免费送书啦~
扫码关注「好未来技术」微信公众号回复「送书」即可参与本次活动
专属宠粉福利,还在等什么快来关注吧

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
技术干货 | 源码解析 Github 上 14.1k Star 的 RocketMQ
前言 Apache RocketMQ 作为广为人知的开源消息中间件,诞生于阿里巴巴,于 2016 年捐赠给了 Apache。从 RocketMQ 4.0 到如今最新的 v4.7.1,不论是在阿里巴巴内部还是外部社区,都赢得了广泛的关注和好评。 本文将站在发送方视角,通过阅读 RocketMQ Producer 源码,来分析在事务消息发送中 RocketMQ 是如何工作的。 需要说明的是,本文所贴代码,均来自 4.7.1 版本的 RocketMQ 源码。本文中所讨论的发送,仅指从 Producer 发送到 Broker 的过程,并不包含 Broker 将消息投递到 Consumer 的过程。 宏观概览 RocketMQ 事务消息发送流程: 结合源码来看,RocketMQ 的事务消息 TransactionMQProducer 的 sendMessageInTransaction 方法,实际调用了 DefaultMQProducerImpl 的 sendMessageInTransaction 方法。我们进入 sendMessageInTransaction 方法,整个事务消息的发送流程清...
- 下一篇
40个问题让你快速掌握Java多线程的精髓
摘要:多线程可以理解为在同一个程序中能够同时运行多个不同的线程来执行不同的任务,这些线程可以同时利用CPU的多个核心运行。 本文分享自华为云社区《对Java多线程的用法感到一头乱麻?40个问题让你快速掌握多线程的精髓》,原文作者:breakDraw 。 多线程可以理解为在同一个程序中能够同时运行多个不同的线程来执行不同的任务,这些线程可以同时利用CPU的多个核心运行。多线程编程能够最大限度的利用CPU的资源。本文将通过以下几个方向为大家讲解多线程的用法。 1.Thread类基础 2.synchronized关键字 3.其他的同步工具 CountDownLatch FutureTask Semaphore CyclicBarrier Exchanger 原子类AtomicXXX 4.线程池 5.Thread状态转换 6.Volatile 7.线程群组 一、Thread类基础 Q: Thread的deprecated过期方法是哪3个?作用是啥 A: stop(), 终止线程的执行。 suspend(), 暂停线程执行。 resume(), 恢复线程执行。 Q: 废弃stop的原因是啥? A...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS8编译安装MySQL8.0.19
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2整合Thymeleaf,官方推荐html解决方案