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

相关推荐
凡人叶枫3 小时前
C++中智能指针详解(Linux实战版)| 彻底解决内存泄漏,新手也能吃透
java·linux·c语言·开发语言·c++·嵌入式开发
Tony Bai3 小时前
再见,丑陋的 container/heap!Go 泛型堆 heap/v2 提案解析
开发语言·后端·golang
发现一只大呆瓜3 小时前
虚拟列表:支持“向上加载”的历史消息(Vue 3 & React 双版本)
前端·javascript·面试
小糯米6013 小时前
C++顺序表和vector
开发语言·c++·算法
css趣多多3 小时前
ctx 上下文对象控制新增 / 编辑表单显示隐藏的逻辑
前端
微祎_3 小时前
Flutter for OpenHarmony:构建一个 Flutter 重力弹球游戏,2D 物理引擎、手势交互与关卡设计的工程实现
flutter·游戏·交互
froginwe113 小时前
JavaScript 函数调用
开发语言
独望漫天星辰3 小时前
C++ 多态深度解析:从语法规则到底层实现(附实战验证代码)
开发语言·c++
_codemonster3 小时前
Vue的三种使用方式对比
前端·javascript·vue.js
寻找奶酪的mouse3 小时前
30岁技术人对职业和生活的思考
前端·后端·年终总结