命令列工具
nslogx/flutter_easyloading avatar
nslogx/flutter_easyloading

Flutter EasyLoading:用根级 Host 管理全局加载与结果提示

一個乾淨、輕量級的 Flutter 載入/Toast 小工具,無需上下文即可輕鬆使用,支援 iOS、Android 和 Web。

1,338 個 Star249 個 ForkDartMIT

秒懂

它是什麼?
Flutter EasyLoading 提供无需 BuildContext 的加载、进度、结果、Toast 和自定义浮层,支持 Material 与 Cupertino 应用。
適合誰用?
适合需要在 Flutter 多层业务代码中统一显示加载状态、又不想层层传递 BuildContext 的应用;不适合要求复杂页面级状态编排或不愿引入根级浮层 Host 的项目。先确认 Dart 3.6 至 4.0、Flutter 3.27 以上,在 MaterialApp 或 CupertinoApp 中挂载 `EasyLoading.init()`,再验证异步关闭、遮罩交互、回调清理和 4.0 迁移行为。
可以商用嗎?
可以。MIT 是寬鬆授權:你可以使用、修改並販售以它為基礎的軟體,只需保留著作權與授權聲明。
還在維護嗎?
有在維護。儲存庫最近一次提交在 48 天前。
用什麼語言寫的?
主要是 Dart(依據 GitHub 的語言統計)。

以上回答依據專案的 GitHub 資料(最近同步於 2026年9月14日)與我們的分析,不構成法律意見。

開源專案深度解析

根级 Host 是使用前提

README 的 Quick Start 要求在根 MaterialApp 或 CupertinoApp 的 builder 中安装一个 EasyLoading Host,典型写法是 `builder: EasyLoading.init()`。Host 挂载后,显示和关闭方法才可以从任意位置调用。已有根 builder 时,可通过 `init(builder: ...)` 组合,避免覆盖应用原有的根级包装。

显示 API 覆盖四类状态

`EasyLoading.show` 用于不确定加载,`showProgress` 接收 0.0 到 1.0 的确定进度;`showSuccess`、`showError` 和 `showInfo` 表示结果;`showToast` 只显示文本,`showCustom` 接收任意 widget。所有显示与关闭方法返回 `Future<void>`,网络请求和界面状态转换可以按顺序 await。

单次 options 不改全局默认

README 将 `EasyLoading.instance` 作为共享配置实例,用来设置样式、指示器、遮罩、位置、时长和动画。`EasyLoadingOptions` 是不可变的单次调用覆盖快照,未指定字段继续继承全局值。`maskType`、`dismissOnTap` 和 `duration` 等参数仍可直接传给方法,调用时应明确区分两种配置来源。

遮罩和交互要按流程测试

默认配置包含 maskType、userInteractions 和 dismissOnTap 等交互选项。加载浮层是否阻挡底层点击,会直接影响重复提交和页面返回。应在请求进行中点击底层按钮、返回页面、快速连续调用 show 和 dismiss,观察业务是否重复执行,以及 Host 卸载时是否收到对应关闭原因。

回调生命周期不能遗漏

包提供状态回调和关闭回调,关闭原因包括 programmatic、tap、timeout 与 hostDetached。README 的示例也展示了注册和移除方式。拥有页面生命周期的对象应在 dispose 时调用 `removeCallback` 或 `removeDismissCallback`,否则回调可能继续引用旧对象。测试时要分别覆盖主动关闭、超时和 Host 被移除。

自定义内容与动画有扩展点

`showCustom` 可以显示任意 widget,自定义动画需要实现 `EasyLoadingAnimation` 基类,内置加载、成功、错误和信息指示器也可以替换。README 列出 30 种由 flutter_spinkit 提供的内置指示器。自定义内容应在小屏、深色模式、长文本和键盘出现时检查尺寸,避免浮层遮住关键操作。

4.0 的环境与许可证边界

