Flutter面试题——面试题整理7
一 面试题汇总
- 你能提供一下 SOLID 原则的概述吗?
- Dart 中 Object、dynamic 和 var 有何不同?
- 什么是 Dart 中 cascade 级联和 extension 扩展运算?
- mixin 混入和 interface 接口在 Dart 中有何不同?
- Dart 中的空安全是什么?
- 你能解释 Dart 中的 Isolate、Event Loop 和 Future 的概念吗?
- Flutter 无状态和有状态小部件之间有什么区别,以及 setState() 的作用是什么?
- Flutter InheritedWidget 是什么?
- 你能解释一下在 Flutter 中 keys 键的作用吗?
- 在 Flutter 中,Keys(键)有哪几种类型?
二 面试题解答(仅供参考)
2.1 你能提供一下 SOLID 原则的概述吗?
1 | SOLID 原则是面向对象编程中一组设计原则,旨在帮助开发者编写可维护、可扩展、高质量的代码。 |
2.2 Dart 中 Object、dynamic 和 var 有何不同?
1 | 在 Dart 中,Object、dynamic 和 var 都涉及到类型的定义,但它们在类型检查和赋值时有着不同的行为和用途。 |
总结
类型 | 定义 | 类型检查 | 特点 |
---|---|---|---|
Object | 所有类的基类,可以存储任何类型的对象 | 可以存储任何类型的对象,但只能调用 Object 的方法。 |
类型固定,无法直接调用其他类特有的方法,需类型转换。 |
dynamic | 完全动态类型,可以存储任何类型的值,并且没有编译时类型检查。 | 没有编译时类型检查,类型检查在运行时进行。 | 允许任意类型,且没有类型安全,容易导致运行时错误。 |
var | 类型由右侧赋值推导确定,一旦确定后不可更改 | 类型由赋值推导,且不允许改变类型。 | 类型自动推导,确保类型安全,但类型固定。 |
2.3 什么是 Dart 中 cascade 级联和 extension 扩展运算?
1 | 在 Dart 中,cascade(级联) 和 extension(扩展) 是两个用于提高代码可读性和简洁性的特性。 |
总结
特性 | 定义 | 用途 | 示例 |
---|---|---|---|
Cascade | 使用 .. 运算符在同一对象上连续调用方法或设置属性 |
提高代码简洁性,减少重复引用对象 | person..sayHello()..haveBirthday()..name = 'Jane'; |
Extension | 使用 extension 为现有类添加方法、属性等,而不修改原类代码 |
扩展现有类的功能,符合开放/封闭原则 | extension StringReversal on String { String get reverse {...} } |
2.4 mixin 混入和 interface 接口在 Dart 中有何不同?
1 | 在 Dart 中,mixin(混入) 和 interface(接口) 都用于实现类之间的复用和功能共享, |
总结
特性 | mixin(混入) | interface(接口) |
---|---|---|
定义 | 用于类之间共享代码的机制,可以在多个类中混入功能。 | 用于定义类应该遵循的行为规范,强制实现类提供方法实现。 |
继承 | 可以通过 with 关键字混入多个类 |
使用 implements 关键字实现接口,强制实现所有方法。 |
方法实现 | 可以包含方法的实现(有具体代码)。 | 只包含方法签名,没有具体的实现(必须由实现类提供实现)。 |
多重继承 | 支持多重混入,可以在一个类中混入多个 mixin。 | 一个类只能实现多个接口,但不能继承多个接口的实现。 |
实例化 | 不能实例化 mixin 类,只能通过 with 关键字混入 |
接口不能被实例化,但可以用作实现类的类型检查。 |
2.5 Dart 中的空安全是什么?
1 | Dart 中的空安全(Null Safety) 是 Dart 2.12 引入的特性, |
2.6 你能解释 Dart 中的 Isolate、Event Loop 和 Future 的概念吗?
1 | 在 Dart 中,Isolate、Event Loop 和 Future 是处理并发、异步操作和事件循环的核心概念。 |
总结
概念 | 定义 | 特点 | 使用场景 |
---|---|---|---|
Isolate | 独立的执行单元,拥有自己的内存空间和事件队列,适合并行执行任务。 | 不共享内存、通过消息传递通信、可并行执行任务。 | 适用于并发计算密集型任务,避免 UI 阻塞。 |
Event Loop | 负责管理和调度异步操作的循环机制。 | 异步任务放入事件队列,按顺序执行。 | 异步任务放入事件队列,按顺序执行。 |
Future | 表示一个异步操作的结果,表示未来某个时间会获得一个结果或错误。 | 提供 then 、catchError 等方法处理异步结果。 |
适用于处理异步操作,如 I/O、网络请求、延时操作等。 |
2.7 Flutter 无状态和有状态小部件之间有什么区别,以及 setState() 的作用是什么?
1 | 在Flutter中,StatelessWidget(无状态小部件)和StatefulWidget(有状态小部件)是两种基本的Widget类型,它们之间有很大的区别。 |
总结
特性 | StatelessWidget(无状态小部件) | StatefulWidget(有状态小部件) |
---|---|---|
状态 | 不持有状态,UI 基于外部传入的数据而构建。 | 持有状态,UI 根据内部状态的变化进行更新。 |
可变性 | 不会随着时间变化而改变。 | 可以根据状态变化进行重建,UI 会动态更新。 |
构建方法 | build() 方法只依赖构造函数中的数据。 |
build() 方法依赖状态管理,并通过 setState() 来触发更新。 |
性能 | 性能较高,因为不需要重建 UI。 | 性能相对较低,需要通过 setState() 重建 UI。 |
使用场景 | 适用于静态的、不可变的 UI 组件,如显示信息、无交互的组件。 | 适用于需要根据用户操作或外部事件动态更新的 UI 组件。 |
2.8 Flutter InheritedWidget 是什么?
1 | Flutter 中的 InheritedWidget 是一种特殊的 Widget,用于在 Widget 树中向下传递数据。 |
2.9 你能解释一下在 Flutter 中 keys 键的作用吗?
1 | 在 Flutter 中,Key 是一个非常重要的概念,用于标识和区分不同的 Widget 或者 Widget 的状态。 |
2.10 在 Flutter 中,Keys(键)有哪几种类型?
1 | Flutter 中有几种常见的 Key 类型,每种类型的使用场景有所不同 |
总结
Key 类型 | 描述 | 适用场景 |
---|---|---|
GlobalKey | 用于跨多个 Widget 树访问状态,能够全局访问 Widget 和其状态。 | 表单、Scaffold、导航等跨界面状态管理。 |
ValueKey | 基于值来判断 Widget 是否相等。 | 根据数据值(如 ID、字符串)区分 Widget |
ObjectKey | 基于对象引用来判断 Widget 是否相等。 | 对象状态管理,如列表中的对象。 |
UniqueKey | 每次创建一个新的、唯一的 Key。 | 需要确保 Widget 唯一性的场景。 |
三 参考
- 狗哥课堂—Flutter 面试题整理 02