Flutter 日常基础面试题分享(二)

262 阅读8分钟

一、请简单介绍下Flutter框架,以及它的优缺点

优点:

  • 跨平台性:可使用同一份代码部署到iOS、Android、Web和桌面等多个平台,降低了开发成本和时间。

  • 性能强大:拥有高效的渲染引擎和优化的底层实现,能够提供流畅的用户体验和接近原生应用的性能。

  • 丰富的组件库:提供了丰富的Material DesignCupertino组件,同时支持自定义组件样式和行为。

  • 热重载功能:开发过程中,支持热重载功能,可以在不重启应用的情况下即时看到代码更改的效果,提高开发效率。

缺点:

  • 适配问题:随着操作系统和Flutter框架的不断更新,开发者可能需要修改大量的代码以适应新的版本和特性

  • 代码可读性较差:代码可读性相对较差,特别是对于不熟悉Dart语言和Flutter框架的开发者来说,可能需要花费更多的时间来理解和维护代码。

  • 打包后文件较大:由于Flutter应用包含了自己的渲染引擎和框架代码,因此打包后的应用文件相对较大,可能会影响应用的下载和安装速度。

二、Flutter run操作实际走了哪几个命令?分别用于什么操作?

  • flutter build apk: 通过gradle来构建APK
  • adb install: 安装APK
  • adb am start: 启动应用

三、Flutter的编译方式

Flutter在Debug和Relase执行不同的编译模式:

  • 开发阶段: 使用即时编译JIT(Just In Time),可以动态下发和执行代码,开发测试效率高,但是运行速度和性能则会受到影响,Flutter中的热重载正是基于此特性。

  • 发布时期: 使用静态编译AOT(Ahead of Time),是指程序在执行前全部被翻译为机器码,提前编译,就不需要像RN那样在跨平台JavaScript代码和原生Android、iOS代码间建立低效的方法调用映射关系。

四、Widget 唯一标识Key有哪几种?

LocalKey和GlobalKey:

LocalKey:应用于具有相同父Element的Widget进行比较,也是diff算法的核心所在。

LocalKey是Key的基类,分为:ValueKey 和 ObjectKey,用于在局部 Widget 树中唯一标识某个 Widget。

LocalKey还有三个子类:

  • ValueKey 使用具体的值(如字符串、数字)作为键,通常用于标识列表项等。
  • ObjectKey 使用某个对象作为键,适用于需要通过对象标识的场景。
  • UniqueKey 想要确保key的唯一性,可以使用UniqueKey

GlobalKey通常我们会使用GlobalKey某个Widget对应的Widget或State或Element

  • GlobalKey 是一个全局唯一的键,用于标识整个应用中的特定 Widget。
  • 它可以跨越 Widget 树的多个层次来访问 Widget,并提供更强的控制和状态管理。

key的作用:

  • 主要决定是否要刷新widget,这是因为修改了key之后,Element会强制刷新,那么对应的State也会重新创建。

  • Key本身是一个抽象,不过它也有一个工厂构造器,创建出来一个ValueKey

五、FlutterBoost是单页面模式还是多页面模式?

  • FlutterBoost1.0版本中,它主要是单页面模式,即不管你打开多少Flutter页面,其实呈现页面的FlutterViewController或者FlutterView其实仅有一个。这种模式是出于节省内存的考虑,但也可能导致一些问题,如页面切换时的白屏或黑屏问题,以及页面生命周期管理的复杂性。

  • FlutterBoost的新版本中,它不再维护单一的FlutterViewController(或FlutterView),而是和原生一样,每次有新页面请求时就直接打开新的ViewController或者FlutterView。这样,每个Flutter页面都可以有自己的生命周期管理,解决了之前单页面模式下的一些问题。

六、Flutter 3.0相对于2.0有哪些优化?

6.1、全平台支持增强

  • 新增平台支持:Flutter 3.0进一步强化了对各种平台的支持,不仅仅是移动平台(iOS和Android),还包括Web、Windows、MacOS和Linux。这意味着开发者可以使用同一套代码基础为几乎所有主流平台构建应用,大大提高了开发效率并减少了维护成本。

