Flutter面试题

1.说说Flutter中的生命周期

  • initState():Widget 初始化当前 State
  • didChangeDependencies() 在 initState() 之后调用,当 State 对象的依赖关系发生变化时,该方法被调用,初始化时也会调用。
  • deactivate() 当 State 被暂时从视图树中移除时,会调用这个方法,同时页面切换时,也会调用。(已经消失在新版本中)
  • dispose() Widget 销毁了,在调用这个方法之前,总会先调用 deactivate()。
  • didUpdateWidge 当 widget 状态发生变化时,会调用。

2.有了解过Flutter的一些状态管理框架吗? 用过哪些状态管理框架?

Provider

Redux

MobX

BLoC

GetX

3.谈谈Flutter中的future、async 和 await

Dart 中可通过 async/await 或者 Future 定义异步操作

Future对象表示异步操作的结果,我们通常通过then()来处理返回的结果

async用于标明函数是一个异步函数,其返回值类型是Future类型

await用来等待耗时操作的返回结果,这个操作会阻塞到后面的代码

4.Dart异步编程中的 Stream数据流? Stream 有哪两种订阅模式? 分别是怎么调用的?

在Dart中,Stream 和 Future 一样,都是用来处理异步编程的工具。Stream可以接收多个异步结果,而Future 只有一个。

Stream有两种订阅模式:单订阅(single) 和多订阅(broadcast)。

Stream 默认处于单订阅模式,通过 transform() 方法(返回另一个 Stream)进行连续调用。通过Stream.asBroadcastStream() 可以将一个单订阅模式的 Stream 转换成一个多订阅模式的

Stream,isBroadcast 属性可以判断当前 Stream 所处的模式。

5.Dart 是如何实现多任务并行的? Dart是单线程还是多线程的?

Flutter的多线程主要依赖Dart的并发编程、异步和事件驱动机制。

在Dart中,一个Isolate对象其实就是一个isolate执行环境的引用,一般来说我们都是通过当前的isolate去控制其他的isolate完成彼此之间的交互,而当我们想要创建一个新的Isolate可以使用Isolate.spawn方法获取返回的一个新的isolate对象,两个isolate之间使用SendPort相互发送消息,而isolate中也存在了一个与之对应的ReceivePort接受消息用来处理,但是我们需要注意的是,ReceivePort和SendPort在每个isolate都有一对,只有同一个isolate中的ReceivePort才能接受到当前类的SendPort发送的消息并且处理。

是单线程

6.Flutter中Widget,Element和RenderObiect之间的关系,

Widget :仅用于存储渲染所需要的信息。

RenderObject :负责管理布局、绘制等操作。

Element是这颗巨大的控件树上的实体。

Widget和Element是一对多的关系,Element和RenderObiect是一对一的关系。

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 不会被重建,只是更新而已。

7.Flutter 是如何与原生Android、iOS进行通信的?

Flutter 通过 PlatformChannel 与原生进行交互,其中 PlatformChannel 分为三种:

BasicMessageChannel :用于传递字符串和半结构化的信息。

MethodChannel :用于传递方法调用(methodinvocation)。

EventChannel : 用于数据流(event streams)的通信。

8.Flutter 中是如何分发使用手势事件的?(不知道正确答案是啥。。。。。)

Flutter的事件分发总体也由手势触发、拦截和响应等几个部分构成。

事件分发到Dart的入口类是GestureBinding类,此类位于gestures/binding.dart文件中,与手势识别相关的都位于gestures包中

相关推荐
2501_9209317019 小时前
React Native鸿蒙跨平台采用ScrollView的horizontal属性实现横向滚动实现特色游戏轮播和分类导航
javascript·react native·react.js·游戏·ecmascript·harmonyos
0思必得021 小时前
[Web自动化] Selenium处理动态网页
前端·爬虫·python·selenium·自动化
向哆哆21 小时前
打造高校四六级报名管理系统:基于 Flutter × OpenHarmony 的跨端开发实践
flutter·开源·鸿蒙·openharmony·开源鸿蒙
2501_9400078921 小时前
Flutter for OpenHarmony三国杀攻略App实战 - 设置功能实现
flutter
东东51621 小时前
智能社区管理系统的设计与实现ssm+vue
前端·javascript·vue.js·毕业设计·毕设
catino21 小时前
图片、文件的预览
前端·javascript
lbb 小魔仙1 天前
【Harmonyos】开源鸿蒙跨平台训练营DAY9:获取分类数据并渲染
flutter·华为·harmonyos
mocoding1 天前
Flutter 3D 翻转动画flip_card三方库在鸿蒙版天气预报卡片中的实战教程
flutter·3d·harmonyos
2501_920931701 天前
React Native鸿蒙跨平台实现推箱子游戏,完成玩家移动与箱子推动,当所有箱子都被推到目标位置时,玩家获胜
javascript·react native·react.js·游戏·ecmascript·harmonyos
layman05281 天前
webpack5 css-loader:从基础到原理
前端·css·webpack