Flutter 核心架构
架构分层
┌─────────────────────────────────────────────────────┐
│ Framework (Dart) │
│ ┌─────────────────────────────────────────────────┐│
│ │ Material / Cupertino (UI 组件库) ││
│ ├─────────────────────────────────────────────────┤│
│ │ Widgets (组合式 UI) ││
│ ├─────────────────────────────────────────────────┤│
│ │ Rendering (布局、绘制) ││
│ ├─────────────────────────────────────────────────┤│
│ │ Foundation (基础库) ││
│ └─────────────────────────────────────────────────┘│
├─────────────────────────────────────────────────────┤
│ Engine (C++) │
│ Skia (渲染) | Dart VM | Platform Channels │
├─────────────────────────────────────────────────────┤
│ Embedder │
│ iOS (UIKit) | Android (JNI) | Web | Desktop │
└─────────────────────────────────────────────────────┘Widget 系统
Widget 三棵树
dart
// 1. Widget Tree - 配置描述(不可变)
// 2. Element Tree - 实例管理(生命周期)
// 3. RenderObject Tree - 布局绘制
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
// 返回 Widget 配置
return Container(
child: Text('Hello'),
);
}
}Widget Tree Element Tree RenderObject Tree
┌──────────┐ ┌──────────┐ ┌──────────────┐
│ Container│───────▶│ Element │────────▶│ RenderBox │
└────┬─────┘ └────┬─────┘ └──────────────┘
│ │
┌────▼─────┐ ┌────▼─────┐ ┌──────────────┐
│ Text │───────▶│ Element │────────▶│RenderParagraph│
└──────────┘ └──────────┘ └──────────────┘StatelessWidget vs StatefulWidget
dart
// 无状态组件
class GreetingWidget extends StatelessWidget {
final String name;
const GreetingWidget({required this.name});
@override
Widget build(BuildContext context) {
return Text('Hello, $name');
}
}
// 有状态组件
class CounterWidget extends StatefulWidget {
@override
State<CounterWidget> createState() => _CounterState();
}
class _CounterState extends State<CounterWidget> {
int _count = 0;
void _increment() {
setState(() {
_count++;
});
}
@override
Widget build(BuildContext context) {
return Column(
children: [
Text('Count: $_count'),
ElevatedButton(
onPressed: _increment,
child: Text('Increment'),
),
],
);
}
}生命周期
dart
class MyStatefulWidget extends StatefulWidget {
@override
State<MyStatefulWidget> createState() => _MyState();
}
class _MyState extends State<MyStatefulWidget> {
@override
void initState() {
super.initState();
// 初始化,只调用一次
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
// 依赖变化(InheritedWidget)
}
@override
void didUpdateWidget(MyStatefulWidget oldWidget) {
super.didUpdateWidget(oldWidget);
// Widget 配置更新
}
@override
void dispose() {
// 释放资源
super.dispose();
}
@override
Widget build(BuildContext context) {
return Container();
}
}渲染机制
渲染流水线
┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐
│ Build │──▶│ Layout │──▶│ Paint │──▶│ Composite │
│ Widget树 │ │ 计算尺寸 │ │ 绘制命令 │ │ GPU 合成 │
└────────────┘ └────────────┘ └────────────┘ └────────────┘布局约束
dart
// 约束传递:父 -> 子
// 尺寸返回:子 -> 父
Container(
constraints: BoxConstraints(
minWidth: 100,
maxWidth: 200,
minHeight: 50,
maxHeight: 100,
),
child: FlexibleChild(),
)Platform Channels
dart
// Dart 端
import 'package:flutter/services.dart';
class BatteryChannel {
static const platform = MethodChannel('com.example/battery');
Future<int> getBatteryLevel() async {
try {
final int level = await platform.invokeMethod('getBatteryLevel');
return level;
} on PlatformException catch (e) {
return -1;
}
}
}kotlin
// Android 端 (Kotlin)
class MainActivity: FlutterActivity() {
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "com.example/battery")
.setMethodCallHandler { call, result ->
if (call.method == "getBatteryLevel") {
val batteryLevel = getBatteryLevel()
result.success(batteryLevel)
} else {
result.notImplemented()
}
}
}
}Dart 语言特性
dart
// 空安全
String? nullableString;
String nonNullString = nullableString ?? 'default';
// 异步
Future<void> fetchData() async {
final response = await http.get(Uri.parse('https://api.example.com'));
// ...
}
// 扩展方法
extension StringExtension on String {
String capitalize() => '${this[0].toUpperCase()}${substring(1)}';
}
// 记录类型 (Dart 3)
(String, int) getNameAndAge() => ('Alice', 30);
// 模式匹配 (Dart 3)
switch (shape) {
case Circle(radius: var r): print('Circle with radius $r');
case Rectangle(width: var w, height: var h): print('Rectangle $w x $h');
}面试要点
- 三棵树:Widget/Element/RenderObject 职责
- 渲染流程:Build -> Layout -> Paint -> Composite
- 状态管理:StatelessWidget vs StatefulWidget
- 原生通信:Platform Channels 机制