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 是如何在"安全"和"灵活"之间取得平衡的

相关推荐
a1117763 小时前
医院挂号预约系统(开源 Fastapi+vue2)
前端·vue.js·python·html5·fastapi
0思必得03 小时前
[Web自动化] Selenium处理iframe和frame
前端·爬虫·python·selenium·自动化·web自动化
virus59453 小时前
悟空CRM mybatis-3.5.3-mapper.dtd错误解决方案
java·开发语言·mybatis
初次见面我叫泰隆3 小时前
Qt——3、常用控件
开发语言·qt·客户端
灰灰勇闯IT4 小时前
Flutter for OpenHarmony:图标与 Asset 资源管理 —— 构建高性能、可维护的视觉资源体系
flutter
无小道4 小时前
Qt——QWidget
开发语言·qt
时艰.4 小时前
Java 并发编程之 CAS 与 Atomic 原子操作类
java·开发语言
子春一5 小时前
Flutter for OpenHarmony:构建一个 Flutter 记忆翻牌游戏,深入解析状态管理、动画交互与经典配对逻辑
flutter·游戏·交互
行走的陀螺仪5 小时前
uni-app + Vue3编辑页/新增页面给列表页传参
前端·vue.js·uni-app
梵刹古音5 小时前
【C语言】 函数基础与定义
c语言·开发语言·算法