Flutter干货分享系列
基础
1、概念
Flutter是Google开发的一套全新的跨平台、开源UI框架,支持iOS、Android系统开发。(Google亲儿子)
2、目标
使同一套代码同时运行在Android和iOS系统上,并且拥有媲美原生应用的性能,Flutter甚至提供了两套控件来适配Android Design和Cupertino 和Cupertino(iOS风格)widget(滚动效果、字体和控件图标等等),为了让App在细节处看起来更像原生应用。
3、优势
3.1、快速开发
毫秒级的热重载,修改后,您的应用界面会立即更新。使用丰富的、完全可定制的widget在几分钟内构建原生界面。
3.2、富有表现力和灵活的UI
快速发布聚焦于原生体验的功能。分层的架构允许您完全自定义,从而实现难以置信的快速渲染和富有表现力、灵活的设计。
3.3、原生性能
Flutter包含了许多核心的widget,如滚动、导航、图标和字体等,这些都可以在iOS和Android上达到原生应用一样的性能。
4、思路
Flutter则开辟了一种全新的思路,从头到尾重写一套跨平台的UI框架,包括UI控件、渲染逻辑甚至开发语言。渲染引擎依靠跨平台的Skia图形库来实现,依赖系统的只有图形绘制相关的接口,可以在最大程度上保证不同平台、不同设备的体验一致性,逻辑处理使用支持AOT的Dart语言,执行效率也比JavaScript高得多。
5、 热刷新(Hot Reload)
Flutter同时支持Windows、Linux和macOS操作系统作为开发环境,并且在Android Studio和VS Code两个IDE上都提供了全功能的支持。
Flutter所使用的Dart语言同时支持AOT和JIT运行方式,JIT模式下还有一个备受欢迎的开发利器“热刷新”(Hot Reload),即在Android Studio中编辑Dart代码后,只需要点击保存或者“Hot Reload”按钮,就可以立即更新到正在运行的设备上,不需要重新编译App,甚至不需要重启App,立即就可以看到更新后的样式。
6、Widget
在Flutter中,所有功能都可以通过组合多个Widget来实现,包括对齐方式、按行排列、按列排列、网格排列甚至事件处理等等。Flutter控件主要分为两大类,StatelessWidget和StatefulWidget,StatelessWidget用来展示静态的文本或者图片,如果控件需要根据外部数据或者用户操作来改变的话,就需要使用StatefulWidget。
- 使用Flutter的现代、响应式框架,和一系列基础widget,轻松构建您的用户界面。使用功能强大且灵活的API(针对2D、动画、手势、效果等)解决艰难的UI挑战。
7、State
State的概念也是来源于Facebook的流行Web框架 React ,React风格的框架中使用控件树和各自的状态来构建界面,当某个控件的状态发生变化时由框架负责对比前后状态差异并且采取最小代价来更新渲染结果。
8、热刷新原理
Flutter通过将新的代码注入到正在运行的DartVM中,来实现Hot Reload这种神奇的效果,在DartVM将程序中的类结构更新完成后,Flutter会立即重建整个控件树,从而更新界面。
8.1 不能刷新的情况
- 编译错误,如果修改后的Dart代码无法通过编译,Flutter会在控制台报错,这时需要修改对应的代码。
- 控件类型从StatelessWidget到StatefulWidget的转换。
- 全局变量和静态成员变量,这些变量不会在热刷新时更新。
- 修改了main函数中创建的根控件节点,Flutter在热刷新后只会根据原来的根节点重新创建控件树,不会修改根节点。
- 某个类从普通类型转换成枚举类型,或者类型的泛型参数列表变化,都会使热刷新失败。
9、Flutter插件
Dart语言无法直接调用Android系统提供的Java接口,需要使用插件来实现中转,Flutter官方提供了丰富的原生接口封装。
插件 | 说明 |
---|---|
android_alarm_manager | 访问Android系统的AlertManager |
android_intent | 构造Android的Intent对象 |
battery | 获取和监听系统电量变化 |
connectivity | 获取和监听系统网络连接状态 |
device info | 获取设备型号等信息 |
image_picker | 从设备中选取或者拍摄照片 |
package_info | 获取App安装包的版本等信息 |
path_provider | 获取常用文件路径 |
quick_actions | App图标添加快捷方式,iOS的 eponymous concept 和Android的 App Shortcuts |
sensors | 访问设备的加速度和陀螺仪传感器 |
shared_preferences | App KV存储功能 |
url_launcher | 启动URL,包括打电话、发短信和浏览网页等功能 |
video_player | 播放视频文件或者网络流的控件 |
10、Dart简介
Dart 是一种强类型、跨平台的客户端开发语言。具有专门为客户端优化、高生产力、快速高效、可移植(兼容ARM/x86)、易学的OO编程风格和原生支持响应式编程(Stream & Future)等优秀特性。
Dart主要由Google负责开发和维护
Dart本身提供了三种运行方式:
- 使用Dart2js编译成JavaScript代码,运行在常规浏览器中( Dart Web )。
- 使用DartVM直接在命令行中运行Dart代码( DartVM )。
- AOT方式编译成机器码,例如Flutter App框架( Flutter )。
11、Dart优势
- 健全的类型系统,同时支持静态类型检查和运行时类型检查。
- 代码体积优化(Tree Shaking),编译时只保留运行时需要调用的代码(不允许反射这样的隐式引用),所以庞大的Widgets库不会造成发布体积过大。
- 丰富的底层库,Dart自身提供了非常多的库。
- 多生代无锁垃圾回收器,专门为UI框架中常见的大量Widgets对象创建和销毁优化。
- 跨平台,iOS和Android共用一套代码。
- JIT & AOT运行模式,支持开发时的快速迭代和正式发布后最大程度发挥硬件性能。
12、Dart基础语法
- 所有变量的值都是对象,也就是类的实例。甚至数字、函数和null也都是对象,都继承自 Object 类。
- 虽然Dart是强类型语言,但是显式变量类型声明是可选的,Dart支持类型推断。如果不想使用类型推断,可以用 dynamic 类型。
- Dart支持泛型,List表示包含int类型的列表,List则表示包含任意类型的列表。
- Dart支持顶层(top-level)函数和类成员函数,也支持嵌套函数和本地函数。
- Dart支持顶层变量和类成员变量。
- Dart没有public、protected和private这些关键字,使用下划线“_”开头的变量或者函数,表示只在库内可见。参考 库和可见性 。
12.1、内存分配策略
DartVM的内存分配策略非常简单,创建对象时只需要在现有堆上移动指针,内存增长始终是线形的,省去了查找可用内存段的过程
12.2、线程
Dart中类似线程的概念叫做Isolate,每个Isolate之间是无法共享内存的,所以这种分配策略可以让Dart实现无锁的快速分配。
12.3、垃圾回收
Dart的垃圾回收也采用了多生代算法,新生代在回收内存时采用了“半空间”算法,触发垃圾回收时Dart会将当前半空间中的“活跃”对象拷贝到备用空间,然后整体释放当前空间的所有内存
整个过程中Dart只需要操作少量的“活跃”对象,大量的没有引用的“死亡”对象则被忽略,这种算法也非常适合Flutter框架中大量Widget重建的场景。
13、相关传送门
- 1、
- 2、
- 3、
- 4、
- 5、
- 6、
- 7、
- 8、
- 9、