flutter面试题

源代码 2024-9-25 06:53:33 90 0 来自 中国
一、flutter与原生通讯,三种通道的区别

1.1 MethodChannel

Flutter与Native端相互调用,调用后返回效果
可以Native端主动调用,也可以Flutter主动调用,属于双向通讯
此种方式最为常见,Native端调用必要在主线程中实行
1.2 BasicMessageChannel

用于利用指定的编解码器对消息举行编码和解码
属于双向通讯,可以以Native端主动调用,也可以Flutter主动调用
1.3 EventChannel

用于数据流(event stream)的通讯,Native端主动发送数据给Flutter
通常用于状态端监听,好比网络变革、传感器数据等
原文链接:https://blog.csdn.net/Calvin_zhou/article/details/118888030
二、flutter自定义组件,生命周期


Flutter的生命周期包罗一下几个阶段:
CreateState 该函数为StatefulWidget创建State时调用的方法,当StatefulWidget被调用时间会立刻调用此方法。
initState 该方法为State初始化调用,因此在此期间可以实行变量的初始化,还可以举行与服务端的初始化,获取到服务端数据之后调用setState方法更新组件。
didChangeDependencies 该函数是在该组件依赖的全局State发生变革的时间调用。
build 该函数重要是渲染Widget,会被调用多次,最好只做返回Widget干系的事变。
reassemble 只要是提供开辟阶段利用,只有在debug模式下热重载才会调用。可以添加一些代码来调试。
didUpdateWidget 此方法在组件重新构建,好比热更新,父组件发生Build时间调用此方法,其次此方法会导致本组件的build方法被调用。
deactivate 在组件被移除时间调用,如果组件被移除,未被插入到其他组件。那么会调用dispose永世移除。
1、initState调用次数:1次插入渲染树时调用,只调用一次,widget创建实行的第一个方法,这里可以做一些初始化工作,好比初始化State的变量。2、didChangeDependencies调用次数:多次初始化时,在initState()之后立刻调用当依赖的InheritedWidget rebuild,会触发此接口被调用实测在组件可见状态变革的时间会调用3、build调用次数:多次 初始化之后开始绘制界面setState触发的时间会 4、didUpdateWidget调用次数:多次组件状态改变时间调用5、deactivate当State对象从树中被移除时,会调用此回调,会在dispose之前调用。页面烧毁的时间会依次实行:deactivate > dispose6、dispose调用次数:1次当State对象从树中被永世移除时调用;通常在此回调中开释资源。7、reassemble在热重载(hot reload)时会被调用,此回调在Release模式下永久不会被调用原文链接:https://blog.csdn.net/yoonerloop/article/details/121003373
1.WidgetsBindingObserver

和App生命周期有关AppLifecycleState
1、resumed可见并能相应用户的输入,同安卓的onResume2、inactive 处在并不活动状态,无法处理处罚用户相应,同安卓的onPause3、paused不可见并不能相应用户的输入,但是在配景继承活动中,同安卓的onStop下面是生命周期:初次打开widget时,不实行AppLifecycleState的回调;按home键或Power键, AppLifecycleState inactive---->AppLifecycleState pause从配景到前台:AppLifecycleState inactive--->ApplifecycleState resumedback键退出应用: AppLifecycleState inactive--->AppLifecycleState paused原文链接:https://blog.csdn.net/yoonerloop/article/details/121003373</blockcode>
//初始化一些变量void onCreate() {}//onResume 只要页面切换到栈顶,都会调用此方法void onResume() {_isResume = true;_isPause = false;}//页面被覆盖,暂停void onPause() {_isResume = false;_isPause = true;}void onDestroy() {}</blockcode> LifeCycleInnerState
2.RouteAware

