Flutter 技术文档总结问题

Flutter

缘由

原生应用程序是指某一个移动平台(比如iOS或安卓)所特有的应用,使用相应平台支持的开发工具和语言。但纯原生开发主要面临动态化和开发成本两个问题,诞生了一些跨平台的动态化框架。

  1. H5+原生(Cordova、Ionic、微信小程序)
  2. JavaScript开发+原生渲染 (React Native、Weex、快应用)
  3. 自绘UI+原生(QT for mobile、Flutter)

简介

Flutter 是 Google 推出并开源的移动应用开发框架,主打跨平台、高保真、高性能。开发者可以通过 Dart语言开发 App,一套代码同时运行在 iOS 和 Android平台。 Flutter提供了丰富的组件、接口,开发者可以很快地为 Flutter添加 native扩展。同时 Flutter还使用 Native引擎渲染视图,这无疑能为用户提供良好的体验。

Dart语言开发

  1. 开发效率高,采用JIT模式(“即时编译”),基于AOT的发布包(提前编译)
  2. Flutter旨在提供流畅、高保真的的UI体验。
  3. Dart是类型安全的语言,支持静态类型检测
  4. Dart团队就在你身边

Flutter框架结构

Flutter框架结构
  1. 底下两层(Foundation和Animation、Painting、Gestures)在Google的一些视频中被合并为一个dart UI层
  2. Rendering层,这一层是一个抽象的布局层,它依赖于dart UI层,Rendering层会构建一个UI树,当UI树有变化时,会计算出有变化的部分,然后更新UI树,最终将UI树绘制到屏幕上。
  3. Widgets层是Flutter提供的的一套基础组件库,在基础组件库之上,Flutter还提供了 Material 和Cupertino两种视觉风格的组件库。
ps:资料

官网:阅读Flutter官网的资源是快速入门
源码及注释:源码注释应作为学习Flutter的第一文档,Flutter SDK的源码是开源的
Github:可以去github flutter 项目下提issue。
StackOverflow
Flutter中文网社区
博客


搭建环境


Widget简介

在Flutter中几乎所有的对象都是一个Widget,Flutter中的Widget的概念更广泛,它不仅可以表示UI元素,也可以表示一些功能性的组件(如:用于手势检测的 GestureDetector widget、用于APP主题数据传递的Theme等等)

Widget与Element

Widget的功能是“描述一个UI元素的配置数据”,实际上,Flutter中真正代表屏幕上显示元素的类是Element,Widget只是UI元素的一个配置数据,并且一个Widget可以对应多个Element。Widget树实际上是一个配置树,而真正的UI渲染树是由Element构成。


Widget与Element
StatelessWidget

它继承自Widget类,重写了createElement()方法。
StatelessWidget用于不需要维护状态的场景,它通常在build方法中通过嵌套其它Widget来构建UI。

StatefulWidget

StatefulWidget也是继承自Widget类,并重写了createElement()方法,不同的是返回的Element 对象并不相同;另外StatefulWidget类中添加了一个新的接口createState()。
createState() 用于创建和Stateful widget相关的状态,它在Stateful widget的生命周期中可能会被多次调用。

State
  1. 在widget 构建时可以被同步读取。
  2. 在widget生命周期中可以被改变,当State被改变时,可以手动调用其setState()方法通知Flutter framework状态发生改变,Flutter framework在收到消息后,会重新调用其build方法重新构建widget树,从而达到更新UI的目的。
State的生命周期
  1. initState:当Widget第一次插入到Widget树时会被调用,
  2. didChangeDependencies():当State对象的依赖发生变化时会被调用
  3. build():它主要是用于构建Widget子树
  4. reassemble():为了开发调试而提供的,在热重载(hot reload)时会被调用
  5. didUpdateWidget():在widget重新构建时调用
  6. deactivate():当State对象从树中被移除时,会调用此回调。
  7. dispose():当State对象从树中被永久移除时调用;通常在此回调中释放资源。
State的生命周期

基础组件

Text 用于显示简单样式文本
Text
Text
  • TextStyle用于指定文本显示的样式如颜色、字体、粗细、背景等
image.png
image.png

TextSpan按照不同的样式显示


image.png

image.png
Material组件库中的按钮

RaisedButton 即"漂浮"按钮,它默认带有阴影和灰色背景


image.png

FlatButton即扁平按钮,默认背景透明并不带阴影


image.png

OutlineButton默认有一个边框,不带阴影且背景透明
image.png

IconButton是一个可点击的Icon,不包括文字,默认没有背景


image.png

自定义按钮外观
image.png
自定义按钮外观
Image组件来加载并显示图片
image.png

