2022年flutter口试简答题

藏宝库编辑 2024-9-29 18:21:29 119 0 来自 中国
一、Dart

1.Dart当中的「..」体现什么意思?

Dart当中的「..」意思是级联操纵符,为了方便设置而使用。链式编程,返回的是this
「..」和「.」差别,「..」返回的相称于是this,「.」返回的则是该方法的返回值
2.Dart的作用域

Dart没有public,private等关键字,默认都是公开的,私有变量使用下划线_开头
3.Dart是不是单线程模子?是怎样运行的?

Dart是单线程模子
Dart在单线程中是以消息循环机制来运行的,包罗两个使命队列,一个是“微使命队列”microtask queue,一个是变乱队列 event queue
当flutter应用启动后,消息循环机制便启动了,
起首会按照先辈先出的序次逐个实验微使命队列中的使命,
当微使命队列实验完后,便开始实验变乱队列中的使命,变乱使命实验完后在去实验微使命,
云云循环,生生不息
4. Dart是怎样实现多使命并行的

Dart是单线程,不存在多线程
Flutter的多线程紧张依靠Dart得并发编程、异步和变乱驱动机制
在Dart中、一个isolate对象实在就是一个isolate实验环境的引用,我们都是通过当前的isolate,去控制其他的isolate完成相互之间的交互,而当我们想要创建一个新的isolate可以使用isolate.spawn方法获取返回一个新的isolate对象,两个isolate直接使用sendPort相互发消息,而一个isolate中也存在一个与之对应的receivePort担当消息来处置处罚
sendPort和receivePort在每个isolate都有一对,只有同一个isolate中的receivePort才能担当到当前来的sendPort发送的消息并处置处罚
5.说一下Dart异步编程中的Future关键字

声明一个 Future 时,Dart 会将异步使命的函数实验体放入event queue,然后立即返回,后续的代码继续同步实验。
当同步实验的代码实验完毕后,event queue会按照到场event queue的序次(即声明序次),依次取失变乱,末了同步实验 Future 的函数体及后续的操纵。
默认的Future是异步运行的。假如想要我们的Future同步实验,可以通过async和await关键字:
async:用来体现函数是异步的,界说的函数会返回一个Future对象。
await:背面跟着一个Future,体现等候该异步使命完成,异步使命完成后才会继续往下实验。await只能出如今异步函数内部。可以或许让我们可以像写同步代码那样来实验异步使命而不使用回调的方式。
6.说一下Dart异步编程中的Stream数据流?

在Dart中,Stream和Future一样,都是用来处置处罚异步编程的工具。
它们的区别在于,Stream可以吸收多个异步效果,而Future只有一个
Stream的创建可以使用Stream.FromFutre,也可以使用StreamController来创建和控制。
平常的Stream只可以有一个订阅者,假如想要多个订阅的话,要使用asBroadcastStream()
7.Stream有哪两种订阅模式?分别怎么调用?

Stream有两种订阅模式:单订阅(single)和多订阅(broadcast)。单订阅就是只能有一个订阅者,而广播是可以多订阅者。有点累屎与消息服务(Message Service)的处置处罚模式。单订阅雷同于点对点,在订阅者出现之前会持有数据,在订阅者出现之后才转交给它。而广播类嘘发布订阅模式,可以同时有多个订阅者,当有数据时就会传递给全部的订阅者,不管当前是否有订阅者存在
Stream默认处于单订阅模式,以是同一个stream上的listen和其他大多数方法一样,只能调用一次,调用第二次就会报错。但stream可以通过transForm()方法( 返回另一个stream)举行一连调用。通过Stream.asBroadcasrStream(),可以将一个单订阅的Stream转换成一个多订阅模式的Stream,isBroadcast属性可以判断当前Stream所处的模式。
8.await for

await for 是不绝从stream流中获取的数据,然后实验循环体中的操纵。它一样寻常用在stream什么时间完成,而且必须等候传递完成后才能使用,否则就会一张纸壅闭
9.说一下  mixin机制

