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业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
十张图讲清楚DDD建模六个问题与六个步骤
欢迎大家关注公众号「JAVA前线」查看更多精彩分享文章,主要包括源码分析、实际应用、架构思维、职场分享、产品思考等等,欢迎大家加我微信「java_front」一起交流学习 0 文章概述 领域驱动设计DDD是一段时间以来比较流行的概念,刚开始接触时觉得概念很多,比较难以落地。本文就来分析探讨DDD落地时需要关注的六个问题,并通过一个足球运动员信息管理系统案例分析落地的六个步骤。 1 六个问题 1.1 为什么使用 DDD方法论的核心是将问题不断分解,把大问题分解为小问题,大业务分解小领域,简而言之就是分而治之,各个击破。 分而治之是指直接面对大业务我们无从下手,需要按照一定方法进行分解,分解为高内聚的小领域,使得业务有边界清晰,而这些小领域是我们有能力处理的,这就是领域驱动设计的核心。 各个击破是指当问题被拆分为小领域后,因为小领域业务内聚,其子领域高度相关,我们在技术维度可以对其进行详细设计,在管理维度可以按照领域对项目进行分工。需要指出DDD不能替代详细设计,DDD是为了更清晰地详细设计。 在微服务流行的互联网行业,当业务逐渐复杂时,技术人员需要解决如何划分微服务边界的问题,DDD这...
-
下一篇
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条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS6,CentOS7官方镜像安装Oracle11G
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS关闭SELinux安全模块