Dart/Flutter 模式¶
使用时机¶
在以下情况下使用此技能: - 开始新的 Flutter 功能,需要状态管理、导航或数据访问的惯用模式 - 需要审查或编写 Dart 代码,并获取关于空安全性、密封类型和异步结构的指导 - 设置新的 Flutter 项目,并在 BLoC、Riverpod 或 Provider 中进行选择 - 实现安全的 HTTP 客户端、WebView 集成和本地存储 - 为 Flutter 小部件、Cubit 或 Riverpod 提供者编写测试 - 使用认证守卫接入 GoRouter
工作原理¶
此技能提供按关注点组织的、可直接复制粘贴的 Dart/Flutter 代码模式:
1. 空安全性 — 避免使用 !,优先使用 ?./??/模式匹配
2. 不可变状态 — 密封类型、freezed、copyWith
3. 异步结构 — 并行 Future.wait、await 后的安全 BuildContext
4. 小部件架构 — 提取到类中(而不是方法)、const 传播、范围化重建
5. 状态管理 — BLoC/Cubit 事件、Riverpod 通知器及派生提供者
6. 导航 — 通过 refreshListenable 实现带响应式认证守卫的 GoRouter
7. 网络 — 带拦截器的 Dio、带一次性重试守卫的令牌刷新
8. 错误处理 — 全局捕获、ErrorWidget.builder、接入 crashlytics
9. 测试 — 单元测试(BLoC test)、小部件测试(ProviderScope 覆盖)、基于 mock 的 fake
示例¶
// シール状態 — 不可能な状態を防止
sealed class AsyncState<T> {}
final class Loading<T> extends AsyncState<T> {}
final class Success<T> extends AsyncState<T> { final T data; const Success(this.data); }
final class Failure<T> extends AsyncState<T> { final Object error; const Failure(this.error); }
// 反応型認証リダイレクト付きGoRouter
final router = GoRouter(
refreshListenable: GoRouterRefreshStream(authCubit.stream),
redirect: (context, state) {
final authed = context.read<AuthCubit>().state is AuthAuthenticated;
if (!authed && !state.matchedLocation.startsWith('/login')) return '/login';
return null;
},
routes: [...],
);
有关详细信息,请参阅文档。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 ev/ECC