Flutter总结

1.Widget Element和RenderObject之间的关系

  • Widget是不可改变的(只是一个配置数据的树),每次保持在一帧。如果发生改变是通过State(用来管理状态)实现跨帧状态保存。而真实完成布局和绘制数组的是RenderObject(管理布局和绘制等操作),Element充当两者的桥梁,State就是保存在Element中
  • Widget可以对应多个Element(一对多关系)
  • Element和RenderObject是一一对应关系
  • Element中会持有Widget、RenderObject
2. Future和Stream是什么关系
  • Stream和Future是Dart异步处理的核心Api
  • Future是对Zone的封装使用,表示稍后获得一个数据,所有异步操作的返回值都用Future来表示,但是Future只能表示一次
  • Stream也是对Zone的封装使用,表示多次异步获得的数据。(比如界面上的按钮可能会被用户点击多次,所以按钮上的点击事件就是一个Stream。简单地说,Future将返回一个值,而Stream将返回多次值。Dart中统一使用Stream处理异步事件流。Stream和一般的集合类似,都是一组数据,只不过一个是异步推送,一个是同步拉取)
3.Flutter有多少棵树
  • Flutter存在Widget、Element、RenderObject、Layer四棵树
4.Flutter中都有哪几种线程
  • Flutter存在四大线程:UI runner、GPU runner、IO runner、Platform runner(原生主线程)
  • 同时在Flutter中可以通过isolate或者compute执行真正的跨线程异步操作
5.Flutter中Widget State Context的核心概念?是为了解决什么问题?
  • Widget:在Flutter中几乎所有东西都是Widget。将一个Widget想像为一个可视化的组件,当你需要构建与布局或者间接相关的内容时候,你就是正在使用Widget
  • Widget树:Widget以树结构进行组织,只是一个配置数据的树,包含其他Widget被称为父Widget(或Widget容器)。包含在父Widget中的widget被称为子Widget
  • Context:每一个Widget都会对应一个Context对象,它和Widget是连接在一起的,并且会形成一个Context树
  • State:定义了StatefulWidget实例的行为,它包含了用与交互Widget信息的行为和布局,应用于State的任何更改都会强制重建Widget。
  • 这些状态的引入主要是为了解决多个组件之间的交互和组件自身状态的维护。
6.Widget唯一标识key有哪几种
  • 在Flutter中,每个Widget都是被唯一标识的,这个唯一标识在build或者rendering阶段由框架定义。该标识对应于可选的Key参数,如果省略,Flutter将会自动生成一个
  • 在Flutter中,主要有4种类型的Key:GlobalKey(确保生成的key在整个应用中唯一,是很昂贵的,允许Element在树周围移动或变更父节点而不会丢失状态)、LocalKey、UniqueKey、ObjectKey
7.Widget两种类型
  • StatelessWidget:用于不需要维护状态的场景
  • StatefulWidget:用于需要维护状态的场景,在生命周期内,该类Widget所持有的数据可能会发生变化,这样的数据称为State
8.StatefulWidget生命周期
  • initState()————>didChangeDependencies()————>build()————>deactivate()————>dispose()
  • initState() 表示当前State将和一个BuildContext产生关联,但是此时BuildContext没有完全装载完成,如果你需要在该方法中获取BuildContext,可以new Future.delayed(const Duration(seconds: 0, (){//context}); 一下。
  • didChangeDependencies() 在initState()之后调用,当State对象的依赖关系发生变化时,该方法会被调用,初始化时也会被调用
  • build() 会在如下场景被调用
【Flutter总结】在调用initState()之后。
在调用didUpdateWidget()之后。
在调用setState()之后。
在调用didChangeDependencies()之后。
在State对象从树中一个位置移除后(会调用deactivate)又重新插入到树的其它位置之后。
  • deactivate() 当State被暂时从视图树中移除时,会调用这个方法,同时页面切换时,也会调用
  • dispose() Widget销毁了,在调用这个方法之前,总会先调用deactivate()
  • didUpdateWidget() 当widget状态发生变化时,会调用
9.Future和Isolate有什么区别
  • Future是异步编程,调用本身立即返回,并在稍后的某个时候执行完成时再获得返回结果。在普通代码中可以使用await等待一个异步调用结束
  • Isolate是并发编程,Dart有并发时的共享状态,所有代码都在Isolate中运行,包括最初的main()。每个Isolate都有它自己的堆内存,意味着其中所有内存数据,包括全局数据,都仅对该Isolate可见,它们之间的通信只能通过传递消息的机制完成,消息则通过端口收发。
10.Flutter是如何与原生Android iOS进行通信
  • Flutter中可以通过Platform Channel(并非是线程安全的)让Dart代码和原生代码通信
1.BasicMessageChannel:用于传递字符串和半结构化的信息
2.MethodChannel:用于传递方法调用
3.EventChannel:用于数据流的通信
11.InheritedWidget使用
  • Flutter中InheritedWidget一般用于状态共享,比如Theme、Localizations、MediaQuery等,都是通过它实现共享状态
12. flutter消息循环机制
  • Flutter中Dart线程是以事件循环和消息队列的形式存在,包含两个任务队列,一个microtask内部队列,一个是event外部队列,而microtask的优先级又高于event。
因为microtask的优先级又高于event,同时会阻塞event队列,所以如果microtask太多就可能会对触摸、绘制等外部事件造成阻塞卡顿

    推荐阅读