Flutter 核心技术与实战
陈航
前美团点评高级技术专家
42432 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 48 讲
Flutter 核心技术与实战
15
15
1.0x
00:00/00:00
登录|注册

18 | 依赖管理(二):第三方组件库在Flutter中要如何管理?

记录安装的包的具体来源和版本号
映射包名与包文件路径
下载包
找出满足版本约束的包版本
Git地址
本地路径
区间方式
内部配置
外部依赖
运行环境
元数据
复用他人成果
找到好用的库
运行环境
版本
包名称
图标
启动图
支持不同样式
基于样式支持
声明一次
基于像素密度
是否需要做代码版本管理
pubspec.yaml、.packages与pubspec.lock的作用
固定依赖关系复杂的第三方库的版本号
依赖管理器的算法设计
pubspec.yaml统一管理
资源与工程代码依赖属于包管理范畴
使用date_format进行日期格式化
下载安装包依赖
添加到pubspec.yaml
使用第三方库date_format
复用依赖包中的资源
资源依赖
pubspec.lock文件
.packages文件
包版本确定
依赖声明
包的配置文件
目的
官方包仓库
管理代码和资源
Dart的包管理工具
内部配置
外部依赖
元数据
类似于其他平台的配置文件
管理依赖
特殊资源管理
字体管理
图片管理
声明资源路径
先声明后使用
思考题
总结
日期格式化例子
第三方包
Pub
pubspec.yaml
资源管理机制
依赖管理

该思维导图由 AI 生成,仅供参考

你好,我是陈航。
在上一篇文章中,我与你介绍了 Flutter 工程的资源管理机制。在 Flutter 中,资源采用先声明后使用的机制,在 pubspec.yaml 显式地声明资源路径后,才可以使用。
对于图片,Flutter 基于像素密度,设立不同分辨率的目录分开管理,但只需要在 pubspec.yaml 声明一次;而字体则基于样式支持,除了正常字体,还可以支持粗体、斜体等样式。最后,由于 Flutter 需要原生运行环境,因此对于在其启动之前所需的启动图和图标这两类特殊资源,我们还需要分别去原生工程中进行相应的设置。
其实,除了管理这些资源外,pubspec.yaml 更为重要的作用是管理 Flutter 工程代码的依赖,比如第三方库、Dart 运行环境、Flutter SDK 版本都可以通过它来进行统一管理。所以,pubspec.yaml 与 iOS 中的 Podfile、Android 中的 build.gradle、前端的 package.json 在功能上是类似的。
那么,今天这篇文章,我就主要与你分享,在 Flutter 中如何通过配置文件来管理工程代码依赖。

Pub

