Flutter知识点整理

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 布局和绘制关系

Flutter的布局和绘制详解 ---三棵树 - 简书

5.Flutter如何优化性能

超级全面的Flutter性能优化实践 - 知乎

  • 尽量不要为 Widget 设置半透明效果,而是考虑用图片的形式代替,这样被遮挡的 Widget 部分区域就不需要绘制了;
  • 控制 build 方法耗时,将 Widget 拆小,避免直接返回一个巨大的 Widget,这样 Widget 会享有更细粒度的重建和复用;
  • 对列表采用懒加载而不是直接一次性创建所有的子 Widget,这样视图的初始化时间就减少了。
6.Flutter DevTools工具介绍

Flutter开发之Dart 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适合实时流式异步操作。

还有什么高频面试知识点欢迎留言!!

相关推荐
书弋江山4 小时前
flutter 跨平台编码库 protobuf 工具使用
android·flutter
程序员老刘·4 小时前
Flutter 3.35 更新要点解析
flutter·ai编程·跨平台开发·客户端开发
tangweiguo030519874 小时前
Flutter vs Android:页面生命周期对比详解
flutter
tangweiguo030519874 小时前
Flutter网络请求实战:Retrofit+Dio完美解决方案
flutter
来来走走6 小时前
Flutter开发 webview_flutter的基本使用
android·flutter
落魄的Android开发8 小时前
Flutter以模块化适配 HarmonyOS方案的实现步骤
flutter
tangweiguo030519878 小时前
Flutter GetX 全面指南:状态管理、路由与依赖注入的最佳实践
flutter
来来走走12 小时前
Flutter Form组件的基本使用
android·flutter
fouryears_234171 天前
Flutter InheritedWidget 详解:从生命周期到数据流动的完整解析
开发语言·flutter·客户端·dart
LinXunFeng1 天前
Flutter - 详情页 TabBar 与模块联动?秒了!
前端·flutter·开源