Flutter 零基础入门(十二):枚举(enum)与状态管理的第一步

Flutter 零基础入门(十二):枚举(enum)与状态管理的第一步

文章目录

  • [Flutter 零基础入门(十二):枚举(enum)与状态管理的第一步](#Flutter 零基础入门(十二):枚举(enum)与状态管理的第一步)
    • 一、为什么需要枚举(enum)?
    • 二、枚举(enum)是什么?
    • [三、enum 的基本定义](#三、enum 的基本定义)
    • [四、使用 enum 变量](#四、使用 enum 变量)
    • [五、enum + if 判断](#五、enum + if 判断)
    • [六、为什么 enum 非常适合"状态管理"?](#六、为什么 enum 非常适合“状态管理”?)
    • [七、一个真实场景示例(非 UI)](#七、一个真实场景示例(非 UI))
    • [八、enum 与 switch(推荐写法)](#八、enum 与 switch(推荐写法))
    • [九、enum 是如何"帮你减少 Bug 的"?](#九、enum 是如何“帮你减少 Bug 的”?)
    • [十、enum vs int / String 对比总结](#十、enum vs int / String 对比总结)
    • [十一、enum 与 Class 的配合(重要思想)](#十一、enum 与 Class 的配合(重要思想))
    • 十二、这一篇你真正学到的是什么?
    • 十三、总结
    • [🔜 下一篇预告](#🔜 下一篇预告)

在前面的学习中,我们已经解决了一个非常重要的问题:

👉 如何安全地表示"有没有值"(Null Safety)

但在真实开发中,还有另一类更常见的问题:

  • 当前是加载中?
  • 加载成功了?
  • 还是加载失败?
  • 页面现在处于哪种状态?

如果你用 String 或 int 来表示这些状态,代码会非常混乱、也非常不安全。

这一篇,我们来学习一个专门为"状态"而生的工具

👉 枚举(enum)


一、为什么需要枚举(enum)?

先来看一个"新手常见写法":

dart 复制代码
String status = 'loading';

if (status == 'loading') {}
if (status == 'success') {}
if (status == 'error') {}

问题在哪里?

  • 字符串容易拼错
  • 没有提示
  • 没有约束
  • 编译器无法帮你发现错误

📌 Dart 无法阻止你写出:

复制代码
status = 'loadding'; // ❌ 逻辑错误,但不会报错

二、枚举(enum)是什么?

枚举 = 一组有限、固定的取值

比如:

  • 状态只能是「加载中 / 成功 / 失败」
  • 性别只能是「男 / 女」
  • 主题只能是「浅色 / 深色」

👉 这正是 enum 的用武之地。


三、enum 的基本定义

复制代码
enum PageState {
  loading,
  success,
  error,
}

这里的含义是:

  • PageState 是一个新类型
  • 它的取值 只能 是这三个之一

四、使用 enum 变量

复制代码
PageState state = PageState.loading;

注意:

  • 不能随便赋值
  • 不能写成字符串
  • 编译器会自动提示可选项

五、enum + if 判断

复制代码
if (state == PageState.loading) {
  print('加载中...');
} else if (state == PageState.success) {
  print('加载成功');
} else {
  print('加载失败');
}

📌 对比 String 写法:

  • 更安全
  • 不可能写错
  • IDE 自动补全

六、为什么 enum 非常适合"状态管理"?

在 Flutter 中,页面本质上就是状态的不同表现

  • loading → 显示 loading
  • success → 显示内容
  • error → 显示错误页

而 enum:

  • 天然适合描述"状态"
  • 状态是有限的
  • 状态是可穷举的

七、一个真实场景示例(非 UI)

复制代码
enum LoadState {
  idle,
  loading,
  success,
  error,
}

void handleState(LoadState state) {
  if (state == LoadState.idle) {
    print('初始状态');
  } else if (state == LoadState.loading) {
    print('请求中');
  } else if (state == LoadState.success) {
    print('请求成功');
  } else {
    print('请求失败');
  }
}

📌 这已经是 Flutter 状态管理的雏形


八、enum 与 switch(推荐写法)

当你用 enum 判断时,switch 比 if 更优雅

复制代码
switch (state) {
  case PageState.loading:
    print('加载中');
    break;
  case PageState.success:
    print('成功');
    break;
  case PageState.error:
    print('失败');
    break;
}

优势:

  • 所有状态一目了然
  • 漏写会被编译器提示
  • 更适合状态逻辑

九、enum 是如何"帮你减少 Bug 的"?

假设你后来新增了一个状态:

复制代码
enum PageState {
  loading,
  success,
  empty,
  error,
}

如果你忘了在 switch 中处理 empty

👉 编译器会警告你

这在大型项目中非常重要。


十、enum vs int / String 对比总结

方式 是否安全 是否可控 是否推荐
String 不推荐
int 不推荐
enum 强烈推荐

📌 一句话结论:

只要是"有限状态",优先使用 enum


十一、enum 与 Class 的配合(重要思想)

复制代码
enum UserType {
  normal,
  vip,
  admin,
}

class User {
  final String name;
  final UserType type;

  User(this.name, this.type);
}

现在:

  • 用户类型不再混乱
  • 数据模型更加严谨
  • 逻辑更清晰

十二、这一篇你真正学到的是什么?

你不仅学了 enum 语法,更重要的是:

  • 学会了用类型表达业务含义
  • 开始用"状态"思维写代码
  • 为 Flutter 的 UI 切换打基础

📌 这是从"写代码"到"设计代码"的转变。


十三、总结

本篇你已经掌握:

  • enum 的定义与使用
  • enum 与 if / switch
  • enum 在状态管理中的作用
  • 为什么 enum 是 Flutter 的必备工具

🔜 下一篇预告

《Flutter 零基础入门(十三):late 关键字与延迟初始化》

下一篇我们将学习:

  • late 是为了解决什么问题
  • late 与 final 的关系
  • 常见使用场景
  • Flutter 中为什么大量使用 late

你将进一步理解:

Dart 是如何在"安全"和"灵活"之间取得平衡的

相关推荐
花哥码天下2 小时前
恢复网站console.log的脚本
前端·javascript·vue.js
Zoey的笔记本2 小时前
「支持ISO27001的GTD协作平台」数据生命周期管理方案与加密通信协议
java·前端·数据库
C_心欲无痕2 小时前
Docker 本地部署 CSR 前端项目完整指南
前端·docker·容器
charlie1145141913 小时前
从 0 开始的机器学习——NumPy 线性代数部分
开发语言·人工智能·学习·线性代数·算法·机器学习·numpy
catchadmin3 小时前
Laravel12 + Vue3 的免费可商用商业级管理后台 CatchAdmin V5 正式发布
开发语言·php
康一夏3 小时前
React面试题,封装useEffect
前端·javascript·react.js
袁气满满~_~3 小时前
Python数据分析学习
开发语言·笔记·python·学习
Full Stack Developme3 小时前
Redis 持久化 备份 还原
前端·chrome
程序员老刘·3 小时前
重拾Eval能力:D4rt为Flutter注入AI进化基因
人工智能·flutter·跨平台开发·客户端开发