mixin是Dart2.1到场的特性,以前版本通常使用abstract class代替
为了办理继续方面的问题而引入的机制,Dart为了多重继续,引入了mixin关键字,它最大的特殊性在于:mixin界说的类不能有构造方法,如许可以避免继续多个类而产生的父类构造方法辩论
mixin的对象是类,mixins绝不是继续,也不是接口,而是一种全新的特性,可以mixins多个类,mixins的使用须要满足肯定的条件
二、Flutter

1.请简单先容一下flutter框架,以及它的优缺点

Flutter是Google推出的一套开源跨平台UI框架,可以快速地在android、iOS和web平台上构建高质量的原生用户界面。同时,flutter照旧Google新研发的Fuchsia操纵体系的默认开辟套件
在全天下,Flutter正在被越来越多的开辟者和构造使用,而且Flutter是完全免费、开源的
Flutter接纳当代相应式框架构建,此中央头脑是使用组件来构建应用的UI。当组件的状态发生改变时,组件才会重构它的形貌,Flutter会对比之前的形貌,以确定底层渲染树从当前状态切换到下一个状态所须要的最小改变
优点:
热重载,使用AS直接ctl+s就可以生存并重载,模拟器立马就可以望见效果,相比原生长期的编译过程强很多
统统皆为Widget的理念,对于Flutter来说,手机应用里的全部东西都是Widget,通过可组合的空间聚集、丰富的动画以及分层课扩展的架构实现了富有感染力的机动界面操持
借助可移植的GPU加快的渲染引擎及高性能本地化代码运行时,以到达跨平台装备的高质量用户体验
简单来说就是:最闭幕果就是使用Flutter构建的应用在运行服从上会和原生应用差不多
缺点:
不支持热更新
三方库有限
Dart语言编写,增长学习难度,而且学习了Dart之后无其他用处,相比JS和Java来说
2.先容下Flutter的理念架构

Flutter自上而下分为Embedder、Engine和Framework三层。此中Embedder是操纵体系适配层,实现了渲染Surface设置,线程设置,以及平台插件等平台相干特性的适配;Engine层负责图形绘制,笔墨排版和提供Dart运行时,Engine层具有独立假造机,正是由于它的存在,Flutter步伐才能运行在差别的平台上,实现跨平台运行;Framework层则是使用Dart编写的一套底子视图库,包罗了动画、图形绘制和手势辨认等功能,是使用频率最高的一层。
3.先容下Flutter的Framework层和Engine层,以及它们的作用

Flutter的Framework层是用Dart编写的框架(SDK),它实现了一套底子库,包罗Material(Android)和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 Graphice/Core Animation。Android自带了Skia,以是Flutter Android SDK要逼iOS SDK小很多。
4.先容下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。
5.简述Widget的StatelessWidget和StatefulWidget两种状态组件类

StatelessWidget:一旦创建就不关心任何变革,在下次构建之前都不会改变,它们除了依靠于自身的设置信息(在父节点构建时提供)外不再依靠于任何其他信息。好比典范的Text、Row、Column、Container等,都是StatelessWidget。它的生命周期相称简单:初始化、通过build()渲染。
StatefulWidget:在生命周期内,该类Widget所持有的数据大概会发生变革,如许的数据背称为State,这些拥有动态内部数据的Widget被称为StatefulWidget。鼻涕复选框、Button等。State会于Context相干联,而且此关联是永世性的,State对象将永世不会改变其Context,纵然可以在树布局附近移动,也仍将与该context相干联。当state与context关联时,state背视为已挂载。StatefulWidget由两部分组成,在初始化时必须要在create State()时初始化一个与之相干的State对象
6.StatefulWidget的生命周期

Flutter的Widget分为Stateless Widget和Stateful Widget两种。此中,StatelessWidget是无状态的,StatefulWidget时有状态的,因此现实使用时,更多的是StatefulWidget。StatefulWidget的生命周期如下


initState():Widget 初始化当前State,在当火线法中是不能获取到Context得,如想获取,可以试试Future.delayed()
didChangeDependencies():在initState()后调用,State对象依靠关系发送变革的时间也会调用。
deactivate():当State被临时从视图树移除时会调用这个方法,页面切换是也会调用该方法,和Android里的onPause差不多。
dispose():Widget烧毁时调用
didUpdateWidget:widget状态发生变革的时间调用
7。简述Widget、RenderObject和Elements的关系

