Flutter⾯试题
1、Dart中var 与 dynamic的区别
2、const和final的区别
3、Dart中 ?? 与 ??= 的区别
3、 什么是flutter⾥的key? 有什么⽤?
key是Widgets,Elements和SemanticsNodes的标识符。
mysql创建表的语句key有LocalKey 和 GlobalKey两种。
LocalKey 如果要修改集合中的控件的顺序或数量。GlobalKey允许 Widget 在应⽤中的 任何位置更改⽗级⽽不会丢失 State。
4、Flutter中的GlobalKey是什么,有什么作⽤
GlobalKey可以获取到对应的Widget的State对象
需求:当我们页⾯内容很多时,⽽需要改变的内容只有很少的⼀部分且在树的底层的时 候,我们如何去实现增量更新?
通常情况下有两种⽅式,第⼀种是通过⽅法的回调,去实现数据更新,第⼆种是通过GlobalKey,在StatelessWidget引⽤StatefulWidget。
4、1main()和runApp()函数在flutter的作⽤分别是什么?有什么关系吗?
* main函数是类似于java语⾔的程序运⾏⼊⼝函数
* runApp函数是渲染根widget树的函数
* ⼀般情况下runApp函数会在main函数⾥执⾏
5、什么是widget? 在flutter⾥有⼏种类型的widget?分别有什么区别?能分别说⼀下⽣命周期吗?
widget在flutter⾥基本是⼀些UI组件
有两种类型的widget,分别是statefulWidget 和 statelessWidget两种
statelessWidget不会⾃⼰重新构建⾃⼰,但是statefulWidget会
statelessWidget⽣命周期:
w3c战网平台1. 构造函数
2. build⽅法
StatefulWidget⽣命周期:
linux安装oracle数据库(rpm方式安装)1. widget的构造⽅法
2. widget的createState⽅法
3. state的构造⽅法
4. state的initState⽅法(重写该⽅法时,必须要先调⽤super. initState())
5. didChangeDependencies⽅法,分两种情况:
* 调⽤initState⽅法后,会调⽤该⽅法
* 从其他widget中依赖⼀些数据发⽣改变时,⽐如⽤InheritedWidget,provider来监听数据的改变
6. state的build⽅法(当调⽤setState⽅法,会重新调⽤build进⾏渲染)
7. state的deactivate⽅法(当state被暂时从视图移除的时候会调⽤,页⾯push⾛、pop回来的时候都会调⽤。因为push、pop会改变widget 在视图树位置,需要先移除再添加。重写该⽅法时,必须要先调⽤super.deactivate())
8. state的dispose⽅法。页⾯被销毁的时候调⽤,如:pop操作。通常情况下,⾃⼰的释放逻辑放在super.dispose()之前,先操作⼦类在操作⽗类。
5、简单说⼀下在Flutter⾥async和await?
await的出现会把await之前和之后的代码分为两部分,await并不像字⾯意思所表⽰的程序运⾏到这⾥就阻塞了,⽽是⽴刻结束当前函数的执⾏并返回⼀个Future,函数内剩余代码通过调度异步执⾏。
async是和await搭配使⽤的,await只在async函数中出现。在async 函数⾥可以没有await或者有多个await。
6、future和steam有什么不⼀样?
在 Flutter 中有两种处理异步操作的⽅式 Future 和 Stream,Future ⽤于处理单个异步操作,Stream ⽤来处理连续的异步操作。
8、flutter中Widget、Element、RenderObject、Layer都有什么关系?
⾸先看⼀下这⼏个对象的含义及作⽤。
* 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 不会被重建,只是更新⽽已。
9、简述state的⽣命周期
10、简述flutter中⾃定义View流程?
11、flutter_boost的优缺点,内部实现
12、flutter的渲染机制
Flutter只关⼼向 GPU提供视图数据,GPU的 VSync信号同步到 UI线程,UI线程使⽤ Dart来构建抽象的视图结构,这份数据结构在 GPU线程进⾏图层合成,视图数据提供给 Skia引擎渲染为 GPU数据,这些数据通过 OpenGL或者 Vulkan提供给 GPU。
13、flutter和nativi的优缺点
14、flutter⽀不⽀持 120hz
16、状态管理熟悉哪些
Flutter中的状态和前端React中的状态概念是⼀致的。React框架的核⼼思想是组件化,应⽤由组件搭建⽽成,组件最重要的概念就是状态,状态是⼀个组件的UI数据模型,是组件渲染时的数据依据。
Flutter的状态可以分为全局状态和局部状态两种。常⽤的状态管理有ScopedModel、BLoC、Redux / FishRedux和Provider。
17、多线程怎么处理web前端基础面试题
18、flutter中⼤图⽚上传
19、await for 如何使⽤
await for是不断获取stream流中的数据,然后执⾏循环体中的操作。它⼀般⽤在直到stream什么时候完成,并且必须等待传递完成之后才能使⽤,不然就会⼀直阻塞。
20、Stream有两种订阅模式
Stream ⽤来处理连续的异步操作,Stream 是⼀个抽象类,⽤于表⽰⼀系列异步数据的源。它是⼀种产⽣连续事件的⽅式,可以⽣成数据事件或者错误事件,以及流结束时的完成事件
Stream 分单订阅流和⼴播流。
⽹络状态的监控
21、flutter butild ⽅法中的 BuildContext 具体是什么东西
BuildContext底层原理实现实际上就是Element of(context)原理,其实就是通过调⽤BuildContext各种实现⽅法遍历widget tree和Element tree 从⽽获取到指定的对象来达到数据共享的⽬的
22、flutter 打包成web 移动端 桌⾯端的过程是怎么样的
23、dart是值传递还是引⽤传递
值传递
24、dart是弱引⽤还是强引⽤
强引⽤
25、get set⽅法实现
26、Flutter 是如何与原⽣Android、iOS进⾏通信的?
Flutter 通过 PlatformChannel 与原⽣进⾏交互,其中 PlatformChannel 分为三种:
* BasicMessageChannel :⽤于传递字符串和半结构化的信息。
* MethodChannel :⽤于传递⽅法调⽤(method invocation)。
* EventChannel : ⽤于数据流(event streams)的通信。
同时 Platform Channel 并⾮是线程安全的
27、简述Flutter 的热重载
Flutter 的热重载是基于 JIT 编译模式的代码增量同步。由于 JIT 属于动态编译,能够将 Dart 代码编译成⽣成中间代码,让 Dart VM 在运⾏时解释执⾏,因此可以通过动态更新中间代码实现增量同步。
热重载的流程可以分为 5 步,包括:扫描⼯程改动、增量编译、推送更新、代码合并、Widget 重建。Flutter 在接收到代码变更后,并不会让App 重新启动执⾏,⽽只会触发 Widget 树的重新绘制,因此可以保持改动前的状态,⼤⼤缩短了从代码修改到看到修改产⽣的变化之间所需要的时间。
另⼀⽅⾯,由于涉及到状态的保存与恢复,涉及状态兼容与状态初始化的场景,热重载是⽆法⽀持的,如改动前后 Widget 状态⽆法兼容、全局变量与静态属性的更改、main ⽅法⾥的更改、initState ⽅法⾥的更改、枚举和泛型的更改等。
可以发现,热重载提⾼了调试 UI 的效率,⾮常适合写界⾯样式这样需要反复查看修改效果的场景。但由于其状态保存的机制所限,热重载本⾝也有⼀些⽆法⽀持的边界。
28、怎么理解Isolate?
isolate是Dart对actor并发模式的实现。 isolate是有⾃⼰的内存和单线程控制的运⾏实体。isolate本⾝的意思是“隔离”,因为isolate之间的内存在逻辑上是隔离的。isolate中的代码是按顺序执⾏的,任何Dart程序的并发都是运⾏多个isolate的结果。因为Dart没有共享内存的并发,没有竞争的可能性所以不需要锁,也就不⽤担⼼死锁的问题
29、Dart 的作⽤域
Dart 没有 「public」「private」等关键字,默认就是公开的,私有变量使⽤下划线 _开头。
30、Dart 当中的 「..」表⽰什么意思?
Dart 当中的 「..」意思是 「级联操作符」,为了⽅便配置⽽使⽤。「..」和「.」不同的是 调⽤「..」后返回的相当于是 this,⽽「.」返回的则是该⽅法返回的值 。
31、Dart 是不是单线程模型?是如何运⾏的?
Dart 是单线程模型,运⾏的的流程如下图。
简单来说,Dart 在单线程中是以消息循环机制来运⾏的,包含两个任务队列,⼀个是“微任务队列” microtask queue,另⼀个叫做“事件队列” event queue。
当Flutter应⽤启动后,消息循环机制便启动了。⾸先会按照先进先出的顺序逐个执⾏微任务队列中的任务,当所有微任务队列执⾏完后便开始执⾏事件队列中的任务,事件任务执⾏完毕后再去执⾏微任务,如此循环往复,⽣⽣不息。
32、Dart 是如何实现多任务并⾏的?
vbs坑人代码前⾯说过, Dart 是单线程的,不存在多线程,那如何进⾏多任务并⾏的呢?其实,Dart的多线程和前端的多线程有很多的相似之处。Flutter的多线程主要依赖Dart的并发编程、异步和事件驱动机制。
简单的说,在Dart中,⼀个Isolate对象其实就是⼀个isolate执⾏环境的引⽤,⼀般来说我们都是通过当前的isolate去控制其他的isolate完成彼此之间的交互,⽽当我们想要创建⼀个新的Isolate可以使⽤Isolate.spawn⽅法获取返回的⼀个新的isolate对象,两个isolate之间使⽤SendPort相互发送消息,⽽isolate中也存在了⼀个与之对应的ReceivePort接受消息⽤来处理,但是我们需要注意的是,ReceivePort和SendPort在每个isolate都有⼀对,只有同⼀个isolate中的ReceivePort才能接受到当前类的SendPort发送的消息并且处理。
33、说⼀下Dart异步编程中的 Future关键字?
前⾯说过,Dart 在单线程中是以消息循环机制来运⾏的,其中包含两个任务队列,⼀个是“微任务队列” microtask queue,另⼀个叫做“事件队列” event queue。
在Java并发编程开发中,经常会使⽤Future来处理异步或者延迟处理任务等操作。⽽在Dart中,执⾏⼀个异步任务同样也可以使⽤Future来处理。在 Dart 的每⼀个 Isolate 当中,执⾏的优先级为 : Main > MicroTask > EventQueue。
34、说⼀下 mixin机制?
mixin 是Dart 2.1 加⼊的特性,以前版本通常使⽤abstract class代替。简单来说,mixin是为了解决继承⽅⾯的问题⽽引⼊的机制,Dart为了
⽀持多重继承,引⼊了mixin关键字,它最⼤的特殊处在于: mixin定义的类不能有构造⽅法,这样可以避免继承多个类⽽产⽣的⽗类构造⽅法冲突。
mixins的对象是类,mixins绝不是继承,也不是接⼝,⽽是⼀种全新的特性,可以mixins多个类,mixins的使⽤需要满⾜⼀定条件。
35、介绍下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⼩很多。
36、简述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运⾏在哪个线程,但是它需要线程在整个⽣命周期⾥⾯保持稳定。
数据库培训的目的和要求37、介绍下Flutter的理念架构
由上图可知,Flutter框架⾃下⽽上分为Embedder、Engine和Framework三层。其中,Embedder是操作系统适配层,实现了渲染 Surface设置,线程设置,以及平台插件等平台相关特性的适配;Engine层负责图形绘制、⽂字排版和提供Dart运⾏时,Engine层具有独⽴虚拟机,正是由于它的存在,Flutter程序才能运⾏在不同的平台上,实现跨平台运⾏;Framework层则是使⽤Dart编写的⼀套基础视图库,包含了动画、图形绘制和⼿势识别等功能,是使⽤频率最⾼的⼀层。
38. Future和Isolate有什么区别?
future是异步编程,调⽤本⾝⽴即返回,并在稍后的某个时候执⾏完成时再获得返回结果。在普通代码中可以使⽤await 等待⼀个异步调⽤结束。
isolate是并发编程,Dartm有并发时的共享状态,所有Dart代码都在isolate中运⾏,包括最初的main()。每个isolate都有它⾃⼰的堆内存,意味着其中所有内存数据,包括全局数据,都仅对该isolate
可见,它们之间的通信只能通过传递消息的机制完成,消息则通过端⼝(port)收发。isolate只是⼀个概念,具体取决于如何实现,⽐如在Dart VM中⼀个isolate可能会是⼀个线程,在Web中可能会是⼀个Web Worker。
39、什么是Navigator? MaterialApp做了什么?
Navigator是在Flutter中负责管理维护页⾯堆栈的导航器。MaterialApp在需要的时候,会⾃动为我们创建Navigator。
Navigator.of(context),会使⽤context来向上遍历Element树,到MaterialApp提供的_NavigatorState再调⽤其push/pop⽅法完成导航操作。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论