监听路由变革
RouteObserver 是一个共同RouteAware的一个类,通过这个类可以关照到当前页面应该实行那种生命周期方法,否则只混入RouteAware是不能实行的。别的另有RouteObserver必要注册在MaterialApp中,如许才华在导航的过程中实行到对应的生命周期方法。navigatorObservers
@overridevoid didPush() {super.didPush(); //从其他页面跳转到当前页面log("didPush");_isTop = true;}@overridevoid didPushNext() { //从当前页面跳转到下一页之后才会调用?super.didPushNext();log("didPushNext");onPause(); //在本页面实行onPause()_isTop = false;}@overridevoid didPop() { //从当前页面退回当上一页面super.didPop(); //poponPause();//在当前页实行onPause()}@overridevoid didPopNext() {super.didPopNext();//从其他页面Pop之后,进入到当前页面onResume();//在当前页面实行onResume()_isTop = true;}原文链接:https://blog.csdn.net/happiness365/article/details/122782217</blockcode>
三、flutter树结构

Widget树、Element树、RenderObject树
并不是全部的Widget都会被独立渲染!只有继承RenderObjectWidget的才会创建RenderObject对象
每一个Widget都会创建一个Element对象
隐式调用createElement方法。Element到场Element树种
它会创建三种Element
1.RenderElement重要是创建RenderObject对象继承RenderObjectWidget的Widget会创建RenderElement创建RanderElementFlutter会调用mount方法,调用createRanderObject方法2.StatefulElement继承ComponentElementStatefulWidget会创建StatefulElement调用createState方法,创建State将Widget赋值给state调用state的build方法 而且将本身(Element)传出去build内里的context就是Widget的Element!3.StatelessElement继承ComponentElementStatelessWidget会创建StatelessElement重要就是调用build方法 而且将本身(Element)传出去</blockcode> 四、flutter 状态管理,provider

状态管理就是一些变量的管理,而这些变量必要在多个路由界面中重复利用,以是就有了状态管理。
如果多个界面必要重复数据时,当这些界面频仍跳转时,没有全局状态管理,那就必要每次跳转路由界面都必要传值一次到达生存数据的目的,当有了全局状态管理,每次必要读取大概改变这些数据时,则可以调用公用方法获取或修改,因此可以大大淘汰工作量并提升应用性能
一个model类可以有多个属性,一个app可以有多个model类
全局管理类,不见得用model末端,但是我个人喜欢用model来存储数据
model类必须要继承ChangeNotifier类,否则无法革新数据
model管理的状态,只有get方法,修改他的值是通过单独的方法举行修改的,在修改后要调用notifyListeners方法
链接:https://www.jianshu.com/p/7d392f696de3
五、Future是什么

Future代表异步实行
async:在方法体前面是利用,定义该方法为一个异步方法。
await:等候并得到异步表达式的实行效果,而且给关键字只能在async修饰的方法中。
Future是单线程,先实行完全部微使命,再实行队列使命
Future修饰的关键字,会将变乱到场到队列使命中
Future怎样获取异步的值:通过then()方法 Future如那边置处罚非常:通过catchError()大概在then()中传入定名参数onError async和wait的关键的作用是什么:async声明一个异步方法,wait等候异步使命完成;简朴来讲就是同步的方式编写异步代码。 怎样捕获和处理处罚async中的非常:必要利用try/catch来捕获以及处理处罚步伐运行中的非常。原文链接:https://blog.csdn.net/mrRuby/article/details/122563629
六、UI或文本溢出

文本用TextOverflow举行溢出属性处理处罚
列表溢出,利用Wrap(//流式结构处理处罚
在text 外层包裹一个Expanded  它会将宽高设定为余下空间
1,Row报overflowed的办理办法
在要展示内容外包一层Expanded
2,Column报overflowed的办理办法
在Column外包一层SingleChildScrollView
在Scaffold下设置resizeToAvoidBottomInset : false
七、flutter性能优化

1.widget build()方法制止实行重复耗时的非须要操作
制止在widget大概state的build()方法中举行重复且耗时的非须要工作,由于当父 widget 重修时,子 widget 的 build() 方法会被频仍地调用。因此确保非须要的耗时工作不放在build()方法中。
2.控制widget setState()的重修范围
在StatefulWidget中调用setState()会引起该widget的重修,会调用state的build()方法。当一个页面只有一个StatefulWidget,把全部widget的状态都放在这个StatefulWidget,而且该StatefulWidget为页面最顶端的父widget时,setState方法会让整个页面的widget重修。因此,将一个页面中的widget举行多个StatefulWidget的状态分别,每个StatefulWidget只负责本身的状态维护,将大大缩小flutter页面绘制范围。
3.控制widget重修次数
不会改变的widget利用const,如Text、Icon、Image等,如允许以复用这部门widget,不会导致widget重修
动画利用AnimatedBuilder时,将不必要动的子widget赋值给child参数,builder方法中利用该child,可以做到复用子widget,以制止在动画过程中重修厥子女 widget。
利用CustomPaint自定义组件的时间,利用重写shouldRepaint方法,返回false即不重绘,true为重绘,我们可以根据条件返回true,淘汰自定义组件的重绘次数
4.只管制止saveLayer操作
saveLayer方法是Flutter框架中最重量的操作之一。更新屏幕时这个方法很有效,但它大概使应用变慢,如果不是必须的话,应该制止利用这个方法。即便没有显式地调用saveLayer,也大概在其他操作中央接调用了该方法。
有两个方法可以查抄页面是否利用saveLayer,
1.可以利用在MeterialApp中时利用checkerboardOffscreenLayers属性开关来查抄当前界面是否利用了saveLayer,打开开关之后,运行应用并查抄是否有图像的表面闪灼。如果有新的帧渲染的话,容器就会闪灼;
2.利用flutter screenshot --type=skia --observatory-url=这里填timeline的观察台地点,天生skp文件,再上传到https://debugger.skia.org/,就可具体分析页面中的saveLayer的调用,保举该方法,第一种方法有的saveLayer无法查抄出来。
在官网中可以看到,以下组件会触发saveLayer,应只管制止利用,探求其他代替。透明度(Opacity)、裁剪(clipping)、阴影(shadows)以及笔墨(Text)
5.利用懒加载、按需加载模子Slive
滚动列表中SingleChileScrollView不支持Slive,会直接加载整个子widget,如果滑动部门很长,请利用ListView、gridView等支持按需加载模子的列表,而且利用ListView.builder大概ListView.separated加载子项。
6.利用RepaintBoundary
利用RepaintBoundary,给页面设置重绘范围,将进步我们的性能。好比页面滑动不必要重绘动画,利用RepaintBoundary包住我们的动画widget,页面滑动将不会导致动画重绘。还可以用该widget包住我们的图片,做图片缓存,ListView内里就利用了RepaintBoundary来包住item,缓存item。
7.复用Element
element tree是flutter三棵树之一,我个人把他看成渲染树的manager,widget内部有个canUpdate方法。
原文链接:https://blog.csdn.net/weixin_42468452/article/details/120534954
八、flutter插件开辟,原生肴杂开辟

iOS用framework或pod
安卓用aar包接入
利用flutterBooost框架
办理跳转全屏flutter会出现引导页
路由问题,pod的时间将flutterBooost的监听和flutterController开释调
九、flutter网络哀求,dio优点

dio是一个强盛的Dart Http哀求库,支持Restful API、FormData、拦截器、哀求取消、Cookie管理、文件上传/下载、超时、自定义适配器等...可以说是覆盖了全部涉及到的网络哀求。
原生HttpClient发起网络哀求非常的复杂,很多东西还需本身手动处理处罚。如果涉及到上传、下载、断点续传等那肯定非常繁琐
每个 Dio 实例都可以添加恣意多个拦截器,他们构成一个队列,拦截器队列的实行序次是FIFO先辈先出原则。通过拦截器你可以在哀求之前、相应之后和发生非常时(但还没有被then或catchError处理处罚)做一些同一的预处理处罚操作。链接:https://www.liujunmin.com/flutter/dio_analysis.html
您需要登录后才可以回帖 登录 | 立即注册

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

GMT+8, 2024-10-18 18:16, Processed in 0.158021 second(s), 32 queries.© 2003-2025 cbk Team.

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