image.png

Image的数据源可以是asset、文件、内存以及网络。ImageProvider 是一个抽象类,主要定义了图片数据获取的接口load(),如AssetImage是实现了从Asset中加载图片的ImageProvider,而NetworkImage实现了从网络加载图片的ImageProvider。


image.png
单选开关和复选框
image.png
输入框及表单
image.png
进度指示器

Material 组件库中提供了两种进度指示器:LinearProgressIndicator和CircularProgressIndicator


image.png

布局类组件简介
线性布局(Row和Column)

Flutter中通过Row和Column来实现线性布局,类似于Android中的LinearLayout控件。
在线性布局中,有两个定义对齐方式的枚举类MainAxisAlignment和CrossAxisAlignment,分别代表主轴对齐和纵轴对齐。

MainAxisAlignment(主轴)和CrossAxisAlignment(交叉轴)

MainAxisAlignment(主轴)就是与当前控件方向一致的轴,而CrossAxisAlignment(交叉轴)就是与当前控件方向垂直的轴
MainAxisAlignment.spaceBetween:使中间的各个子控件间距相等MainAxisAlignment.start:子控件放在主轴开始位置(类似于android默认Linerlayout排列规则)MainAxisAlignment.end:将子控件放在主轴的结束位置MainAxisAlignment.center:将子控件放在主轴的中间位置MainAxisAlignment.spaceEvenly:将主轴空白区域均分,使各个子控件间距相等

image.png

image.png
弹性布局(Flex)

弹性布局允许子组件按照一定比例来分配父容器空间。Flutter中的弹性布局主要通过Flex和Expanded来配合实现。
Flex组件可以沿着水平或垂直方向排列子组件。
Expanded可以按比例“扩伸” Row、Column和Flex子组件所占用的空间。


image.png

弹性布局比较简单,唯一需要注意的就是Row、Column以及Flex的关系。

Wrap 流式布局

我们把超出屏幕显示范围会自动折行的布局称为流式布局。


image.png

image.png
层叠布局 Stack、Positioned

层叠布局和Web中的绝对定位、Android中的Frame布局是相似的,子组件可以根据距父容器四个角的位置来确定自身的位置。

Stack允许子组件堆叠,而Positioned用于根据Stack的四个角来确定子组件的位置。

image.png

image.png
对齐与相对定位(Align)

Align 组件可以调整子组件的位置,并且可以根据子组件的宽高来确定自身的的宽高


容器类Widget

容器类Widget和布局类Widget都作用于其子Widget,
不同的是:

布局类Widget一般都需要接收一个widget数组(children),而容器类Widget一般只需要接收一个子Widget(child)
布局类Widget是按照一定的排列方式来对其子Widget进行排列,而容器类Widget一般只是包装其子Widget,对其添加一些修饰(补白或背景色等)、变换(旋转或剪裁等)、或限制(大小等)。

填充(Padding)

Padding可以给其子节点添加填充(留白),和边距效果类似。

尺寸限制类容器
尺寸限制类容器用于限制容器大小

  1. ConstrainedBox用于对子组件添加额外的约束。
  2. BoxConstraints用于设置限制条件
  3. SizedBox用于给子元素指定固定的宽高
  4. UnconstrainedBox不会对子组件产生任何限制,它允许其子组件按照其本身大小绘制
  5. AspectRatio,它可以指定子组件的长宽比
  6. LimitedBox 用于指定最大宽高
  7. FractionallySizedBox 可以根据父容器宽高的百分比来设置子组件宽高
装饰容器DecoratedBox

DecoratedBox可以在其子组件绘制前(或后)绘制一些装饰(Decoration),如背景、边框、渐变等


image.png

image.png
变换(Transform)

Transform可以在其子组件绘制时对其应用一些矩阵变换来实现一些特效


变换代码

变换

平移

旋转

缩放
Container是一个组合类容器

Scaffold、TabBar、底部导航


image.png

可滚动组件简介

常用的可滚动组件(如ListView、GridView等)
ScrollController来控制可滚动组件的滚动位置

ps:看例子


第三方插件

flutter_spinkit

  • 这个 loading 库集成简单而且效果多样,基本包含日常中常见的样式。
  • dependencies: flutter_spinkit: "^3.1.0"
  • SpinKitPouringHourglass(color: Colors.white)

GitHub链接:

https://github.com/Tamas2016/Flutter_Demo

未完待更~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,165评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,503评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,295评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,589评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,439评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,342评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,749评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,397评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,700评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,740评论 2 313
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,523评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,364评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,755评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,024评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,297评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,721评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,918评论 2 336