Men的博客

欢迎光临!

0%

flutter总结

1.什么是flutter
google 、dart、skia、jit、aot、ioslate、静态语言,类型检查安全、不支持反射、编译最小树
PlatformChannel,ffi

Widget:不可变、重建、配置表
element:上下文、虚拟dom、diff更新、保存state
renderObject:布局、绘制、合成、渲染、layout、parint
Layer:绘制区域,提交给skia
绘制流程
GPU垂直同步信号机制,动画,合成、布局、绘制、合成、光栅化
setstate 、markNeedsBuild、dirty、drawframe、preformRebuild、isRepaintBoundary
状态管理
provider、InheriterWidget
bloc、
state
streamSubscription
streamController

多线程
本身是单线程的,ioslate中、event、microktask
frature、await、async

生命周期:
initState、changeDependencies、didUpdateWidget、build、deactive、disponse

手势:
hitTest 碰撞、dispatchEvent分发 GestureRecognizer手势识别

gc:
老年代、标记清除

其他:
屏幕适配、性能分析、混合开发、业务组件封装

flutter组件
动画、iOS、function、手势、android、绘制、服务、任务、
异步、集合、数学、文件流、日期、平台

flutter整理
1.flutter的布局
布局有水平、垂直、居中、弹性、层叠布局等
容器按形式分为单节点和多节点
容器按功能分为装饰、限制、变换、位置、尺寸、绘制
Flutter为我们提供了非常丰富的组件,iOS、andorid各一套,建议倾向于使用android库。

2.flutter开发
Flutter没有为开发者设计开发模式,我们常用的mvc结构在flutter中没有体现。
我们可以使用getx来实现mvc的架构模式。

Getx原理剖析
1.getx响应式原理
getx存在Getbuilder和obs两种方式
Builder实际上是创建一个statefulWidget,实现了刷新的机制
Obs实际上是重写了数据对象int、string、list、map等,在对象内实现了监听的绑定。
在获取value时候进行绑定监听。
Obs实际上使用StreamSubscription来实现的。比较适合单个组件数据的更新
Getbuilder是使用statefulWidget setState实现的。比较适合多个组件数据的批量更新。

Flutter图片展示

Flutter提供的图片组件没有原生的图片组件性能高,我们可以参考闲鱼组件方式,调用原生来实现图片的展示,iOS是SDWebImage

flutter线程

每个isolate包含一个事件循环以及两个事件队列,event loop事件循环,以及event queue和microtask queue事件队列,event和microtask队列有点类似iOS的source0和source1。

常用组件
getx
dio
shared_preferences
sqflite
fluttertoast

flutter绘制流程

Widget概念
widget只是一个配置数据结构,创建是非常轻量的,加上flutter团队对widget的创建/销毁做了优化,不用担心整个widget树重新创建所带来的性能问题,但是renderobject就不一样了,renderobject涉及到layout、paint等复杂操作,是一个真正渲染的view,整个view 树重新创建开销就比较大,所以答案是否定的。
Widget :就是我们平常写的控件, Flutter 宇宙中万物皆 Widget ,它们 都是不可变⼀帧,同时也是被⼈吐槽很多的嵌套模式,当然换个⻆度,事实上 你把他当作 Widget 配置⽂件来写或者就好理解了。
Element :它是 BuildContext 的实现类, Widget 实现跨帧保存的 state
就是存放在这⾥,同时它也充当了 Widget 和 RenderObject 之间的桥梁。
RenderObject :它才是真正⼲活(layout、paint)等,同时它才是真实的
“dom” 。
Layer :⼀整块的重绘区域(isRepaintBoundary),决定重绘的影响区域。

树的更新规则
找到widget对应的element节点,设置element为dirty,触发drawframe, drawframe会调用element的performRebuild()进行树重建

树的更新规则

Provider原理

Flutter与原生的交互是通过planfrom Channel实现的,我们可以使用库

runApp做的事情

1.初始化
WidgetsFlutterBinding.ensureInitialized
BindingBase初始化基类,规定了初始化的框架。
initInstances 中完成初始化,比如单例等
initServiceExtensions 完成服务注册初始化
GestureBinding初始化手势识别 和 手势追踪框架
SchedulerBinding初始化 帧调用任务
ServicesBinding初始化 插件通道、系统的插件。
PaintingBinding初始化 图片缓存
SemanticsBinding初始化 语义框架
RendererBinding初始化 渲染机制 和 根
RenderObjectWidgetsBinding初始化 Element 机制 和 Debug 显示机制

getx原理

全局单利,依赖注入

flutter Pigeon 兼容

通过Pigeon来管理Flutter的plugin库,只需要在dart侧维护一份协议即可,即使在多端协同开发的情况下,也能达到约束和规范的作用。
Platform Channel

理解flutter状态

通过serState来改变状态
通过inheritedWidget来实现父子状态传递
通过Provider来维护全局状态