Flutter学习13 - Widget

1、Flutter中常用 Widget

2、StatelessWidget 和 StateFulWidget

  • Flutter 中的 widget 有很多,但主要分两种:
StatelessWidget 无状态的 widget 如果一个 widget 是最终的或不可变的,那么它就是无状态的
StatefulWidget 有状态的 widget 如果一个 widget 会被用户交互或数据导致状态改变,那么它就是有状态的

2.1、StatelessWidget

  • Text、AboutDialog、CircleAvatar 等都是 StatelessWidget 的子类

无状态 widget 通常会在 3 种情况下使用:

(1) 将 widget 插入树中时

(2) 当 widget 的父级更改配置时

(3) 当它依赖的 InheritedWidget 发生改变时

代码示例

dart 复制代码
//无状态 widget
class LeonStateLessWidget extends StatelessWidget {
  final String text;

  const LeonStateLessWidget({super.key, required this.text});

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text(
        text,
        style: const TextStyle(color: Colors.yellow, fontSize: 26),
      ),
    );
  }
}

2.2、StatefulWidget

  • TextField、Checkbox、Radio、Form、Slider、InkWell 等都是 StatefulWidget 的子类
  • StatefulWidget 使用 setState 方法管理状态变化,调用 setState 方法告诉 Flutter 框架某个状态发生了改变,Flutter 会重新运行 build 方法
  • createState() 方法会创建一个管理 widget 状态的状态对象 _xxxState,_xxxState() 类会实现 widget 的 build 方法

代码示例

dart 复制代码
//有状态 widget
class LeonStatefulWidget extends StatefulWidget {
  const LeonStatefulWidget({super.key});

  @override
  State<LeonStatefulWidget> createState() => _LeonStatefulWidgetState();
}

class _LeonStatefulWidgetState extends State<LeonStatefulWidget> {
  var count = 0;

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        children: [
          Text('点击次数: $count'),
          ElevatedButton(onPressed: _onClick, child: const Text('点我'))
        ],
      ),
    );
  }

  void _onClick() {
    setState(() {
      count++;
    });
  }
}

2.3、代码示例

dart 复制代码
import 'package:flutter/material.dart';
import 'package:zlzf/widget.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Leon Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: Scaffold(
          appBar: AppBar(
            title: const LeonStateLessWidget(
              text: 'Widget 学习',
            ),
          ),
          body: const LeonStatefulWidget()
        ));
  }
}

3、补充

  • Flutter 中状态管理的 3 中主要方式:
每个 widget 管理自己的状态 如果所讨论的状态是用户数据,例如复选框的已选中或未选中状态,或滑块的位置,则状态最好由父widget管理
父 widget 管理 widget 的状态 如果widget的状态取决于动作,例如动画,那么最好是由widget自身来管理状态
混合搭配管理 见机行事
相关推荐
_李小白26 分钟前
【OSG学习笔记】Day 38: TextureVisitor(纹理访问器)
android·笔记·学习
杨云龙UP1 小时前
从0到1快速学会Linux操作系统(基础),这一篇就够了!
linux·运维·服务器·学习·ubuntu·centos·ssh
加农炮手Jinx1 小时前
Flutter 组件 conventional 适配鸿蒙 HarmonyOS 实战:约定式提交标准,构建自动化版本治理与 CI/CD 质量治理架构
flutter·harmonyos·鸿蒙·openharmony
王码码20351 小时前
Flutter 三方库 appstream 的鸿蒙化适配指南 - 驾驭 Linux 生态元数据规范,打造高性能、标准化、国际化的 OpenHarmony 桌面应用商店分发基石
flutter·harmonyos·鸿蒙·openharmony
见山是山-见水是水1 小时前
Flutter 框架跨平台鸿蒙开发 - AR植物养护助手
flutter·华为·ar·harmonyos
头疼的程序员2 小时前
计算机网络:自顶向下方法(第七版)第八章 学习分享(三)
网络·学习·计算机网络
autumn20052 小时前
Flutter 框架跨平台鸿蒙开发 - 历史人物对话
服务器·flutter·华为·harmonyos
_李小白2 小时前
【OSG学习笔记】Day 37: NodeVisitor(顶点访问器)
笔记·学习
autumn20052 小时前
Flutter 框架跨平台鸿蒙开发 - 社区闲置循环
flutter·华为·harmonyos
程序员雷欧3 小时前
大模型应用开发学习第八天
大数据·人工智能·学习