Dart 提供了包管理工具 Pub,用来管理代码和资源。从本质上说,包(package)实际上就是一个包含了 pubspec.yaml 文件的目录,其内部可以包含代码、资源、脚本、测试和文档等文件。包中包含了需要被外部依赖的功能抽象,也可以依赖其他包。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Flutter中的依赖管理是开发过程中的重要环节,通过pubspec.yaml文件可以管理工程代码的依赖,包括第三方库、Dart运行环境、Flutter SDK版本等。Dart提供了包管理工具Pub,用于管理代码和资源,类似于Android中的JCenter/Maven、iOS中的CocoaPods、前端中的npm库。Pub提供了官方的包仓库,通过它可以方便地查找到有用的第三方包。在pubspec.yaml中,可以声明应用的版本、Dart运行环境支持、外部依赖等信息。依赖包可以通过路径依赖或Git依赖的方式声明,同时也支持版本约束。Pub会根据声明的依赖信息,下载对应版本的包,并创建.pubspec.lock文件记录实际安装的各个直接依赖、间接依赖的包的具体来源和版本号。除了提供功能和代码维度的依赖,包还可以提供资源的依赖,可以通过package参数复用依赖包中的资源。 在Flutter中,资源与工程代码依赖属于包管理范畴,采用包的配置文件pubspec.yaml进行统一管理。 可以通过pubspec.yaml设置包的元数据(比如,包的名称和版本)、运行环境(比如,Dart SDK与Fluter SDK版本)、外部依赖和内部配置。 对于依赖的指定,可以以区间的方式确定版本兼容范围,也可以指定本地路径、Git、Pub这三种不同的数据源。包管理工具会找出同时满足每个依赖包版本约束的包版本,然后依次下载,并通过.packages文件建立下载缓存与包名的映射,最后统一将当前状态下,实际安装的各个包的具体来源和版本号记录至pubspec.lock文件。 现代编程语言大都自带第依赖管理机制,其核心功能是为工程中所有直接或间接依赖的代码库找到合适的版本。Dart使用的Pub依赖管理机制所采用的算法设计,可以有效减少依赖管理器为你寻找代码库依赖版本所耗费的时间。如果工程里的依赖比较多,并且依赖关系比较复杂,一个简单的做法就是在pubspec.yaml文件中固定那些依赖关系复杂的第三方库们,及它们递归依赖的第三方库的版本号。 思考题: 1. pubspec.yaml、.packages与pubspec.lock这三个文件,在包管理中的具体作用是什么? 2. .packages与pubspec.lock是否需要做代码版本管理呢?为什么? 总结:Flutter中的依赖管理是关键的开发环节,通过pubspec.yaml文件管理工

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Flutter 核心技术与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(18)

  • 最新
  • 精选
  • 许童童
    pubspec.yaml、.packages 与 pubspec.lock 这三个文件,在包管理中的具体作用是什么? pubspec.yaml是声明依赖哪些包的配置文件 .packages是表示包在本地目录缓存的地址 pubspec.lock是把依赖锁死的文件 只有pubspec.yaml需要自己编写 其它两个文件会自动生成。 .packages 与 pubspec.lock 是否需要做代码版本管理呢?为什么? pubspec.lock需要做版本管理,因为lock文件把版本锁定,统一工程环境 .packages不需要版本管理,因为跟本地环境有关,无法做到统一

    作者回复: 赞

    2019-08-08
    44
  • 哗啦啦
    想问下老师 。我在ROW 中有3个widget ,想实现 3个widget 的高度填充整个ROW (即3个子widget 中高度最大的那个的高度 ) ,请问有什么好办法能实现 ,我更换了交叉轴对齐方式为 CrossAxisAlignment.stretch 也不行 。感谢 卡了很久这个问题

    作者回复: 你是想让Row的高度跟随最高的Widget,其余的Widget高度也调整到跟这个Widget一样是吗? 试试在外层包一层IntrinsicHeight: Widget build(BuildContext context) { return Scaffold( appBar: AppBar( // Here we take the value from the MyHomePage object that was created by // the App.build method, and use it to set our appbar title. title: Text(S.of(context).main_title), ), body:ListView( children: <Widget>[ IntrinsicHeight( child: Row( children: <Widget>[ Expanded(flex: 1, child: Container(color: Colors.blue,height: 300,)), Container(color: Colors.red,width: 50), Container(color: Colors.yellow,width: 50,height: double.infinity,), ])), Row( children: <Widget>[ Expanded(flex: 1, child: Container(color: Colors.blue,height: 300,)), Container(color: Colors.red,width: 50,height: 100,), Container(color: Colors.yellow,width: 50,height: 100,), ]) ], ) ); }

    2019-08-12
    2
    12
  • 和小胖
    老师请问下,^0.1.2 这个版本号中的 ^ 是什么意思呢?

    作者回复: ^version表示向后兼容的一个版本范围。比如,^1.2.3相当于'>=1.2.3<2.0.0',^0.1.2相当于'>=0.1.2<0.2.0'。

    2019-09-05
    3
    6
  • 和小胖
    1、pubspec.yaml 算是对 flutter 项目配置的管理,类似于 Android 中的 gradle,这些配置包括:项目名称(但是如果桌面的应用名称还得去具体平台的项目里面修改)、项目描述 、各种资源(资源包括图片、文件、字体等),图片文件等资源需要在 yaml 文件中的 assets 标签下配置,字体需要在 fonts 标签下配置; 当然也有项目依赖 dart sdk 的版本配置,项目所依赖的第三方库的配置,而这些第三方库可以是远程 pub 仓库(类似于 jcenter/maven),也可以是 git 仓库,还可以是 本地的依赖库。 .packages 文件里面配置了远程依赖库下载到本地的路径,是一种映射关系。 pubspec.lock 文件里面则是配置了远程依赖库的具体信息,包括依赖库名称、版本号以及依赖地址。里面也有 dart sdk 的版本号。 2、.packages 是不需要版本管理,也不需要提交至远程仓库,应当对它添加忽略,因为它是与本地的映射,每个人的本地目录是不同的;pubspec.lock 则是需要版本管理的,因为他里面记录了具体的依赖信息。

    作者回复: 太赞了👍

    2019-09-05
    5
  • 汪帅
    我一直比较关心的还是关于第三方官方库支持情况,例如地图,即时通讯,音视频等等!安卓我倒是可以解决就是iOS我不会还是需要纯flutter的

    作者回复: 音视频这类插件已经有比较丰富的第三方插件支持了,Pub上有很多,你可以选一个Star和评分相对高些的,像声网这样专业的音视频公司也有专门的SDK做Flutter音视频通信; 地图插件大都基于Google Map,可以耐心等待国内的地图厂商提供Flutter插件版本; 即时通讯目前没有特别好的Flutter插件,建议可以通过混合开发的方式把IM能力融合到Flutter应用中。 即时通讯

    2019-08-08
    3
    3
  • davidzhou
    只是不太明白image.asset使用的是一个完整的uri,如果项目内图片资源比较多,我希望图片资源进行目录分类,那个路径就相对较长,如果是iOS的话,统一在一个地方创建xx.imageset就可以直接使用这个图片标识符了

    作者回复: 如果你的资源目录层次比较清晰,资源比较多,可以在外部再包一层,简化调用参数

    2019-08-08
    3
    2
  • Carlo
    依赖管理中的版本冲突很麻烦。pub每个包只下载一个版本。这就造成了如果第三方库很旧,依赖了A包很老的版本。如果我在自己的工程中用了A包最新版本。那就会造成冲突。请问这种情况怎么解决?

    作者回复: 把所有依赖(及其递归依赖)及版本号展开都写到pubspec文件中就可以了

    2019-10-14
    1
  • 巫山老妖
    思考题1 : - pubspec.yaml(设置包的元数据(比如,包的名称和版本)、运行环境(比如Dart SDK与Flutter SDK版本)、外部依赖和内部配置) - .packages(将依赖包名与系统缓存中的包文件路径进行映射,方便后续维护) - pubspec.lock(用于记录当前状态下实际安装的各个直接依赖、间接依赖的包的具体来源和版本号) 思考题2: .package文件不用托管,因为这个文件是自动生成的,存储的是包映射的是本地路径,不同开发环境路径不一样。 pubspec.lock需要托管,每次变更版本都会更新这个文件,我们也能知道实际安装版本。

    作者回复: 非常棒👍

    2019-10-06
    1
  • 毛哥来了
    是否跟package.json一样也支持 ~1.2.3 这样的格式

    作者回复: 不支持,只能用^

    2019-10-25
  • kkliu
    pubspec.yaml设定引用第三方SDK的版本范围,如果要指定对应版本可以直接在pubspec.lock 文件里指定sdk的版本号?

    作者回复: 无论什么时候需要指定版本都是直接改pubspec.yaml,然后重新安装。pubspec.lock文件是Pub包管理器根据依赖关系图自动生成的,不能自己手动改。

    2019-09-29
收起评论
显示
设置
留言
18
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部