Framework 提供了响应式的UI框架,Engine提供了Skia渲染引擎、Dart的运行时环境等。
Dart 支持JIT(Just In Time)和AOT(Ahead Of Time).有内存安全保证,降低了安全漏洞风险。
Dart 语言特有的特性
Dart 是面向对象的编程语言、强类型语言、线程模型(Dart是单线程,底层提供多线程模型)、async/await
Dart 的线程模型
Dart 线程模型:微任务队列优先执行、然后才是事件队列。微任务队列应该尽量的少,防止阻塞事件队列导致UI卡顿。
Dart 线程管理:UI 主要将Widget描述布局信息分析成Tree;GPU 解析Layer Tree 转化为实际的GPU指令 GPU调度通知UI 去创建Layer Tree。
Dart 异步编程
async-await 代码块是对Future API的简化形式,将异步回调代码写成同步代码。
async
关键字修饰的函数返回一个Future对象,不会阻塞当前线程,await
关键字会同步执行,阻塞当前线程.
Future 的实现方式:
Flutter 工程结构
创建工程的方式
命令和IDE两种方式:
flutter create mcapp
Flutter 布局方式和差异
声明式UI和命令式UI
两种不同的编程范式
命令式UI:UI界面由一个个命令操作组合而成
声明式UI:将想要的UI描述出来即可,更适合做多设备适配,UI布局和控制逻辑通过reactive方式实现数据绑定,更好实现UI局部刷新机制,只刷新更新的部分。
理解Widget
Widget 是不可变的,@immutable ,StatelessWidget 无状态的Widget 和 StatefulWidget 有状态的Widget,Widget一定是不可变,如果需要改变属性需要用可变的State. StatelessWidget 和StatefulWidget 差别在于是否能重建。StatefulWidget 可以实现自重建。
State更新方式:
- 通过state.setState()触发重布局
- 需要遍历更新的Element,依次调用
rebuild
声明周期:
- createState:创建State,当StatefulWidget被调用时会立即执行
- initState: State初始化方法,需调用super重写父类的方法
- didChangeDependencies: 该函数是在该组件依赖的State发生变化时调用,例如语言或者主题等。
- Build:返回需要渲染的Widget
- Reassemble: 开发阶段使用,在debug模式下调用
- didUpdateWidget: 主要是在组件重新构建时调用,比如热重载、或父组件发生build
- Deactivate: 在组件被移除节点后会被调用,如果该组件被移除节点,然后未被插入到其他节点时,则会继续调用dispose永久移除
- Dispose:永久移除组件,并释放组件资源