当前 README 要求 Dart 3.6.0 或更高且低于 4.0.0,Flutter 3.27.0 或更高;从 3.x 升级前应阅读 MIGRATION.md。仓库元数据记录版本 4.0.2,项目以 MIT 许可发布,内置指示器来自 flutter_spinkit。README 没有提供生产性能基准,升级验收应以你的页面和异步流程为准。可以先建立最小 MaterialApp,挂载 `EasyLoading.init()`,依次 await show、showProgress、showSuccess、showError、showInfo、showToast 和 dismiss,记录 Host 未挂载时的错误与 Host 正常时的结果。再使用已有 root builder 的应用测试 `init(builder: ...)` 组合,确认原有主题、路由和 Overlay 没有被覆盖。进度值分别测试 0.0、0.5 和 1.0,长状态文本测试布局是否溢出。对 maskType 和 userInteractions,在加载期间点击提交、返回和底层列表,确认不会重复发起业务请求。注册状态与关闭回调后,覆盖 programmatic、tap、timeout 和 hostDetached 四种原因,并在页面 dispose 时移除回调。自定义 widget 与动画要在小屏、键盘和深色主题下检查。升级 3.x 到 4.0.2 时先对照迁移指南,再执行 Flutter widget 测试和真实设备启动测试。

在路由与异常中验证浮层

测试路由切换期间调用 dismiss、应用退到后台、网络请求抛异常和页面被销毁,确认浮层不会永久停留。showProgress 覆盖 0.0、0.5、1.0 和进度倒退。对 EasyLoadingOptions 覆盖颜色、padding、indicatorSize、radius 和 fontSize,观察长文本是否溢出。已有 root builder 时测试 `init(builder: ...)`,确认主题、路由和 Overlay 没被覆盖。多个 Overlay 或嵌套 Navigator 只保留一个根 Host。升级 3.x 到 4.0.2 后执行 widget 测试和 Android、iOS、Web 启动测试。 EasyLoading 验收覆盖真实异步链路。页面发起请求后依次显示加载、进度和结果,成功、失败、超时都 await dismiss。路由销毁和 Host detached 时检查回调是否移除。遮罩期间点击底层控件,记录是否重复提交。长状态文本、横屏、小屏和 Web 窗口检查尺寸。升级到 4.0.2 对照 MIGRATION.md,并在 Android、iOS、Web 分别启动。验收记录还要包含输入、输出、错误和恢复四类结果。先用最小样本确认主路径,再增加并发、长文本、权限变化或网络中断,避免只验证成功截图。每次测试固定版本并保存日志摘要,失败时写清复现条件和回退动作。素材没有说明的功能保持未知,不用项目热度替代证据。EasyLoading 的验证还应检查 Host 生命周期与异步关闭。 失败时保留日志并回到已验证版本。验收时先记录当前版本、运行环境和输入样本,再记录成功输出、错误信息、日志位置和回退版本。成功路径至少重复两次,确认结果不是偶然缓存。失败路径要主动制造一次网络中断、权限拒绝、资源不足或参数错误,观察工具是否给出可定位的提示。恢复后重新执行同一输入,比较输出是否完整,确认失败过程没有留下损坏文件、错误状态或泄露凭据。测试记录只保留必要摘要,不上传账号信息、密钥、Cookie、真实用户数据和受限内容。项目 README 没有明确写出的能力继续标为未知,不能用相邻项目的经验补成结论。上线前将这些结果交给实际维护者复核,按版本发布说明逐项确认,发现差异就锁定当前版本并保留回退路径。还要在失败后恢复同一环境,比较前后输出,确认回退路径有效。再次验证时固定输入和输出,记录命令、版本、错误码、日志和恢复结果。不要把一次成功运行写成性能保证,也不要把未说明的兼容关系补成事实。继续观察资源消耗、输出完整性和异常后的清理状态,确认结果可重复。将测试样本、配置快照与版本发布记录一并保存,便于后续升级时逐项比较。若环境或输入改变,重新执行验证,不沿用旧结论。并核对恢复后的结果与首次输出一致,异常时保留可回退配置。完成后再决定是否采用。

編輯結論

适合需要在 Flutter 多层业务代码中统一显示加载状态、又不想层层传递 BuildContext 的应用;不适合要求复杂页面级状态编排或不愿引入根级浮层 Host 的项目。先确认 Dart 3.6 至 4.0、Flutter 3.27 以上,在 MaterialApp 或 CupertinoApp 中挂载 `EasyLoading.init()`,再验证异步关闭、遮罩交互、回调清理和 4.0 迁移行为。

官方來源

  1. Official documentation
  2. Official README
  3. Project repository
  4. Release notes
社群筆記

社群筆記