备战春招的Flutter⾯试盘点:Dart模块必问+Flutter模块详解前⾔
2019年马上就结束了,⼜要到年后,跳槽的好时机,⾦三银四,很多⼩伙伴希望趁着这个机会转阵 Flutter。
“⽼许,你要⽼婆不要?只要你开⾦⼝,我待会⼉给你送来。“
哈哈,错了,⽼许,你要flutter⾯试资料不,现在就给你送来咯
先看看各⼤公司招聘的需求
⾸先来看看各个公司招聘的需求吧,毕竟⾯试题只是⼀部分。
更美APP - Flutter开发⼯程师 20-40K·14薪
岗位职责
使⽤Flutter进⾏ai sdk 应⽤研发;能够独⽴完成iOS、Android应⽤的开发⼯作;
和算法⼯程师⼀起研讨技术实现⽅案,进⾏应⽤及系统整合;
熟悉Flutter相关API及第三⽅框架;
持续对产品开发流程进⾏改进与优化,提⾼开发能⼒和效率,并能通过技术提升⽤户体验和可⽤性。
开发ar相关业务
岗位要求
能够使⽤Flutter进⾏跨平台的移动端开发;
熟悉iOS或安卓原⽣开发者优先;
有Flutter实际项⽬经验者优先。
熟悉主流AR SDK(ARKit,ARCore,Vuforia等)之⼀优先
格步科技 - Flutter开发⼯程师 20-30K
职位描述
熟悉Flutter 编程语⾔,熟练使⽤各种UI组件并进⾏UI 开发,并对Java 语⾔有⼀定的了解;
2年以上Android开发经验,熟悉Android SDK,有良好的⾯向组件编程经验,能独⽴开发Android App;
熟悉常⽤单元测试框架,具有敏锐的抽象和封装意识,熟练编写单元测试代码,保证代码质量;
有iOS、Web前端例如ReactNative或Web后端经验优先,有知名开源作品优先;
熟练使⽤Git 常⽤操作命令,并熟悉常⽤的基于Git的代码版本控制平台Github,Gitlab等;
具备较强的分析解决问题能⼒和抗压能⼒,对新技术富有好奇⼼,积极探索,快速学习并应⽤到产品中;
有良好的产品意识和风险意识,能够把控好⼯作进度,积极乐观,认真负责,善于沟通,乐于协作。
就先看两个吧,其实⼤部分招聘写的都差不多,我们可以抽出来⼏个点:
1. 了解原⽣开发,对原⽣开发有经验
2. 熟悉 Flutter 及 API
3. 有过⼀定的 Flutter 开发经验
第⼀点对于前端 web 开发同学来说可能有些难度,毕竟 Flutter 只是⼀个 UI 框架,所以还是要学习⼀些原⽣开发知识的。
第三点其实也没什么好说的,我们⾃⼰写⼏个 demo 项⽬也是可以的。
下⾯就来说第⼆点吧,也是我们这篇⽂章的重点。
⾯试题相关
Flutter 的⾯试其实和 Android ⾯试的套路差不多,也是分两个部分:
1. Dart
2. Flutter
毕竟 Flutter 要使⽤ Dart 来写,那也就必须了解 Dart 的⼀些相关知识点。
Dart 相关⾯试题
1. Dart 当中的 「…」表⽰什么意思?
Dart 当中的 「…」意思是 「级联操作符」,为了⽅便配置⽽使⽤。
「…」和「.」不同的是 调⽤「…」后返回的相当于是 this,⽽「.」返回的则是该⽅法返回的值 。
2. Dart 的作⽤域
Dart 没有 「public」「private」等关键字,默认就是公开的,私有变量使⽤ 下划线 _开头。
3. Dart 是不是单线程模型?是如何运⾏的?
Dart 是单线程模型,如何运⾏的看这张图:
reactnative开发
引⽤《Flutter中⽂⽹》⾥的话:
Dart 在单线程中是以消息循环机制来运⾏的,其中包含两个任务队列,⼀个是“微任务队列” microtask queue,另⼀个叫做“事件队列” event queue。
⼊⼝函数 main() 执⾏完后,消息循环机制便启动了。⾸先会按照先进先出的顺序逐个执⾏微任务队列中的任务,当所有微任务队列执⾏完后便开始执⾏事件队列中的任务,事件任务执⾏完毕后再去执⾏微任务,如此循环往复,⽣⽣不息。
4. Dart 多任务如何并⾏的?
刚才也说了,既然 Dart 不存在多线程,那如何进⾏多任务并⾏?
Dart 当中提供了⼀个 类似于新线程,但是不共享内存的独⽴运⾏的 worker - isolate。
那他们是如何交互的?
这⾥引⽤ 中的⼀部分答案:
在dart中,⼀个Isolate对象其实就是⼀个isolate执⾏环境的引⽤,⼀般来说我们都是通过当前的isolate去控制其他的isolate完成彼此之间的交互,⽽当我们想要创建⼀个新的Isolate可以使⽤Isolate.spawn⽅法获取返回的⼀个新的isolate对象,两个isolate之间使⽤SendPort相互发送消息,⽽isolate中也存在了⼀个与之对应的ReceivePort接受消息⽤来处理,但是我们需要注意的
是,ReceivePort和SendPort在每个isolate都有⼀对,只有同⼀个isolate中的ReceivePort才能接受到当前类的SendPort发送的消息并且处理。
5. 说⼀下 Future?
Future,字⾯意思「未来」,是⽤来处理异步的⼯具。
刚才也说过:
Dart 在单线程中是以消息循环机制来运⾏的,其中包含两个任务队列,⼀个是“微任务队列” microtask queue,另⼀个叫做“事件队列” event queue。
Future 默认情况下其实就是往「事件队列」⾥插⼊⼀个事件,当有空余时间的时候就去执⾏,当执⾏完毕后会回调 Future.then(v) ⽅法。⽽我们也可以通过使⽤ Future.microtask ⽅法来向 「微任务队列」中插⼊⼀个任务,这样就会提⾼他执⾏的效率。
因为在 Dart 每⼀个 isolate 当中,执⾏优先级为 : Main > MicroTask > EventQueue
6. 说⼀下 Stream?
Stream 和 Feature ⼀样,都是⽤来处理异步的⼯具。
但是 Stream 和 Feature 不同的地⽅是 Stream 可以接收多个异步结果,⽽Feature 只有⼀个。
Stream 的创建可以使⽤ Stream.fromFuture,也可以使⽤ StreamController 来创建和控制。
还有⼀个注意点是:普通的 Stream 只可以有⼀个订阅者,如果想要多订阅的话,要使⽤ asBroadcastStream()。
7. 说⼀下 mixin?
关于什么是 mixin,引⽤ 中的:
⾸先mixin是⼀个定义类的关键字。直译出来是混⼊,混合的意思 Dart为了⽀持多重继承,引⼊了mixin关键字,它最⼤的特殊处在于: mixin定义的类不能有构造⽅法,这样可以避免继承多个类⽽产⽣的⽗类构造⽅法冲突
Flutter 相关⾯试题
1. StatefulWidget 的⽣命周期
initState():Widget 初始化当前 State,在当前⽅法中是不能获取到 Context 的,如想获取,可以试试 Future.delayed()
didChangeDependencies():在 initState() 后调⽤,State对象依赖关系发⽣变化的时候也会调⽤。
deactivate():当 State 被暂时从视图树中移除时会调⽤这个⽅法,页⾯切换时也会调⽤该⽅法,和Android⾥的 onPause 差不多。
dispose():Widget 销毁时调⽤。
didUpdateWidget:Widget 状态发⽣变化的时候调⽤。
借⽤ ⾥的⼀张图:
2. Flutter 如何与 Android iOS 通信?
Flutter 通过 PlatformChannel 与原⽣进⾏交互,其中 PlatformChannel 分为三种:
1. BasicMessageChannel:⽤于传递字符串和半结构化的信息。
2. MethodChannel:⽤于传递⽅法调⽤。Flutter主动调⽤Native的⽅法,并获取相应的返回值。
3. EventChannel:⽤于数据流(event streams)的通信。
具体可以查看 。
3. 什么是 Widgets、RenderObjects 和 Elements?
Widget 仅⽤于存储渲染所需要的信息。
RenderObject 负责管理布局、绘制等操作。
Element 才是这颗巨⼤的控件树上的实体。
具体可以查看
4. 说⼀下什么是状态管理,为什么需要它?
⾸先状态其实是⼀个概念上的东西,区分全局状态和局部状态。
局部状态⽐如说⼀个控件中输⼊的信息,全局状态⽐如是登陆后从后台请求回来的 userId。
当全局状态越来越多,多个页⾯共享⼀个状态时,我们就需要管理它。
常⽤的状态管理有:
ScopedModel
BLoC
Redux / FishRedux
Provider
5. 说⼀下 BLoC 模式?
具体可以查看:
这⾥引⽤⼀部分:
BLoC是⼀种利⽤reactive programming⽅式构建应⽤的⽅法,这是⼀个由流构成的完全异步的世界。
6. 如何统⼀管理错误页⾯?

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。