持续创作,加速成长!这是我参加「日新计划 10 月更文应战」的第3天,点击查看活动详情
以下首要针对往期录入的面试题进行一个分类归纳收拾,便利一致回忆和参考。本篇是第九集【完结篇】~
强调一下:别问了别问了, 面试文档要的在大众号<Android苦做舟>获取。
第一篇面试题在这: Android中高级进阶开发面试题冲刺合集(一)
第二篇在这: Android中高级进阶开发面试题冲刺合集(二)
第三篇在这: Android中高级进阶开发面试题冲刺合集(三)
第四篇在这: Android中高级进阶开发面试题冲刺合集(四)
第五篇在这: Android中高级进阶开发面试题冲刺合集(五)
第六篇在这: Android中高级进阶开发面试题冲刺合集(六)
第七篇在这: Android中高级进阶开发面试题冲刺合集(七)
第八篇在这:Android中高级进阶开发面试题冲刺合集(八)【Flutter篇】
Dart相关
1.Dart 傍边的 「..」表明什么意思?
参考答案:
“..” 和 “.” 不同:调用..
后回来的适当所以this
,而.
回来的则是该办法回来的值;
2.Dart 的作用域是怎样样的?
参考答案:
Dart没有public
和private
等关键词,默许便是揭露的,私有变量运用下划线开始;
3.dart是多线程仍是单线程履行?
参考答案:
单线程履行,多线程是运用异步来履行的;
4.堵塞式调用和非堵塞式调用是怎样样的?
参考答案:
堵塞:调用成果之前,当时线程会被挂起,调用线程只要在得到成果之后才会持续履行;
非堵塞:调用履行之后,当时线程不会中止运转,只需求过一段时刻来查看有没有成果回来即可;
5.事情循环是什么?
参考答案:
将需求处理的一系列事情,放在一个事情行列(Event Queue
)中,不断从事情行列中取出事情,并履行需求履行的代码块,直到事情被清空。
6.dart是值传递仍是引证传递?
参考答案:
dart是值传递。咱们每次调用函数,传递曩昔的都是目标的内存地址,而不是这个目标的仿制。
7.Dart 言语有哪些重要的特性?
参考答案:
- Productive(生产力高,Dart的语法明晰明晰,东西简略但功能强大)
- Fast(履行速度快,Dart供给提早优化编译,以在移动设备和Web上取得可预测的高功能和快速发动。)
- Portable(易于移植,Dart可编译成ARM和X86代码,这样Dart移动运用程序能够在iOS、Android和其他地方运转)
- Approachable(容易上手,充分吸收了高级言语特性,假如你现已知道C++,C言语,或许Java,你能够在短短几天内用Dart来开发)
- Reactive(呼应式编程)
8.Dart 言语有哪些重要的概念?
参考答案:
- 在Dart中,一切都是目标,一切的目标都是承继自
Object
- Dart是强类型言语,但能够用var或
dynamic
来声明一个变量,Dart会主动推断其数据类型,dynamic
相似c# - 没有赋初值的变量都会有默许值
null
- Dart支撑顶层办法,如
main
办法,能够在办法内部创立办法 - Dart支撑顶层变量,也支撑类变量或目标变量
- Dart没有
public
protected
private
等关键字,假如某个变量以下划线(_)开始,代表这个变量在库中是私有的
9.Dart线程模型是怎样履行的?
参考答案:
Dart 是单线程模型,运转的的流程如下图。
Dart 在单线程中是以音讯循环机制来运转的,包含两个使命行列,一个是“微使命行列” microtask queue
,另一个叫做“事情行列” event queue
。 当Flutter运用发动后,音讯循环机制便发动了。首要会依照先进先出的次序逐个履行微使命行列中的使命,当一切微使命行列履行完后便开始履行事情行列中的使命,事情使命履行完毕后再去履行微使命,如此循环往复,生生不息。
10.Dart 是怎样完结多使命并行的?
参考答案:
Dart 是单线程的,不存在多线程,那怎样进行多使命并行的呢?其实,Dart的多线程和前端的多线程有许多的相似之处。Flutter的多线程首要依靠Dart的并发编程、异步和事情驱动机制。
简略的说,在Dart中,一个Isolate
目标其实便是一个isolate
履行环境的引证,一般来说咱们都是经过当时的isolate
去控制其他的isolate
完结彼此之间的交互,而当咱们想要创立一个新的Isolate
能够运用Isolate.spawn
办法获取回来的一个新的isolate
目标,两个isolate
之间运用SendPort
彼此发送音讯,而isolate
中也存在了一个与之对应的ReceivePort
承受音讯用来处理,可是咱们需求注意的是,ReceivePort
和SendPort
在每个isolate
都有一对,只要同一个isolate
中的ReceivePort
才干承受到当时类的SendPort
发送的音讯而且处理。
11.await for 怎样运用?
参考答案:
await for
是不断获取stream
流中的数据,然后履行循环体中的操作。它一般用在直到stream
什么时分完结,而且有必要等候传递完结之后才干运用,不然就会一向堵塞。
12.Stream 有哪两种订阅形式?别离是怎样调用的?
参考答案:
单订阅(single
)和多订阅(broadcast
)。
单订阅便是只能有一个订阅者,而广播是能够有多个订阅者。这就有点相似于音讯服务(Message Service
)的处理形式。单订阅相似于点对点,在订阅者出现之前会持有数据,在订阅者出现之后就才转交给它。而广播相似于发布订阅形式,能够一同有多个订阅者,当有数据时就会传递给一切的订阅者,而不管当时是否已有订阅者存在。
Stream
默许处于单订阅形式,所以同一个 stream
上的 listen
和其它大多数办法只能调用一次,调用第二次就会报错。但 Stream
能够经过 transform()
办法(回来另一个 Stream
)进行接连调用。经过 Stream.asBroadcastStream()
能够将一个单订阅形式的 Stream
转化成一个多订阅形式的 Stream
,isBroadcast
属功能够判断当时 Stream
所在的形式。
13.dart中mixin机制是怎样样的?
参考答案:
mixin
是Dart 2.1 参加的特性,以前版别一般运用abstract class
替代。简略来说,mixin
是为了处理承继方面的问题而引进的机制,Dart为了支撑多重承继,引进了mixin
关键字,它最大的特殊处在于:mixin
界说的类不能有结构办法,这样能够避免承继多个类而发生的父类结构办法抵触。 mixins
的目标是类,mixins
绝不是承继,也不是接口,而是一种全新的特性,能够mixins
多个类,mixins
的运用需求满足一定条件。
14.JIT 与 AOT别离是什么?
参考答案:
借助于先进的东西链和编译器,Dart 是少数一同支撑 JIT(Just In Time,即时编译)和 AOT(Ahead of Time,运转前编译)的言语之一。那,到底什么是 JIT 和 AOT 呢?言语在运转之前一般都需求编译,JIT 和 AOT 则是最常见的两种编译形式。JIT 在运转时即时编译,在开发周期中运用,能够动态下发和履行代码,开发测验功率高,但运转速度和履行功能则会因为运转时即时编译受到影响。
AOT 即提早编译,能够生成被直接履行的二进制代码,运转速度快、履行功能表现好,但每次履行前都需求提早编译,开发测验功率低。
15.Dart的内存分配与废物收回是怎样样的?
参考答案:
Dart VM 的内存分配策略比较简略,创立目标时只需求在堆上移动指针,内存增加始终是线性的,省去了查找可用内存的进程。在 Dart 中,并发是经过 Isolate
完结的。Isolate
是相似于线程但不同享内存,独立运转的 worker
。这样的机制,就能够让 Dart 完结无锁的快速分配。
Dart 的废物收回,则是选用了多生代算法。新生代在收回内存时选用“半空间”机制,触发废物收回时,Dart 会将当时半空间中的“活泼”目标拷贝到备用空间,然后全体开释当时空间的一切内存。收回进程中,Dart 只需求操作少数的“活泼”目标,没有引证的许多“死亡”目标则被疏忽,这样的收回机制很合适 Flutter 结构中许多 Widget 毁掉重建的场景。
16.运用mixins的条件是什么?
参考答案:
因为mixins
运用的条件,随着Dart版别一向在变,这儿讲的是Dart2.1中运用mixins
的条件:
-
mixins
类只能承继自object mixins
类不能有结构函数 - 一个类能够
mixins
多个mixins
类 - 能够
mixins
多个类,不破坏Flutter的单承继
17.mixin 怎样指定反常类型?
参考答案:
on
关键字可用于指定反常类型。 on
只能用于被mixins
标记的类,例如mixins X on A
,意思是要mixins X
的话,得先接口完结或许承继A
。这儿A
能够是类,也能够是接口,可是在mixins
的时分用法有差异.
on
一个类:
on
的是一个接口: 得首要完结这个接口,然后再用mix
18.main future mirotask 的履行次序是怎样的?
参考答案:
一般代码都是同步履行的,结束后会开始查看microtask
中是否有使命,若有则履行,履行完持续查看microtask
,直到microtask
列队为空。终究会去履行event
行列(future
)。
19.Future和Isolate有什么差异?
参考答案:
future
是异步编程,调用本身立即回来,并在稍后的某个时分履行完结时再取得回来成果。在一般代码中能够运用await
等候一个异步调用结束。 isolate
是并发编程,Dart有并发时的同享状况,一切Dart代码都在isolate
中运转,包含开始的main()
。每个isolate
都有它自己的堆内存,意味着其间一切内存数据,包含大局数据,都仅对该isolate
可见,它们之间的通讯只能经过传递音讯的机制完结,音讯则经过端口(port
)收发。isolate
仅仅一个概念,详细取决于怎样完结,比方在Dart VM
中一个isolate
或许会是一个线程,在Web中或许会是一个Web Worker
。
20.Stream 与 Future是什么联系?
参考答案:
Stream
和 Future
是 Dart 异步处理的中心 API。Future
表明稍后取得的一个数据,一切异步的操作的回来值都用 Future
来表明。可是 Future
只能表明一次异步取得的数据。而 Stream
表明屡次异步取得的数据。比方界面上的按钮或许会被用户点击屡次,所以按钮上的点击事情(onClick
)便是一个 Stream
。简略地说,Future
将回来一个值,而Stream
将回来屡次值。Dart 中一致运用 Stream
处理异步事情流。Stream
和一般的集合相似,都是一组数据,只不过一个是异步推送,一个是同步拉取。
Flutter
1.介绍下Flutter的FrameWork层和Engine层,以及它们的作用
参考答案:
Flutter的FrameWork
层是用Dart编写的结构(SDK),它完结了一套根底库,包含Material
(Android风格UI)和Cupertino
(iOS风格)的UI界面,下面是通用的Widgets
(组件),之后是一些动画、制作、烘托、手势库等。这个纯 Dart完结的 SDK被封装为了一个叫作 dart:ui
的 Dart库。咱们在运用 Flutter写 App的时分,直接导入这个库即可运用组件等功能。 Flutter的Engine
层是Skia 2D
的绘图引擎库,其前身是一个向量绘图软件,Chrome和 Android均选用 Skia
作为绘图引擎。Skia供给了十分友爱的 API,而且在图形转化、文字烘托、位图烘托方面都供给了友爱、高效的表现。Skia是跨渠道的,所以能够被嵌入到 Flutter的 iOS SDK中,而不用去研究 iOS闭源的 Core Graphics / Core Animation
。Android自带了 Skia
,所以 Flutter Android SDK要比 iOS SDK小许多。
2.介绍下Widget、State、Context 概念
参考答案:
- Widget:在Flutter中,几乎一切东西都是
Widget
。将一个Widget
想象为一个可视化的组件(或与运用可视化方面交互的组件),当你需求构建与布局直接或直接相关的任何内容时,你正在运用Widget
。 - Widget树:
Widget
以树结构进行组织。包含其他Widget
的widget
被称为父Widget
(或widget
容器)。包含在父widget
中的widget
被称为子Widget
。 - Context:仅仅是已创立的一切
Widget
树结构中的某个Widget
的方位引证。简而言之,将context
作为widget
树的一部分,其间context
所对应的widget
被添加到此树中。一个context
只从属于一个widget
,它和widget
相同是链接在一同的,而且会形成一个context
树。 - State:界说了
StatefulWidget
实例的行为,它包含了用于”交互/干预“Widget
信息的行为和布局。运用于State
的任何更改都会强制重建Widget
。
3.介绍下StatelessWidget和StatefulWidget两种状况组件类
参考答案:
- StatelessWidget: 一旦创立就不关心任何改变,在下次构建之前都不会改变。它们除了依靠于本身的装备信息(在父节点构建时供给)外不再依靠于任何其他信息。比方典型的
Text
、Row
、Column
、Container
等,都是StatelessWidget
。它的生命周期适当简略:初始化、经过build()
烘托。 - StatefulWidget: 在生命周期内,该类
Widget
所持有的数据或许会发生改变,这样的数据被称为State
,这些具有动态内部数据的Widget被称为StatefulWidget
。比方复选框、Button
等。State
会与Context
相相关,而且此相关是永久性的,State
目标将永远不会改变其Context
,即使能够在树结构周围移动,也仍将与该context
相相关。当state
与context
相关时,state
被视为已挂载。StatefulWidget
由两部分组成,在初始化时有必要要在createState()
时初始化一个与之相关的State
目标。
4.StatefulWidget 的生命周期是怎样样的?
参考答案:
Flutter的Widget
分为StatelessWidget
和StatefulWidget
两种。其间,StatelessWidget
是无状况的,StatefulWidget
是有状况的,因此实际运用时,更多的是StatefulWidget
。StatefulWidget
的生命周期如下图:
-
initState()
:Widget
初始化当时State
,在当时办法中是不能获取到Context
的,如想获取,能够试试Future.delayed()
-
didChangeDependencies()
:在initState()
后调用,State
目标依靠联系发生改变的时分也会调用。 -
deactivate()
:当State
被暂时从视图树中移除时会调用这个办法,页面切换时也会调用该办法,和Android里的onPause
差不多。 -
dispose()
:Widget
毁掉时调用。didUpdateWidget
:Widget
状况发生改变的时分调用。
5.说下Widgets、RenderObjects 和 Elements的联系
参考答案:
首要看一下这几个目标的含义及作用。
-
Widget
:仅用于存储烘托所需求的信息。 -
RenderObject
:担任办理布局、制作等操作。 -
Element
:才是这颗巨大的控件树上的实体。
Widget
会被inflate(填充)
到Element
,并由Element
办理底层烘托树。Widget
并不会直接办理状况及烘托,而是经过State
这个目标来办理状况。Flutter创立Element
的可见树,相对于Widget
来说,是可变的,一般界面开发中,咱们不用直接操作Element
,而是由结构层完结内部逻辑。就如一个UI视图树中,或许包含有多个TextWidget
(Widget
被运用屡次),可是放在内部视图树的视角,这些TextWidget
都是填充到一个个独立的Element
中。Element
会持有renderObject
和widget
的实例。记住,Widget
仅仅一个装备,RenderObject
担任办理布局、制作等操作。 在第一次创立 Widget
的时分,会对应创立一个 Element
, 然后将该元素刺进树中。假如之后 Widget
发生了改变,则将其与旧的 Widget
进行比较,而且相应地更新 Element
。重要的是,Element
不会被重建,仅仅更新而已。
6.Flutter 是怎样与原生Android、iOS进行通讯的?
参考答案:
Flutter 经过 PlatformChannel
与原生进行交互,其间 PlatformChannel
分为三种:
-
BasicMessageChannel
:用于传递字符串和半结构化的信息。 -
MethodChannel
:用于传递办法调用。Flutter主动调用Native的办法,并获取相应的回来值。 -
EventChannel
:用于数据流(event streams
)的通讯。
关于原理:www.jianshu.com/p/39575a90e…
7.简述下Flutter 的热重载
参考答案:
Flutter 的热重载是基于 JIT 编译形式的代码增量同步。因为 JIT 属于动态编译,能够将 Dart 代码编译成生成中间代码,让 Dart VM
在运转时解说履行,因此能够经过动态更新中间代码完结增量同步。
热重载的流程能够分为 5 步,包含:扫描工程改动、增量编译、推送更新、代码兼并、Widget
重建。
Flutter 在接收到代码改变后,并不会让 App 重新发动履行,而只会触发 Widget
树的重新制作,因此能够坚持改动前的状况,大大缩短了从代码修正到看到修正发生的改变之间所需求的时刻。
另一方面,因为涉及到状况的保存与康复,涉及状况兼容与状况初始化的场景,热重载是无法支撑的,如改动前后 Widget
状况无法兼容、大局变量与静态特点的更改、main
办法里的更改、initState
办法里的更改、枚举和泛型的更改等。
能够发现,热重载提高了调试 UI 的功率,十分合适写界面样式这样需求反复查看修正作用的场景。但因为其状况保存的机制所限,热重载本身也有一些无法支撑的边界。
8.说下Flutter 和其他跨渠道计划的本质差异
参考答案:
React Native 之类的结构,仅仅经过 JavaScript 虚拟机扩展调用体系组件,由 Android 和 iOS 体系进行组件的烘托;
Flutter 则是自己完结了组件烘托的闭环。那么,Flutter 是怎样完结组件烘托的呢?这需求从图画显现的根本原理说起。在核算机体系中,图画的显现需求 CPU、GPU 和显现器一同配合完结:CPU 担任图画数据核算,GPU 担任图画数据烘托,而显现器则担任终究图画显现。CPU 把核算好的、需求显现的内容交给 GPU,由 GPU 完结烘托后放入帧缓冲区,随后视频控制器依据垂直同步信号(VSync)以每秒 60 次的速度,从帧缓冲区读取帧数据交由显现器完结图画显现。操作体系在出现图画时遵循了这种机制,而 Flutter 作为跨渠道开发结构也选用了这种底层计划。下面有一张更为详尽的示意图来解说 Flutter 的制作原理。
Flutter 制作原理能够看到,Flutter 关注怎样尽或许快地在两个硬件时钟的 VSync
信号之间核算并组成视图数据,然后经过 Skia
交给 GPU 烘托:UI 线程运用 Dart 来构建视图结构数据,这些数据会在 GPU 线程进行图层组成,随后交给 Skia
引擎加工成 GPU 数据,而这些数据会经过 OpenGL
终究供给给 GPU 烘托。
9.Widget 仅有标识Key有哪几种?
参考答案:
在flutter中,每个widget
都是被仅有标识的。这个仅有标识在build
或renderin
g阶段由结构界说。该标识对应于可选的Key
参数,假如省掉,Flutter将会主动生成一个。
在flutter中,首要有4种类型的Key
:GlobalKey
(保证生成的Key在整个运用中仅有,是很贵重的,允许element
在树周围移动或改变父节点而不会丢掉状况)、LocalKey
、UniqueKey
、ObjectKey
。
10.什么是Navigator? MaterialApp做了什么?
参考答案:
Navigator
是在Flutter中担任办理保护页面仓库的导航器。
MaterialApp
在需求的时分,会主动为咱们创立Navigator
。
Navigator.of(context)
,会运用context
来向上遍历Element
树,找到MaterialApp
供给的_NavigatorState
再调用其push/pop
办法完结导航操作。
11.Flutter动画类型有哪些?
参考答案:
-
补间动画:给定初值与终值,体系主动补齐中间帧的动画
-
物理动画:遵循物理学定律的动画,完结了弹簧、阻尼、重力三种物理作用
在运用运用进程中常见动画形式:
- 动画列表或许网格:例如元素的添加或许删去操作;
- 转场动画
Shared element transition
:例如从当时页面打开另一页面的过渡动画; - 交错动画
Staggered animations
:比方部分或许彻底交错的动画。
12.怎样一致办理错误页面?
参考答案:
在main
办法修正ErrorWidget.builder
来自界说一个属于自己的Widget
;
如:
/// 自界说报错页面
ErrorWidget.builder = (FlutterErrorDetails flutterErrorDetails) {
debugPrint(flutterErrorDetails.toString());
return new Center(child: new Text("App错误,快去反馈给作者!"));
};
13.Flutter 中存在哪四大线程?
参考答案:
Flutter 中存在四大线程,别离为 UI Runner
、GPU Runner
、IO Runner
, Platform Runner
(原生主线程) ,一同在 Flutter 中能够经过 isolate
或许 compute
履行真实的跨线程异步操作。
14.PlatformView的作用有哪些?
参考答案:
Flutter 中经过 PlatformView
能够嵌套原生 View
到 Flutter UI
中;
15.PlatformView运用了哪些东西来完结?
参考答案:
Presentation
、VirtualDisplay
、 Surface
等;
16.PlatformView大致原理是怎样样的?
参考答案:
运用了相似副屏显现的技能,VirtualDisplay
类代表一个虚拟显现器,调用 DisplayManager
的 createVirtualDisplay()
办法,将虚拟显现器的内容烘托在一个 Surface
控件上,然后将 Surface
的 id
告诉给 Dart,让 engine
制作时,在内存中找到对应的 Surface
画面内存数据,然后制作出来。 实时控件截图烘托显现技能。
17.Flutter 的 Debug 和 release 别离是在什么形式下运转的?
参考答案:
Flutter 的 Debug
下是 JIT
形式,release
下是AOT
形式。
18.Platform Channel有哪几种通讯办法?别离是用于什么操作?
参考答案:
-
BasicMessageChannel
:用于传递字符串和半结构化的信息。 -
MethodChannel
:用于传递办法调用(method invocation
)。 -
EventChannel
: 用于数据流(event streams
)的通讯。
19.RenderObject布局相关办法调用次序是怎样样的?
参考答案:
layout
-> performResize
-> performLayout
-> markNeedsPaint
, 可是用户一般不会直接调用 layout
,而是经过 markNeedsLayout
,详细流程如下:
20.RenderObject怎样使得页面重绘?流程是怎样样的?
参考答案:
RenderObject
在 attch/layout
之后会经过 markNeedsPaint();
使得页面重绘,流程大概如下:
经过isRepaintBoundary
往上确认了更新区域,经过 requestVisualUpdate
办法触发更新往下制作。
21.Flutter存在哪几棵树?他们有什么联系?
参考答案:
Flutter 中存在 Widget
、 Element
、RenderObject
、Layer
四棵树,其间 Widget
与 Element
是一对多的联系
22.简述下Flutter的线程办理模型
参考答案:
默许情况下,Flutter Engine
层会创立一个Isolate
,而且Dart代码默许就运转在这个主Isolate
上。必要时能够运用spawnUri
和spawn
两种办法来创立新的Isolate
,在Flutter中,新创立的Isolate
由Flutter进行一致的办理。 事实上,Flutter Engine
自己不创立和办理线程,Flutter Engine
线程的创立和办理是Embeder
担任的,Embeder
指的是将引擎移植到渠道的中间层代码,Flutter Engine
层的架构示意图如下图所示。
在Flutter的架构中,Embeder
供给四个Task Runner
,别离是Platform Task Runner
、UI Task Runner Thread
、GPU Task Runner
和IO Task Runner
,每个Task Runner
担任不同的使命,Flutter Engine
不在乎Task Runner
运转在哪个线程,可是它需求线程在整个生命周期里边坚持安稳。
状况办理
1.状况办理是什么?
参考答案:
程序=算法+数据结构 数据是程序的中心。数据结构和算法两个概念间的逻辑联系贯穿了整个程序国际,首要二者表现为不可分割的联系。其实Flutter不便是一个程序吗,那咱们面对的最底层的问题仍是算法和数据结构,所以咱们推导出
Flutter=算法+数据结构 那状况办理是什么?我也用公式来表达一下,如下:
Flutter状况办理=算法+数据结构+UI绑定
2.为什么需求状况办理?
参考答案:
用于处理状况更新问题,不需求WidgetState
被大局化,保证组件隐私,使得代码可扩展,易保护,能够动态替换UI而不影响算法逻辑,安全可靠,坚持数据的安稳伸缩,功能佳,部分优化;
3.说下状况办理根本分类
参考答案:
分为部分办理和大局办理;
- 部分办理:时刻短的状况,这种状况根本不需求做大局处理;
- 大局办理:即运用状况,非时刻短状况,您要在运用程序的许多部分之间同享,以及希望在用户会话之间坚持的状况,便是咱们所说的运用程序状况(有时也称为同享状况)
4.状况办理的底层逻辑一般是怎样样的?
参考答案:
-
State
:如StatefulWidget
、StreamBuilder
状况办理办法; -
InheritedWidget
专门担任Widget
树中数据同享的功能型Widget
:如Provider
、scoped_model
便是基于它开发; -
Notification
:与InheritedWidget
正好相反,InheritedWidget
是从上往下传递数据,Notification
是从下往上,但两者都在自己的Widget
树中传递,无法跨过树传递; -
Stream
数据流 :如Bloc
、flutter_redux
、fish_redux
等也都基于它来做完结;
5.状况办理的运用原则是怎样样的?
参考答案:
部分办理优于大局、坚持数据安全性、考虑页面重新build
带来的影响;
6.运用成熟状况办理库的坏处有哪些?
参考答案:
增加代码复杂性、结构bug修复需求时刻等候、不理解结构原理导致运用办法不对,反而带来更多问题、选型错误导致不符合运用要求、与团队风格抵触不适用;
进阶
1.flutter run实际走了哪三个命令?别离用于什么操作?
参考答案:
-
flutter build apk
:经过gradle
来构建APK -
adb install
:装置APK -
adb am start
:发动运用
2.setState做了哪些作业?是怎样更新UI的?
参考答案:
setState
其实是调用了 markNeedsBuild
,该办法内部标记此Element
为 Dirty
,然后在下一帧 WidgetsBinding.drawFrame
才会被制作, setState
并不是立即生效的。
3.Flutter运用发动runApp(MyApp)进程是怎样样的?
参考答案:
Flutter 中 runApp
发动入口其实是一个 WidgetsFlutterBinding
,它首要是经过 BindingBase
的子类 GestureBinding
、ServicesBinding
、 SchedulerBinding
、PaintingBinding
、SemanticsBinding
、 RendererBinding
、WidgetsBinding
等,经过 mixins
的组合而成的。
4.Dart虚拟机怎样办理的?怎样调用?怎样跟Flutter引擎交互?
参考答案:
Dart虚拟机具有自己的Isolate
,彻底由虚拟机自己办理的,Flutter引擎也无法直接访问。Dart的UI相关操作,是由Root Isolate
经过Dart的C++调用,或许是发送音讯告诉的办法,将UI烘托相关的使命提交到UIRunner
履行,这样就能够跟Flutter引擎相关模块进行交互。
5.Isolate组成部分有哪些?别离有什么作用?
参考答案:
-
isolate
堆是运该isolate
中代码分配的一切目标的GC
办理的内存存储; -
vm isolate
是一个伪isolate
,里边包含不可变目标,比方null
,true
,false
; -
isolate
堆能引证vm isolate
堆中的目标,但vm isolate
不能引证isolate
堆; -
isolate
彼此之间不能彼此引证 每个isolate
都有一个履行dart代码的Mutator thread
,一个处理虚拟机内部使命(比方GC, JIT等)的helper thread
;
6.线程和isolate的联系是什么?
参考答案:
1、同一个线程在同一时刻只能进入一个isolate
,当需求进入另一个isolate
则有必要先退出当时的isolate
;
2、一次只能有一个Mutator
线程相关对应的isolate
,Mutator
线程是履行Dart代码并运用虚拟机的公共的C言语API的线程;
7.介绍下JIT运转形式中kernel service
参考答案:
是一个辅助类isolate
,其中心作业便是CFE
,将dart转为Kernel
二进制,然后VM
可直接运用Kernel
二进制运转在主isolate
里边运转。
8.setState在哪种场景下或许会失效?
参考答案:
1、改写办法内声明的变量;
2、改写被final
修饰的变量;
9.isolate是怎样进行通讯的?实例化进程是怎样样的?
参考答案:
isolate
线程之间的通讯首要经过port
来进行,这个port
音讯传递进程是异步的。
实例化一个isolate
的进程包含:
- 1.实例化
isolate
结构体。 - 2.在堆中分配线程内存。
- 3.装备
port
等进程。
10.虚拟机怎样运转Dart代码?
参考答案:
1.源码或许Kernel
二进制(JIT
)
2.snapshot :
- AOT snapshot
- AppJIT snapshot
11.JIT运转形式中debug运转原理是怎样样的?
参考答案:
将dart代码转化为kernel
二进制和履行kernel
二进制,这两个进程也能够分离开来,在两个不同的机器履行,比方host
机器履行编译,移动设备履行kernel
文件。