关注点分离
大约 1 分钟flutter
概述
flutter 分为有状态组件(StatefulWidget)和无状态组件,在 Android Studio 中通过快捷键创建的有状态组件的模板代码中,一个 widget 文件中会有两个 class,分别是:
class Home extends StatefulWidget {...}
class _HomeState extends State<Home> with AutomaticKeepAliveClientMixin {...}
前者的特点是:
- 是一个不可变(immutable)的描述类
- 只存储配置信息(如key、初始化参数等)
- 生命周期很短,每次UI更新时都可能重建
- 主要职责是创建对应的State对象
后者的特点是:
- 是实际管理状态和构建UI的类
- 可以保持长生命周期(即使widget重建,state可能被复用)
- 包含可变状态(mutable state)和业务逻辑
- 通过
setState()触发UI更新
这是 flutter 团队设计的 关注点分离 架构:
| 关注点 | StatefulWidget 职责 | State 职责 |
|---|---|---|
| 不可变性 | 必须是不可变的 | 可以持有可变状态 |
| 生命周期 | 频繁重建 | 持久化存在 |
| 性能优化 | 轻量级 | 包含重逻辑 |
| 热重载支持 | 每次重建 | 保持状态不丢失 |
| 框架机制 | 描述"是什么" | 处理"怎么做" |
这种设计带来的优点是:
- 性能优化:Widget轻量级重建不影响State
- 状态持久化:跨帧保持数据
- 热重载友好:重建Widget但不丢失State
- 明确职责划分:配置与逻辑分离
案例
import 'package:flutter/material.dart';
class MyPage extends StatefulWidget {
const MyPage({super.key});
State<MyPage> createState() => _MyPageState();
}
class _MyPageState extends State<MyPage> {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(backgroundColor: Colors.blue,title: const Text('我的'),),
body: Column(
children: const [Text('我的')],
),
);
}
}
