JVM
1.Flutter Hot reload 实现原理
一、原理概述
Hot Reload 只能在 Debug 模式下使用,因为 Debug 模式下,Flutter 采用的是 JIT( 动态编译),代码是运行在 Dart VM 上,JIT 将 Dart 编译成可以运行在 Dart VM 上的 Dart Kernel,Dart Kernel 可以动态更新,所以就实现了代码的实时更新功能。
二、实现过程(Hot Reload时)
1、首先会扫描代码,找到上次编译之后有变化的Dart代码;
2、将这些变化的Dart代码转化为增量的Dart Kernel文件;
3、将增量的Dart Kernel文件发送到正在移动设备上运行的Dart VM;
4、Dart VM接着将发来的增量Dart Kernel文件和原有的Dart Kernel文件合并,然后重新加载全新的Dart Kernel文件(这时候不会重新执行代码)
5、最后通知Flutter Framework重新构建Widget(Flutter的大多数视图刷新都是因为重构了Widget,但是此时会保留Flutter的之前状态);
简要说就是 1.扫描代码 2.生成diff 3.发送设备上的虚拟机 4.内核合并 5.重构组件
2.Flutter开发框架有哪些,有什么特点?
BLoC
Provider
GetX
Provider、Bloc、GetX的使用区别和原理 - 简书
3.Flutter中setState的原理
setState是一个添加标记的过程,在下一次绘制需要组成渲染的内容时会将标记为脏的element重新渲染,之后合到场景绘制。
1.setState调用markNeedsBuild
@protected
void setState(VoidCallback fn) {
_element.markNeedsBuild();
}
2.markNeedsBuild标记为脏的 同时调用BuildOwner的scheduleBuildFor
void markNeedsBuild() {
if (!_active)
return;
if (dirty)
return;
_dirty = true;// 标记为dirty(脏的)
owner.scheduleBuildFor(this);
}
3.scheduleBuildFor将要刷新的element加入到全局的脏链表_dirtyElements
void scheduleBuildFor(Element element) {
if (element._inDirtyList) {
_dirtyElementsNeedsResorting = true;
return;
}
if (!_scheduledFlushDirtyElements && onBuildScheduled != null) {
_scheduledFlushDirtyElements = true;
onBuildScheduled();// 回调
}
_dirtyElements.add(element);// 添加到"脏"链表里
element._inDirtyList = true;
}
4.Flutter 布局和绘制关系
5.Flutter如何优化性能
- 尽量不要为 Widget 设置半透明效果,而是考虑用图片的形式代替,这样被遮挡的 Widget 部分区域就不需要绘制了;
- 控制 build 方法耗时,将 Widget 拆小,避免直接返回一个巨大的 Widget,这样 Widget 会享有更细粒度的重建和复用;
- 对列表采用懒加载而不是直接一次性创建所有的子 Widget,这样视图的初始化时间就减少了。
6.Flutter DevTools工具介绍
7.Flutter 与原生通信有几种方式
准确说有四种,其中三种是MethodChannel、EventChannel、BasicMessageChannel
MethodChannel
用于native与flutter的方法调用
EventChannel
用于native单向的向flutter发送广播消息
BasicMessageChannel
用于native与flutter之间的消息互发。
第四种是PlatformView
让Flutter可以嵌套原生View到页面中也可以看作一种"特殊的通讯方式"
8.Flutter state生命周期
didChangeDependencies
didUpdateWidget
9. StatelessWidget和StatefulWidget有什么区别?
生命周期不同,使用场景不同
1.StatelessWidget生命周期方法只有两个
createElement
build
2.StatefulWidget生命周期大致分为4个类
createState------initState------didChangeDependencies------build------didUpdateWidget(update后都会build)------deactivate(类似onPause)------dispose(类似onDestory)
1.初始化调用createState 和 initState方法
2.组件创建 调用didChangeDependencies 和build
3.触发重build调用build(状态改变)
4.暂停和销毁调用deactivate和dispose
10.Dart中如何让你的代码异步执行执行
大家都知道Dart是单线程模型,在Looper里有一个微任务队列和事件队列,在循环的时候就会先遍历微任务队列再遍历事件队列再遍历微任务队列这样循环下去...
那么要让代码一步执行只需要把代码放进微任务队列或事件队列中就行了
Dart
//微任务
scheduleMicrotask((){
//你需要执行的代码
});
//事件队列
Timer.run((){
//你需要执行的代码
});
11.Stream和Future区别
Future和Stream都是用于处理异步操作
简单来说
Future 单次异步事件 返回一次值,是不需要关闭的。直接return结果并使用then处理结果。
Stream 多次异步事件,未关闭的流是可以发射多次值的,一般都是需要关闭的。使用yield返回结果,使用await for处理结果。
(普通Stream属于单订阅流,通过Stream.asBroadcastStream()转换成广播流,广播流支持多个订阅者。)
Future适合一次性的异步操作,而Stream适合实时流式异步操作。
还有什么高频面试知识点欢迎留言!!