Flutter核心技术与实战
陈航
美团点评高级技术专家
立即订阅
6150 人已学习
课程目录
已完结 47 讲
0/4登录后,你可以任选4讲全文学习。
课前必读 (3讲)
开篇词 | 为什么每一位大前端从业者都应该学习Flutter?
免费
01 | 预习篇 · 从0开始搭建Flutter工程环境
02 | 预习篇 · Dart语言概览
Flutter开发起步 (3讲)
03 | 深入理解跨平台方案的历史发展逻辑
04 | Flutter区别于其他方案的关键技术是什么?
05 | 从标准模板入手,体会Flutter代码是如何运行在原生系统上的
Dart语言基础 (3讲)
06 | 基础语法与类型变量:Dart是如何表示信息的?
07 | 函数、类与运算符:Dart是如何处理信息的?
08 | 综合案例:掌握Dart核心特性
Flutter基础 (13讲)
09 | Widget,构建Flutter界面的基石
10 | Widget中的State到底是什么?
11 | 提到生命周期,我们是在说什么?
12 | 经典控件(一):文本、图片和按钮在Flutter中怎么用?
13 | 经典控件(二):UITableView/ListView在Flutter中是什么?
14 | 经典布局:如何定义子控件在父容器中排版的位置?
15 | 组合与自绘,我该选用何种方式自定义Widget?
16 | 从夜间模式说起,如何定制不同风格的App主题?
17 | 依赖管理(一):图片、配置和字体在Flutter中怎么用?
18 | 依赖管理(二):第三方组件库在Flutter中要如何管理?
19 | 用户交互事件该如何响应?
20 | 关于跨组件传递数据,你只需要记住这三招
21 | 路由与导航,Flutter是这样实现页面切换的
Flutter进阶 (17讲)
22 | 如何构造炫酷的动画效果?
23 | 单线程模型怎么保证UI运行流畅?
24 | HTTP网络编程与JSON解析
25 | 本地存储与数据库的使用和优化
26 | 如何在Dart层兼容Android/iOS平台特定实现?(一)
27 | 如何在Dart层兼容Android/iOS平台特定实现?(二)
28 | 如何在原生应用中混编Flutter工程?
29 | 混合开发,该用何种方案管理导航栈?
30 | 为什么需要做状态管理,怎么做?
31 | 如何实现原生推送能力?
32 | 适配国际化,除了多语言我们还需要注意什么?
33 | 如何适配不同分辨率的手机屏幕?
34 | 如何理解Flutter的编译模式?
35 | Hot Reload是怎么做到的?
36 | 如何通过工具链优化开发调试效率?
37 | 如何检测并优化Flutter App的整体性能表现?
38 | 如何通过自动化测试提高交付质量?
Flutter综合应用 (6讲)
39 | 线上出现问题,该如何做好异常捕获与信息采集?
40 | 衡量Flutter App线上质量,我们需要关注这三个指标
41 | 组件化和平台化,该如何组织合理稳定的Flutter工程结构?
42 | 如何构建高效的Flutter App打包发布环境?
43 | 如何构建自己的Flutter混合开发框架(一)?
44 | 如何构建自己的Flutter混合开发框架(二)?
结束语 (1讲)
结束语 | 勿畏难,勿轻略
特别放送 (1讲)
特别放送 | 温故而知新,与你说说专栏的那些思考题
Flutter核心技术与实战
登录|注册

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

陈航 2019-08-08
你好,我是陈航。
在上一篇文章中,我与你介绍了 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/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Flutter核心技术与实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(12)

  • 许童童
    pubspec.yaml、.packages 与 pubspec.lock 这三个文件,在包管理中的具体作用是什么?
    pubspec.yaml是声明依赖哪些包的配置文件
    .packages是表示包在本地目录缓存的地址
    pubspec.lock是把依赖锁死的文件
    只有pubspec.yaml需要自己编写 其它两个文件会自动生成。

    .packages 与 pubspec.lock 是否需要做代码版本管理呢?为什么?
    pubspec.lock需要做版本管理,因为lock文件把版本锁定,统一工程环境
    .packages不需要版本管理,因为跟本地环境有关,无法做到统一

    作者回复: 赞

    2019-08-08
    5
  • 哗啦啦
    想问下老师 。我在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
    1
    4
  • 和小胖
    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
    2
  • 和小胖
    老师请问下,^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
    1
    1
  • 汪帅
    我一直比较关心的还是关于第三方官方库支持情况,例如地图,即时通讯,音视频等等!安卓我倒是可以解决就是iOS我不会还是需要纯flutter的

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

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

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

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

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

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

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

    2019-10-14
  • 巫山老妖
    思考题1 :
    - pubspec.yaml(设置包的元数据(比如,包的名称和版本)、运行环境(比如Dart SDK与Flutter SDK版本)、外部依赖和内部配置)
    - .packages(将依赖包名与系统缓存中的包文件路径进行映射,方便后续维护)
    - pubspec.lock(用于记录当前状态下实际安装的各个直接依赖、间接依赖的包的具体来源和版本号)

    思考题2:
    .package文件不用托管,因为这个文件是自动生成的,存储的是包映射的是本地路径,不同开发环境路径不一样。
    pubspec.lock需要托管,每次变更版本都会更新这个文件,我们也能知道实际安装版本。

    作者回复: 非常棒👍

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

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

    2019-09-29
  • andy
    随着课程的节数增加,每节课的评论人数越来越少了,是不是好多放弃的

    编辑回复: 慢慢会追上来的~

    2019-09-05
  • Yolo七夜
    学到了,环境相关的sdk最好统一,其他依赖的第三方库最好放开
    2019-08-13
收起评论
12
返回
顶部