Widget:仅用于存储渲染所须要的信息
RenderObject:负责管理布局、绘制等操纵
Element:才是这颗巨大的控件树上的实体
Widget会被inflate(添补)到Element,并由Element管理底层渲染树。Widget并不会直担当理状态及渲染,而是通过State这个对象来管理状态。Flutter创建Element得可见树,相对于Widget来说,是可变的,通常界面开辟中,我们不消直接操纵Eelement,而是由框架层实现内部逻辑。就如一个UI视图树中,大概包罗多个TextWidget(Widget被使用多次),但是放在内部视图树的视角,这些TextWidget都是添补到一个个独立的Element中。Element会持有renderObject和widget实例。记着,Widget只是一个设置,RenderObject负责管理布局、绘制等操纵
在第一次创建Widget的时间,会对应创建一个Element,然后将该元素插入树中。假如之后Widget发生了变革,则将其与旧的Widget举行比力,而且相应地更新Element。紧张的是,Element不会被重修,只是更新而已。
8.什么是状态管理,你相识哪些状态管理框架

Flutter中的状态和前端React中的状态概念是一致的。React框架的核心头脑就是组件化,应用由组件搭建而成,组件最紧张的改了就是状态,状态是一个组件的UI数据模子,是组件渲染仕的数据依据。
Flutter的状态可以分为全局状态和局部状态两种。常用的状态管来由ScopedModel、BLoC、Redux/FishRedux和Provider。具体使用环境和差异可以自行相识
9.简述Flutter的绘制流程

Flutter的绘制流程如下


相对于React Native、Week等跨平台框架,Flutter拥有自己的UI绘制体系,避免了React Native、Week等跨平台框架与Native体系的侨接,从而更好的提拔性能
在Flutter中,UI都是一帧一帧的绘制,但这绘制的背后都会颠末如下阶段
1.动画与微使命阶段,紧张是处置处罚动画及实验一系列微使命
2.构建阶段(build),找出标志为“脏”的节点与布局边界直接的全部节点,并做相应的更新
3.布局阶段,盘算Widget的巨细及位置简直定
4.compositingBits阶段。重绘之前的预处置处罚操纵,查抄RenderObject是否须要重绘
5.绘制阶段,根据Widget巨细及位置来绘制UI
6.compositing阶段,将UI数据发生给GPU处置处罚
7.semantics阶段,与平台的辅助功能相干
8.finalization阶段,紧张是从Element树中移除无用的Element对象及处置处罚绘制竣事回调
10.简述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运行在哪个线程,但是它须要线程在整个生命周期内里保持稳固。
11.Flutter 是怎样与原生Android、iOS举行通讯的?

Flutter 通过 PlatformChannel 与原生举行交互,此中 PlatformChannel 分为三种:
BasicMessageChannel :用于传递字符串和半布局化的信息。
MethodChannel :用于传递方法调用(method invocation)。
EventChannel : 用于数据流(event streams)的通讯。
12. 简述Flutter 的热重载

Flutter 的热重载是基于 JIT 编译模式的代码增量同步。由于 JIT 属于动态编译,可以或许将 Dart 代码编译成天生中央代码,让 Dart VM 在运行时表明实验,因此可以通过动态更新中央代码实现增量同步。
热重载的流程可以分为 5 步,包罗:扫描工程改动、增量编译、推送更新、代码归并、Widget 重修。Flutter 在吸收到代码变更后,并不会让 App 重新启动实验,而只会触发 Widget 树的重新绘制,因此可以保持改动前的状态,大大收缩了从代码修改到看到修改产生的变革之间所须要的时间。
另一方面,由于涉及到状态的生存与规复,涉及状态兼容与状态初始化的场景,热重载是无法支持的,如改动前后 Widget 状态无法兼容、全局变量与静态属性的更改、main 方法里的更改、initState 方法里的更改、枚举和泛型的更改等。
可以发现,热重载进步了调试 UI 的服从,非常得当写界面样式如许须要反复检察修改效果的场景。但由于其状态生存的机制所限,热重载自己也有一些无法支持的边界。
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-23 18:17, Processed in 0.174957 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表