6.2、性能提升

  • 渲染性能优化:Flutter 3.0在渲染性能上进行了多项优化,使得用Flutter开发的应用能够更加流畅地运行,提升用户体验。
  • 应用启动时间缩短:通过优化启动流程和减少不必要的资源加载,Flutter 3.0显著缩短了应用的启动时间。

6.3、组件更新与改进

  • 新组件与改进:Flutter 3.0引入了多个新的组件和对现有组件的改进,这些组件使得创建复杂和功能丰富的用户界面变得更加简单。例如,新的导航和滚动组件提供了更多的灵活性和更好的性能。

6.4、开发工具增强

  • Dart DevTools增强:Flutter 3.0对Dart DevTools进行了增强,使得调试和分析Flutter应用更加容易。
  • IDE支持增强:集成开发环境(IDE)的支持也得到了增强,提供了更多的代码完成和分析功能,帮助开发者提高开发效率。

七、Flutter怎么适配屏幕?

7.1、普通手机

  • 使用自适应布局,Flutter提供了丰富的布局Widget,如RowColumnFlexGrid
  • flutter_screenutil是一个流行的Flutter插件,用于调整屏幕和字体大小
  • 自定义适配类,可以定义一个AdaptiveScreen类,该类包含获取屏幕宽度、高度和像素比的方法,以及根据设计稿尺寸计算UI元素尺寸的方法。

7.2、折叠屏适配

  • 三种形态适配:折叠屏设备通常有展开大屏、折叠主屏和折叠副屏三种形态。开发者需要针对这三种形态分别进行适配,确保应用在每种形态下都能正确显示。
  • 动态热切换适配:当折叠屏设备从一种形态切换到另一种形态时,应用需要能够实时感知并调整布局。Flutter提供了相关的API,如MediaQuery中的DisplayFeatures列表,用于描述显示部件的边界和状态,如铰链、折叠和刘海。

7.3、大屏幕适配

  • 高分辨率与宽高比:大屏幕设备通常具有更高的分辨率和更宽的宽高比。开发者需要确保应用能够充分利用这些额外的屏幕空间,同时保持UI元素的清晰度和可读性。
  • 布局重构:对于大屏幕设备,可能需要重新设计布局以适应更大的屏幕。例如,可以使用Grid布局或自定义布局来更好地利用屏幕空间。

八、Android/iOS+Flutter混合开发,单引擎和多引擎方案如何选择?

单引擎方案

单引擎方案指的是在整个应用中,只使用一个FlutterEngine来渲染所有的Flutter页面。

FlutterBoost单引擎方案

优点:

  • 内存占用小: 由于只有一个FlutterEngine,因此可以节省内存资源。
  • 插件通道管理方便: 所有的Flutter页面都共享同一个FlutterEngine,因此插件通道也只需要管理一套。

缺点:

  • 页面动态性不足: 如果页面在跳转期间有变动或更新,由于采用截图方式(在某些实现中),可能会导致页面闪烁或延迟。
  • 页面跳转可能有延迟: 由于需要在新页面打开之前进行截图,且截图过程可能耗时,因此会影响页面跳转的流畅性。

适用场景:

适用于整个应用都采用Flutter开发,且Flutter内部页面采用Flutter路由跳转的情况。

多引擎方案

多引擎方案指的是在应用中,使用多个FlutterEngine来渲染不同的Flutter页面。

 FlutterEngineGroup多引擎方案

优点:

  • 页面跳转响应速度快:由于采用不同的FlutterEngine交替渲染页面,因此页面跳转过程中无需对页面进行截图处理,从而提高了跳转速度。
  • 支持页面的动态变化:每个显示在屏幕上的可见视图都是实际的FlutterView,因此页面的更新也是即时的。

缺点:

  • 插件管理相对复杂:  每个FlutterEngine都有单独的插件通道,因此需要协调不同插件在不同FlutterEngine上的调用。
  • 内存占用可能较大:由于使用了多个FlutterEngine,因此会占用更多的内存资源。

适用场景:

适用于需要在应用中嵌入多个独立的Flutter模块,或者需要实现复杂的页面跳转和动态更新的情

更多分享

  1. Flutter 日常基础面试题分享(一)
  2. Dart编程语言·中文文档
  3. Flutter中文开发者社区
  4. Flutter实战·第二版