# Flutter 面试题精选
覆盖
Dart、Flutter Framework、渲染、状态、并发、平台集成、性能、测试、发布、工程实战,以及Flutter/React Native/uni-app高频对比。每题均含速记、代码、详细解析和追问;核心流程可逐帧交互。
# 1. 架构与选型
# 1. Flutter 的整体架构分哪几层?各层干什么?
⚡ 30 秒速记
- 三层:
Framework(Dart)→Engine(C++)→Embedder(各平台原生代码),越往下越贴近系统 Framework内部再分:foundation→animation/painting/gestures→rendering→widgets→Material/Cupertino- 三棵树:
Widget是配置(轻、不可变、随时重建),Element是实例和身份(持有State),RenderObject管布局和绘制 build被调用 ≠ 重新布局 ≠ 重新绘制,中间有Element做比对,只有属性真变了才往下标脏- 业务代码几乎只碰
widgets及以上,自定义布局/绘制才下到rendering层
Flutter 自上而下是 Framework、Engine、Embedder 三层,业务写的 Dart 代码全在 Framework 里。 Framework 负责把你的 Widget 变成一棵渲染树,算出布局、生成绘制指令;Engine 是 C++ 写的,带着 Dart 运行时、文字排版和渲染后端(Skia 或 Impeller),把绘制指令真正变成像素;Embedder 是每个平台的壳,负责建窗口、接 vsync、转发触摸和生命周期。面试我会顺带讲三棵树:Widget 只是一份配置,重建很便宜,Element 才是真正挂在树上的身份,RenderObject 干重活,所以「频繁 build」本身不一定是性能问题。
# 先用大白话把三层讲清楚
可以把 Flutter 应用想成一个自带画笔的游戏:Framework 是游戏逻辑,决定画什么;Engine 是画笔和画布,负责真的画出来;Embedder 是游戏机的外壳,管屏幕、按键和开关机。原生 Android 的按钮是系统画的,Flutter 的按钮是 Engine 自己一笔一笔画的,系统只提供一块空白画布。
| 层 | 语言 | 主要内容 | 业务会不会碰 |
|---|---|---|---|
Framework |
Dart |
widgets、rendering、手势、动画、Material / Cupertino 组件库 |
天天碰 |
Engine |
C++ |
Dart VM、Skia / Impeller、文字排版、platform channel 的底层通道 |
基本不碰 |
Embedder |
Java/Kotlin、ObjC/Swift、C++ |
窗口/Surface、线程、vsync、输入事件、插件注册 |
写插件、混合开发时碰 |