1、main()和runApp()函数在flutter的作用分别是什么?有什么关系吗?
- main函数是类似于java语言的程序运行入口函数
- runApp函数是渲染根widget树的函数
- 一般情况下runApp函数会在main函数里执行
2.flutter中state生命周期与app生命周期与路由监听
flutter中state生命周期与app生命周期与路由监听_ailinghao的博客-CSDN博客_flutter didchangeapplifecyclestate
3、在flutter里streams是什么?有几种streams?有什么场景用到它?
- Stream 用来处理连续的异步操作,Stream 是一个抽象类,用于表示一系列异步数据的源。它是一种产生连续事件的方式,可以生成数据事件或者错误事件,以及流结束时的完成事件
- Stream 分单订阅流和广播流。
- 网络状态的监控
4、简单说一下在flutter里async和await?
- await的出现会把await之前和之后的代码分为两部分,await并不像字面意思所表示的程序运行到这里就阻塞了,而是立刻结束当前函数的执行并返回一个Future,函数内剩余代码通过调度异步执行。
- async是和await搭配使用的,await只在async函数中出现。在async 函数里可以没有await或者有多个await。
5、future 和steam有什么不一样?
在 Flutter 中有两种处理异步操作的方式 Future 和 Stream,Future 用于处理单个异步操作,Stream 用来处理连续的异步操作。
6、 什么是flutter里的key? 有什么用?
- key是Widgets,Elements和SemanticsNodes的标识符。
- key有LocalKey 和 GlobalKey两种。
- LocalKey 如果要修改集合中的控件的顺序或数量,分为valuekey和uniquekey;GlobalKey允许 Widget 在应用中的任何位置更改父级而不会丢失 State。
7、Flutter 是如何与原生Android、iOS进行通信的?
Flutter 通过 PlatformChannel 与原生进行交互,其中 PlatformChannel 分为三种:
- BasicMessageChannel :用于传递字符串和半结构化的信息,(双向有返回值)。
- MethodChannel :用于传递方法调用(method invocation),(双向有返回值)。
- EventChannel : 用于数据流(event streams)的通信。仅支持数据单向传递,无返回值)。
同时 Platform Channel 并非是线程安全的
flutter和原生交互_ailinghao的博客-CSDN博客_flutter 和原生交互
8、简述Flutter 的热重载
Flutter 的热重载是基于 JIT 编译模式的代码增量同步。由于 JIT 属于动态编译,能够将 Dart 代码编译成生成中间代码,让 Dart VM 在运行时解释执行,因此可以通过动态更新中间代码实现增量同步。
热重载的流程可以分为 5 步,包括:扫描工程改动、增量编译、推送更新、代码合并、Widget 重建。Flutter 在接收到代码变更后,并不会让 App 重新启动执行,而只会触发 Widget 树的重新绘制,因此可以保持改动前的状态,大大缩短了从代码修改到看到修改产生的变化之间所需要的时间。
另一方面,由于涉及到状态的保存与恢复,涉及状态兼容与状态初始化的场景,热重载是无法支持的,如改动前后 Widget 状态无法兼容、全局变量与静态属性的更改、main 方法里的更改、initState 方法里的更改、枚举和泛型的更改等。
可以发现,热重载提高了调试 UI 的效率,非常适合写界面样式这样需要反复查看修改效果的场景。但由于其状态保存的机制所限,热重载本身也有一些无法支持的边界。
9、怎么理解Isolate?
isolate是