Flutter相关的知识点,丰富自己,自我救赎003
Flutter,RN,Weex对比
- 1,Flutter是基于GPU进行渲染的,而RN则将渲染交给原生平台,自己只负责通过JsCore将视图组织起来,并处理业务逻辑。所以在渲染效果和性能上,Flutter的性能比RN要强很多。
- 2,RN平台适配层比Flutter要大很多。RN是通过JsCore引擎进行原生代码调用的,和原生代码交互很多,所以需要更多的适配。而Flutter则只需要对各自平台独有的特性进行适配即可,例如调用系统相册,粘贴板等。
- 3,Flutter技术实现是基于更底层实现的,对平台依赖度不是很高,相对来讲,RN对平台的依赖度很高的。所以RN未来的技术升级,包括扩展之类的,都会受到很大的限制。而Flutter未来潜力将会很大,可以做很多技术改进。
Flutter与Android如何通信?
- 通过PlatformChannel与原生进行交互,其中PlatformChannel分为三种:
- 1,BasicMessageChannel:用于传递字符串和半结构化的信息
- 2,MethodChannel:用于传递方法调用,Flutter主动调用Native的方法,并获取相应的返回值
- 3,EventChannel:用于数据流(event streams)的通信
Flutter线程机制,单线程多线程?
Dart线程模型是如何执行的?
- Dart是单线程模型,以消息循环机制来运行的,包含两个任务队列,一个是“微任务队列”(microtask queue),另一个叫做“事件队列”(event queue)。当Flutter应用启动后,消息循环机制便启动了,首先会按照先进先出的顺序逐个执行微任务队列中的任务,当所有微任务队列执行完后便开始执行事件队列中的任务,事件任务执行完毕后再去执行微任务,如此循环往复,生生不息。
Dart是如何实现多任务并行的?
- Flutter的多线程主要依赖Dart的并发编程、异步和事件驱动机制。
- 简单的说,在Dart中,一个Isolate对象其实就是一个isolate执行环境的引用,
- 一般来说我们都是通过当前的isolate去控制其他的isolate完成彼此之间的交互,而当我们想要创建一个新的Isolate可以使用Isolate.spawn方法获取返回的一个新的isolate对象,两个isolate之间使用SendPort相互发送消息,
- 而isolate中也存在了一个与之对应的ReceivePort接受消息用来处理,但是我们需要注意的是,ReceivePort和SendPort在每个isolate都有一对,只有同一个isolate中的ReceivePort才能接受到当前类的SendPort发送的消息并且处理。
Dart的内存分配与垃圾回收是怎么样的?
- DartVM的内存分配策略比较简单,创建对象时只需要在堆上移动指针,内存增长始终是线性的,省去了查找可用内存的过程。
- 在Dart中,并发是通过Isolate实现的。Isolate是类似于线程但不共享内存,独立运行的worker。 这样的机制,就可以让Dart实现无锁的快速分配。
- Dart的垃圾回收,则是采用了多生代算法。新生代在回收内存时采用“半空间”机制,触发垃圾回收时,Dart会将当前半空间中的“活跃”对象拷贝到备用空间,然后整体释放当前空间的所有内存。
- 回收过程中,Dart只需要操作少量的“活跃”对象,没有引用的大量“死亡”对象则被忽略,这样的回收机制很适合Flutter框架中大量Widget销毁重建的场景。
StatefulWidget 的生命周期是怎么样的?
- Flutter的Widget分为StatelessWidget和StatefulWidget两种。
- 其中,StatelessWidget是无状态,StatefulWidget是有状态的,因此实际使用时,更多的是 StatefulWidget。
- StatefulWidget的生命周期:
- 1,initState():Widget初始化当前State
- 2,didChangeDependencies():在initState()后调用,State对象依赖关系发生变化的时候也会调用
- 3,deactivate():当State被暂时从视图树中移除时会调用这个方法,页面切换时也会调用该方法
- 4,dispose():Widget销毁时调用
- 5,didUpdateWidget:Widget状态发生变化的时候调用
Dart是值传递
Flutter中存在哪四大线程?
- 分别为:UI Runner,GPU Runner,IO Runner,Platform Runner(原生主线程)
- 同时在Flutter中可以通过isolate或者compute执行真正的跨线程异步操作