用途:该技能约束 Flutter 屏幕在无数据、无匹配、失败或写入返回时展示什么,以及每种反馈允许使用哪种界面。首帧/冷启动归 app-startup-and-bootstrap,错误值归 error-handling-typed-results,本技能只管渲染与播报。
主要能力与规则:屏幕只渲染 loading/empty/error/content 之一,由对 AsyncValue 或 sealed view state 的单一 switch 决定,禁止 isLoading、error、items 三个布尔字段。ViewModel 决定状态,View 只渲染,禁止在 widget 树中包裹仓库调用的 FutureBuilder/StreamBuilder。空、筛选为空、错误是三种不同屏幕,分别提供主操作、清除筛选、重试。不得渲染异常,需将 Failure.code 经 ARB 映射为本地化消息。每个错误状态都要有下一步操作,重试需保留滚动位置、筛选和输入。刷新时保留旧内容并显示轻量指示,不空白。加载用延迟约 150–300ms、形状匹配最终布局的骨架屏,而非居中转圈。进行中的操作在自身控件上显示进度,不覆盖全应用。反馈面按 inline < snackbar < banner < dialog 阶梯取最低可用者。用户必须处理的信息不能只放 Snackbar。优先软删除加撤销,而非确认对话框;不可逆操作才确认,并写明后果与数量,barrierDismissible: false。showDialog/showModalBottomSheet 返回 Future<T?>,null 表示关闭,需显式处理,禁止 ?? true。await 前捕获 ScaffoldMessenger/Navigator,之后检查 mounted。状态变化用 liveRegion 或 SemanticsService.announce 播报,accessibleNavigation 为真时延长或取消自动消失。
使用方式:在 Flutter 项目中按上述规则编写屏幕状态与反馈代码,示例见 examples/async_state_view.dart。
适用场景:需要统一处理加载、空、错误、内容状态及写入后反馈的 Flutter 界面。
限制:具体时长属于设计系统 token,不应硬编码;播报为尽力而为,不能作为重要信息的唯一渠道。相关技能包括 state-management-riverpod、error-handling-typed-results、async-safety、widget-composition、accessibility-as-code、motion-and-haptics、i18n-rtl-l10n、app-startup-and-bootstrap、widget-golden-and-a11y-testing、design-system-structure。