Flutter StatefulWidget 和 StatelessWidget 的区别

在 Flutter 中,StatefulWidget 和 StatelessWidget 是两种不同类型的 Widget,它们的主要区别在于它们是否能够携带和管理状态。

StatelessWidget

StatelessWidget 是不可变的,这意味着一旦它们被创建,它们的属性就不能改变。它们适用于那些状态在构建之后不会发生变化的场景。典型的例子包括文本、图标和静态图片等。

示例
dart 复制代码
import 'package:flutter/material.dart';

class MyStatelessWidget extends StatelessWidget {
  final String title;

  MyStatelessWidget({required this.title});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(title),
      ),
      body: Center(
        child: Text('This is a stateless widget'),
      ),
    );
  }
}

StatefulWidget

StatefulWidget 是可变的,它们可以在其生命周期内持有和管理状态。当状态改变时,可以调用 setState 方法来触发 Widget 的重新构建。它们适用于那些状态会在构建之后发生变化的场景,如表单、动画和用户交互等。

StatefulWidget 由两个类组成:

  1. StatefulWidget 类:定义了 Widget 本身。
  2. State 类:包含了 Widget 的状态和状态变化的逻辑。
示例
dart 复制代码
import 'package:flutter/material.dart';

class MyStatefulWidget extends StatefulWidget {
  @override
  _MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}

class _MyStatefulWidgetState extends State<MyStatefulWidget> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Stateful Widget Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('You have pressed the button this many times:'),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

主要区别

  1. 状态管理:

    • StatelessWidget:无状态,不会随着数据的变化而重新构建。
    • StatefulWidget:有状态,状态变化会触发重新构建。
  2. 生命周期:

    • StatelessWidget:只拥有一个简单的生命周期方法 build。
    • StatefulWidget:分为两部分,StatefulWidget 本身的生命周期和其状态对象 State 的生命周期,后者包含多个方法如 initState、setState、dispose 等。
  3. 使用场景:

    • StatelessWidget:用于静态内容或不需要动态更新的场景。
    • StatefulWidget:用于需要动态更新内容的场景,如用户交互、动画或异步数据处理等。
相关推荐
白帽攻防录8 小时前
SRC 挖洞:PostScript 打印机驱动双 RCE,打印服务器怎么变成内网跳板
开发语言·网络安全·php·内网安全
十年Java程序媛8 小时前
Java枚举Enum完整教程|替代静态常量,开发与面试要点
java·开发语言·spring boot·后端·面试
2603_965148118 小时前
电商选品调研:通过关键词搜索API获取市场热销商品,结合商品详情API分析竞品卖点与定价
开发语言·数据库·人工智能·python·信息可视化
lpfasd1239 小时前
node-sass 停止维护!老项目迁移 Dart Sass 完整教程
前端·rust·sass
xixiaoyunya9 小时前
Python 异步编程入门:用 asyncio 轻松实现并发任务
开发语言·python·php
学逆向的9 小时前
C 循环结构的执行效率分析
c语言·开发语言·数据结构·网络安全
小坏讲微服务10 小时前
刚发布一个月的JDK 27,为什么我建议你立刻升级?
java·开发语言·spring boot·spring·架构·求职招聘·springboot4
Data analyse45611 小时前
rnweb 回放数据量太大怎么办?分片存储与断点续传的实现思路
前端·网络·算法·数据分析
xiaogai_gai11 小时前
金蝶收料通知单查询策略实战教程:从源系统拉取到中间层落地的完整路径
java·前端·数据库
打工仔折腾 AI11 小时前
用 Dashlet 把极空间 NAS 服务入口整理成统一导航首页的实践
java·开发语言·人工智能·后端·python·rpc·ai agent 实战