定义
StatelessWidget是Flutter框架中所有无状态组件的基类,官方文档把它定义为一个不需要可变状态的组件[1]。在Flutter里,组件是构建界面的基本单元,界面元素按父子关系组织成组件树,而StatelessWidget通过build方法描述界面中的某一部分,并返回由其他组件组成的一棵新子树,构建过程会递归进行,直到描述完全具体化[1][3]。
它的子类需要继承StatelessWidget并重写build方法,该方法接收一个BuildContext参数,且必须返回另一个组件[2]。按照惯例,组件的构造参数都用命名参数,其中第1个参数是key,最后1个参数是child、children或与之相当的参数,其余参数各自对应一个final属性[1]。
原理
Flutter的组件是不可变的配置对象,只保存渲染所需的数据和父子关系,本身并不直接参与绘制[4]。在构建阶段,框架把代码中声明的组件转换成对应的元素树,每个组件对应一个元素,元素代表该组件在树中某个位置的具体实例,可通过BuildContext访问[4]。无状态组件对应的是StatelessElement,由createElement方法创建,用于管理该组件在树中的位置[5]。
因为组件不可变,任何改动都会返回一组新的组件对象,但底层表示并不必然重建:元素树在帧与帧之间保持不变,框架只遍历发生变化的组件,从而只重配置元素树中需要更新的部分[4]。无状态组件的build方法通常只在3种情况下被调用:组件首次插入树中、父组件改变其配置、以及它依赖的InheritedWidget发生变化[1]。
发展历程
Flutter的前身是谷歌工程师在2014年开始编写的渲染引擎Sky,初衷是设想一个面向移动优先的现代渲染引擎[6]。2015年5月的Dart开发者峰会上,基于Dart语言的移动应用开发框架Sky亮相,随后更名为Flutter[7]。同年谷歌内部团队开始在Flutter上构建应用,框架逐步走向公开项目[6]。
2018年2月,Flutter公布第1个Beta版本;同年12月5日,Flutter 1.0正式发布,成为该框架第1个稳定版本。2022年5月,Flutter 3发布,正式支持Windows、macOS和Linux等操作系统。StatelessWidget作为框架的基础组件类型,自框架早期即随组件体系一同提供,并在官方教程中被用作介绍组件结构的主要示例[2]。
应用
无状态组件适用于界面内容只取决于组件自身配置信息和所处BuildContext的场景[1]。常见的应用包括静态文本、图标、卡片等元素,也常用于应用或页面的根组件,例如官方教程中的主应用组件即继承自StatelessWidget[8][2]。
在导航场景中,无状态组件同样被广泛使用:需要展示的数据如果由上一个页面通过构造函数传入,接收页面即可写成无状态组件,因为它持有的列表或对象在运行期间不会改变[9]。若父组件需要掌握按钮是否被点击并根据结果作出响应,也可以把按钮做成无状态组件,由父组件通过回调接收通知并调用setState更新界面。
局限
无状态组件无法自行维护随时间变化的内部状态,动画控制器、文本输入控制器、可展开面板一类需要在本子树内保存的可变界面状态,需要改用有状态组件[10]。官方文档也指出,如果界面组合需要动态变化,例如存在由时钟驱动或取决于系统状态的内部状态,就应考虑使用StatefulWidget[1]。
如果父组件频繁改变配置,或者该组件依赖的InheritedWidget经常变化,无状态组件的build方法会被反复调用,需要采取优化手段以保持渲染流畅,例如减少build方法间接创建的节点数量、尽量使用const组件,或把无状态组件重构为多个组件,把会变化的部分下推到树的叶节点[1]。此外,build方法应当保持纯粹,不应包含网络请求、修改全局变量或调用其他组件的setState等副作用[10]。当构造参数能确定为编译期常量时,为组件提供const构造函数可让框架跳过大部分重建工作[1]。
参见
-
StatefulWidget —— Flutter中另一类组件基类,可在生命周期内多次构建并在内部维护可变状态。
-
InheritedWidget —— 向子孙组件传递共享数据的组件,其变化会触发依赖它的无状态组件重建。
-
BuildContext —— 表示组件在组件树中位置的句柄,作为build方法的参数传入。
-
Widget —— Flutter界面的基本构建单元,无状态组件是其中一种专门类型。
-
Dart —— Flutter使用的编程语言,StatelessWidget及其子类均以该语言编写。
-
Flutter —— 提供StatelessWidget的跨平台应用开发框架。
参考资料
- StatelessWidget class abstract [引用日期2026-10-14]
- 创建 widget [引用日期2026-10-14]
- Master_Thesis_Report(PDF) [引用日期2026-10-14]
- 尽管这样的实现看起来不够成熟,但这样的自动对比方法非常有效,可以实现高性能的交互应用 [引用日期2026-10-14]
- IStatelessWidget class abstract [引用日期2026-10-14]
- google-unveils-flutter [引用日期2026-10-14]
- 革命性web前端框架Flutter详细介绍和学习路径 [引用日期2026-10-14]
- Stateless & stateful widgets [引用日期2026-10-14]
- Send data to a new screen [引用日期2026-10-14]
- widgets [引用日期2026-10-14]