Flutter 相关面试题整理 更新中
从互联网整理而来 一、Dart 基础 Dart 的数据类型有哪些? var、final、const 的区别 Dart 中 null safety 是什么,如何使用? late 关键字作用与使用场景 Dart 函数可选参数、命名参数、位置参数区别 箭头函数适用范围 Dart 异步:Future、async/await 原理 Stream 与 Future 区别,StreamController 使用 sync*、async*、yield、yield each 作用 Dart 类中 extends、implements、mixin 区别 mixin 有什么限制,能否构造函数传参 抽象类与接口区别 泛型 T、?T、T?、required T 区别 Dart 单例几种实现方式 工厂构造函数 factory 作用 常量构造函数使用条件 级联运算符 .. 原理 空值操作符 ?.、??、??= 用法 Dart 枚举进阶用法,能否自定义属性方法 Isolate 是什么,和线程区别,通信方式 Isolate 共享内存吗,数据传递限制 Zone 作用是什么 Dart 垃圾回收机制 函数一等公民体现在哪里 typedef 作用与场景 二、Flutter 框架核心原理 Flutter 三棵树:Widget、Element、RenderTree 关系 StatelessWidget 和 StatefulWidget 底层差异 State 生命周期完整流程 initState、didChangeDependencies、build、didUpdateWidget、dispose 执行时机 setState 底层更新机制 Widget 为什么是不可变的 immutable Element 作用,Element 复用逻辑 RenderObject 职责是什么 Key 的作用,几种 Key 区别(ValueKey、ObjectKey、UniqueKey、GlobalKey) GlobalKey 使用场景与隐患 LocalKey 解决什么问题 Widget 重建流程,哪些情况会触发重建 什么是 const Widget,好处是什么 Flutter 渲染流程:布局、绘制、合成步骤 布局约束流程:Constraints 传递规则 父布局约束如何限制子控件尺寸 RepaintBoundary 作用,何时使用 Layer 树作用,缓存机制 Flutter 与原生 Android/iOS 渲染区别 Skia 引擎作用 Impeller 渲染引擎对比 Skia 优势 Flutter 绘制原理,Canvas、Paint 流程 PipelineOwner 作用 WidgetsBinding、SchedulerBinding 职责 帧调度流程:Vsync、帧回调执行顺序 transientCallbacks、persistentCallbacks、postFrameCallbacks 区别 Flutter 热重载原理,热重启区别 编译模式:debug/profile/release 差异 AOT、JIT 编译区别 Flutter 页面路由底层实现原理 三、布局 & 基础组件 Row Column Flex 布局区别,主轴交叉轴概念 MainAxisAlignment、CrossAxisAlignment 所有枚举值含义 Expanded、Flexible 区别,flex 参数作用 Stack、Positioned 布局规则 Align、Center 底层关系 Padding、Container 内部结构 Container 嵌套过多有什么性能问题 SizedBox、ConstrainedBox、UnconstrainedBox 用途 AspectRatio、FittedBox 缩放逻辑 Wrap 自动换行实现原理 ListView 几种构造方式区别(默认、builder、separated) ListView.builder 高性能原理,复用机制 ListView 滚动复用失效场景 GridView 使用与性能优化 SingleChildScrollView 嵌套 ListView 报错解决方案 CustomScrollView、Sliver 体系是什么 SliverList、SliverGrid、SliverAppBar、SliverToBoxAdapter 使用场景 SliverPersistentHeader 固定吸顶实现 CustomScrollView 滚动统一原理 Table、DataTable 布局特性 IntrinsicHeight、IntrinsicWidth 性能损耗原因 LayoutBuilder 获取父布局约束场景 MediaQuery 获取设备信息,MediaQuery.of(context) 刷新机制 LayoutId、MultiChildLayout 自定义布局 Flow 高性能流式布局适用场景 四、状态管理 State 自身状态管理优缺点 InheritedWidget 底层原理,数据传递逻辑 InheritedModel 对比 InheritedWidget 优势 Provider 整套库实现原理(ChangeNotifierProvider、Consumer、Selector) Selector 为什么能精准局部刷新 ChangeNotifier 通知更新机制 StateProvider、FutureProvider、StreamProvider 区别 Riverpod 对比 Provider 改进点 Riverpod 全局状态、自动 dispose、无 context 优势 StateNotifier、AsyncNotifier 使用场景 Bloc 核心概念:Event、State、Bloc/Cubit Cubit 与 Bloc 区别 BlocProvider、BlocConsumer、BlocBuilder、BlocListener 分工 Bloc 状态单一数据源优势 GetX 状态管理原理,GetController 生命周期 GetX 全局路由、依赖注入实现 GetX 优缺点,存在什么性能隐患 Redux 在 Flutter 中使用逻辑 MobX 响应式原理,Observable、Action、Reaction 大型项目如何选型状态管理方案 跨页面共享状态几种实现方式对比 状态持久化配合状态管理怎么做 五、路由 & 导航 Navigator 1.0 路由栈管理原理 MaterialPageRoute、CupertinoPageRoute 区别 PageRouteBuilder 自定义转场动画 Navigator push/pop/pushReplacement/popUntil 逻辑 路由传参几种方式 Navigator 2.0 核心组件:Router、RouteInformationParser、RouterDelegate Navigator 2.0 完整路由流程 GoRouter 框架底层封装逻辑 GoRouter 嵌套路由、路由守卫、参数获取 路由栈持久化、页面状态保存方案 底部导航多 Tab 页面状态保持实现 路由拦截、登录鉴权统一处理 原生页面与 Flutter 页面互相跳转路由处理 页面返回监听 WillPopScope、PopScope 深度链接 deep link 适配方案 六、动画 Flutter 动画核心类:Animation、AnimationController、CurvedAnimation AnimationController vsync 作用,为什么需要 TickerProvider SingleTickerProviderStateMixin、TickerProviderStateMixin 区别 Tween、Animatable 差值计算原理 显式动画与隐式动画区别 AnimatedContainer、AnimatedOpacity 等隐式动画底层 Hero 共享元素动画实现原理 PageRoute 共享 Hero 流程 CustomAnimation 自定义动画组件 交错动画 Interval 使用 动画性能优化,避免重建 Lottie 动画集成原理,性能注意点 循环动画、反向动画实现 动画暂停、恢复、释放资源处理 自定义路由转场动画 七、网络 & 本地存储 dio 库封装思路,拦截器使用 dio 统一请求头、错误处理、token 自动刷新 取消请求 CancelToken 使用场景 并发请求、超时处理 Json 序列化反序列化几种方式(手动、json_serializable) fromJson/toJson 生成流程 Freezed 数据模型优势 http 库与 dio 对比 WebSocket 在 Flutter 中使用,重连机制 shared_preferences 底层存储原理 Hive 本地数据库优势,Box 使用 Hive 加密、大数据存储优化 sqflite 数据库操作,事务使用 Isolate 中操作数据库注意事项 文件读写 path_provider 获取路径 图片缓存 cached_network_image 实现逻辑 网络请求缓存策略设计 接口统一异常捕获封装方案 八、原生交互 MethodChannel MethodChannel、BasicMessageChannel、EventChannel 三者区别 MethodChannel 双向通信完整流程 Flutter 调用 Android 原生代码步骤 Flutter 调用 iOS OC/Swift 步骤 原生主动推送数据给 Flutter 使用哪个 Channel 传参类型限制,复杂对象传递方案 多页面 Channel 单例管理 PlatformView 嵌入原生 View(Android View、iOS UIView) PlatformView 性能问题与优化 原生页面跳转 Flutter 传参 权限通过原生通道申请方案 混合栈开发:flutterBoost 原理 flutterBoost 页面生命周期同步问题 原生资源与 Flutter 资源冲突处理 通信通道内存泄漏如何避免 九、性能优化专项 Widget 重建常见诱因与规避手段 const 构造优化原理 Key 不合理使用导致的性能问题 ListView 长列表优化方案 图片加载优化:尺寸、缓存、压缩 RepaintBoundary 拆分重绘区域场景 减少 Layer 树层级优化 避免使用 Intrinsic 系列控件原因 动画卡顿排查思路 DevTools 工具使用:性能面板、内存、Widget 检查 内存泄漏常见场景(Timer、Stream、Channel、Animation) 大图片、大量对象内存释放方案 Isolate 处理耗时计算优化 UI build 方法避免耗时操作 布局嵌套过深优化手段 页面 dispose 资源释放规范 Profile 模式性能排查要点 启动速度优化(包体积、懒加载、预加载) Flutter 包体积优化方案 滑动卡顿完整排查流程 十、图片、手势、输入、弹窗组件 Image 几种构造:AssetImage、NetworkImage、FileImage、MemoryImage ImageProvider 缓存机制 Image.network 缓存缺陷,cached_network_image 弥补方案 DecorationImage、FadeInImage 使用 GestureDetector 手势识别原理,多手势冲突 Listener 底层原始手势与 GestureDetector 区别 手势竞争、手势忽略场景 InkWell 水波纹实现原理,必须嵌套 Material TextField 控制器 TextEditingController 使用 TextField 输入监听、格式化、光标控制 表单 Form、GlobalKey 校验逻辑 ModalRoute、showDialog、showBottomSheet 弹窗原理 弹窗状态共享问题解决方案 Draggable、LongPressDraggable 拖拽实现 Transform 变换不改变布局约束特性 十一、项目工程 & 打包适配 pubspec.yaml 各字段含义,依赖版本约束 本地依赖、Git 依赖、远程依赖配置 pub 依赖冲突解决方法 Flutter 多环境配置(开发/测试/生产) Flavor 多渠道打包 Android & iOS Android 打包 keystore 配置,iOS 证书配置 AndroidManifest、Info.plist 权限适配 屏幕适配方案:媒体查询、比例、flutter_screenutil 深色模式适配实现 多语言国际化 intl 库使用 App 图标、启动页配置 Flutter 插件开发流程 平台区分代码编写(dart.io、Platform 判断) 混合开发项目目录结构 CI/CD 自动打包脚本思路 版本号管理升级方案 第三方插件兼容问题处理 十二、进阶底层 & 疑难场景 WidgetsApp、MaterialApp、CupertinoApp 内部结构 ThemeData 主题分发原理,局部主题覆盖 Navigator 上下文与页面上下文区别 context 获取上层 Widget 原理,BuildContext 分类 State 保存在 Element 中,Widget 重建 State 不销毁条件 Offstage、Visibility 控件隐藏区别 AbsorbPointer、IgnorePointer 拦截手势差异 Clip 裁剪控件:ClipRect、ClipRRect、ClipOval 性能 BackdropFilter 模糊控件性能损耗原因 RenderBox 自定义控件完整流程 自定义 RenderObject 实现步骤 自定义 MultiChildRenderObjectWidget ScrollController 监听滚动、滚动定位 ScrollPhysics 滚动回弹、阻尼自定义 监听应用前后台切换 AppLifecycleState 截屏、屏幕亮度、震动原生能力实现 WebView 插件使用与通信 Flutter Web 编译差异,平台兼容问题 Flutter Windows/macOS/Linux 桌面端适配要点 如何实现全局捕获异常 Timer、StreamSubscription 忘记取消的内存泄漏 列表 item 点击状态保存方案 异步并发竞态条件问题处理 图片大量加载 OOM 解决方案 原生弹窗遮挡 Flutter 页面问题 十三、综合项目面试问答题 讲一下你项目整体架构分层 项目状态管理选型原因 长列表卡顿怎么优化的 多页面共享登录状态如何实现 token 过期统一拦截处理方案 项目混合栈开发遇到哪些坑 图片缓存、网络缓存怎么设计 全局网络加载弹窗、错误页封装思路 项目通用业务组件封装思路 线上卡顿、崩溃排查处理经验 如何实现页面无网络重试逻辑 复杂表单页面状态管理方案 项目包体积优化做了哪些操作 多渠道、多环境配置实现 封装通用 Dio 请求库完整思路