跳至主要內容

关注点分离

chanchaw大约 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 职责
不可变性必须是不可变的可以持有可变状态
生命周期频繁重建持久化存在
性能优化轻量级包含重逻辑
热重载支持每次重建保持状态不丢失
框架机制描述"是什么"处理"怎么做"

这种设计带来的优点是:

  1. 性能优化:Widget轻量级重建不影响State
  2. 状态持久化:跨帧保持数据
  3. 热重载友好:重建Widget但不丢失State
  4. 明确职责划分:配置与逻辑分离

案例

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('我的')],
      ),
    );
  }
}