首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
01 | 预习篇 · 从0开始搭建Flutter工程环境
02 | 预习篇 · Dart语言概览
03 | 深入理解跨平台方案的历史发展逻辑
04 | Flutter区别于其他方案的关键技术是什么?
05 | 从标准模板入手,体会Flutter代码是如何运行在原生系统上的
06 | 基础语法与类型变量:Dart是如何表示信息的?
07 | 函数、类与运算符:Dart是如何处理信息的?
08 | 综合案例:掌握Dart核心特性
09 | Widget,构建Flutter界面的基石
10 | Widget中的State到底是什么?
11 | 提到生命周期,我们是在说什么?
12 | 经典控件(一):文本、图片和按钮在Flutter中怎么用?
13 | 经典控件(二):UITableView/ListView在Flutter中是什么?
14 | 经典布局:如何定义子控件在父容器中排版的位置?
15 | 组合与自绘,我该选用何种方式自定义Widget?
16 | 从夜间模式说起,如何定制不同风格的App主题?
17 | 依赖管理(一):图片、配置和字体在Flutter中怎么用?
18 | 依赖管理(二):第三方组件库在Flutter中要如何管理?
19 | 用户交互事件该如何响应?
20 | 关于跨组件传递数据,你只需要记住这三招
21 | 路由与导航,Flutter是这样实现页面切换的
22 | 如何构造炫酷的动画效果?
23 | 单线程模型怎么保证UI运行流畅?
24 | HTTP网络编程与JSON解析
25 | 本地存储与数据库的使用和优化
26 | 如何在Dart层兼容Android/iOS平台特定实现?(一)
27 | 如何在Dart层兼容Android/iOS平台特定实现?(二)
28 | 如何在原生应用中混编Flutter工程?
29 | 混合开发,该用何种方案管理导航栈?
30 | 为什么需要做状态管理,怎么做?
31 | 如何实现原生推送能力?
32 | 适配国际化,除了多语言我们还需要注意什么?
33 | 如何适配不同分辨率的手机屏幕?
34 | 如何理解Flutter的编译模式?
35 | Hot Reload是怎么做到的?
36 | 如何通过工具链优化开发调试效率?
37 | 如何检测并优化Flutter App的整体性能表现?
38 | 如何通过自动化测试提高交付质量?
39 | 线上出现问题,该如何做好异常捕获与信息采集?
40 | 衡量Flutter App线上质量,我们需要关注这三个指标
41 | 组件化和平台化,该如何组织合理稳定的Flutter工程结构?
42 | 如何构建高效的Flutter App打包发布环境?
43 | 如何构建自己的Flutter混合开发框架(一)?
44 | 如何构建自己的Flutter混合开发框架(二)?
当前位置:
首页>>
技术小册>>
Flutter核心技术与实战
小册名称:Flutter核心技术与实战
### 第十章 | Widget中的State到底是什么? 在Flutter这一强大的跨平台UI框架中,`Widget`是构建用户界面的基石。每个`Widget`都负责描述UI界面的一个特定部分,而`State`则是这些`Widget`内部动态性与交互性的核心所在。理解`Widget`中的`State`概念,对于掌握Flutter应用的开发至关重要。本章将深入剖析`State`的本质、工作原理、分类以及如何在Flutter应用中有效地使用和管理`State`。 #### 1. State的基本概念 在Flutter中,`Widget`是不可变的,这意味着一旦创建,其属性就不能改变。然而,UI界面往往需要响应用户操作或系统事件(如数据更新、网络响应等)来动态地改变其显示内容或布局。为了实现这种动态性,Flutter引入了`State`的概念。 `State`是`Widget`内部持有的数据,这些数据能够随着时间或外部事件的变化而变化,并且这些变化能够驱动`Widget`重建(rebuild)以反映最新的状态。简单来说,`State`就是`Widget`的“记忆”,它记录了`Widget`需要知道的关于其当前状态的所有信息。 #### 2. Stateful Widgets与Stateless Widgets Flutter中的`Widget`可以分为两大类:`Stateful Widgets`(有状态组件)和`Stateless Widgets`(无状态组件)。 - **Stateless Widgets**:这些`Widget`不接受任何外部输入来影响其输出,即它们不持有`State`。每次`Widget`树重建时,它们都会根据当前的输入(如属性)重新计算并返回相同的UI描述。常见的`Stateless Widgets`包括`Text`、`Image`等。 - **Stateful Widgets**:与`Stateless Widgets`相对,`Stateful Widgets`能够持有和管理自己的`State`。当`State`发生变化时,`Stateful Widgets`会重新构建其UI以反映新的状态。`Stateful Widgets`通常包含一个或多个`Stateful`子`Widget`,这些子`Widget`负责具体的状态管理和UI更新。在Flutter中,`Stateful Widget`通常通过`createState()`方法创建并返回一个`State`对象,该对象包含了`Widget`的所有状态信息。 #### 3. State的工作原理 当`Stateful Widget`的`State`发生变化时,Flutter的框架会触发一个重建流程。这个流程大致可以分为以下几个步骤: 1. **状态变更**:首先,`State`对象中的某个属性(即状态)发生变更。这通常是由于用户交互、网络响应或内部逻辑触发。 2. **通知框架**:状态变更后,`State`对象会调用`setState()`方法来通知Flutter框架`Widget`的状态已经改变。`setState()`是一个异步方法,它会将当前`State`对象标记为“脏”(dirty),并请求框架在下一个事件循环中重建该`Widget`。 3. **重建流程**:Flutter框架在合适的时机(如下一个事件循环的空闲阶段)开始重建流程。它首先会检查哪些`Widget`被标记为“脏”,然后仅重建这些`Widget`及其子树,而不是整个`Widget`树。这种局部重建机制大大提高了应用的性能。 4. **UI更新**:在重建过程中,`Stateful Widget`会根据其最新的`State`生成新的UI描述,并返回给Flutter框架。框架随后将新的UI描述渲染到屏幕上,完成UI的更新。 #### 4. State的分类与管理 在Flutter应用中,`State`可以根据其管理方式和作用域进行不同的分类: - **局部状态**:由单个`Stateful Widget`管理的状态,仅影响该`Widget`自身的UI表现。局部状态是Flutter中最常见的状态管理方式,它适用于简单的UI组件,如计数器、开关按钮等。 - **全局状态**:跨多个`Widget`或页面共享的状态,通常由应用层面的状态管理解决方案(如Provider、Riverpod、Redux等)管理。全局状态适用于需要在多个地方共享数据或状态的复杂应用。 管理`State`时,开发者需要注意避免常见的陷阱,如不必要的重建(通过合理使用`const`、`key`等优化手段)、状态泄露(确保`State`对象在不再需要时被正确销毁)以及状态管理复杂度过高(合理划分状态作用域,采用适当的状态管理方案)。 #### 5. 实战案例:构建一个简单的计数器 下面是一个使用`Stateful Widget`构建简单计数器的示例,展示了如何在Flutter中管理`State`。 ```dart import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: Text('Counter Example')), body: Center( child: Counter(), ), ), ); } } class Counter extends StatefulWidget { @override _CounterState createState() => _CounterState(); } class _CounterState extends State<Counter> { int _count = 0; void _increment() { setState(() { _count++; }); } @override Widget build(BuildContext context) { return Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text('You pressed the button this many times:'), Text( '$_count', style: Theme.of(context).textTheme.headline4, ), ElevatedButton( onPressed: _increment, child: Text('Increment'), ), ], ); } } ``` 在这个例子中,`Counter`是一个`Stateful Widget`,它持有一个名为`_count`的局部状态,用于记录按钮被点击的次数。当按钮被点击时,`_increment`方法被调用,它通过`setState()`更新`_count`的值,并触发`Counter`的重建,从而更新UI以反映最新的计数。 #### 结语 通过本章的学习,我们深入理解了Flutter中`Widget`的`State`概念,包括其基本定义、工作原理、分类以及在实际应用中的管理策略。掌握`State`的管理是开发动态、响应式Flutter应用的关键。希望本章的内容能够帮助你更好地理解和运用`State`,从而创建出更加丰富、交互性更强的用户界面。
上一篇:
09 | Widget,构建Flutter界面的基石
下一篇:
11 | 提到生命周期,我们是在说什么?
该分类下的相关小册推荐:
web前端开发性能优化实战
Javascript重点难点实例精讲(一)
Node.js 开发实战
编程入门课:Javascript从入门到实战
KnockoutJS入门指南
Javascript编程指南
javascript设计模式原理与实战
经典设计模式Javascript版
ES6入门指南
WebSocket入门与案例实战
深入学习前端重构知识体系
Javascript-ES6与异步编程