Files
VibeCoding/webrtc_controller_flutter/AGENTS.md
tongtongstudio 1918e5738e docs: add project AGENTS.md and Flutter AGENTS.md, fix appName
- 添加根目录 AGENTS.md 定义全仓工程总览及各端开发规范
- 添加 webrtc_controller_flutter/AGENTS.md 定义 Flutter 项目技术栈、架构与编码规范
- 修正 WebRTCController app/build.gradle 中 appName 返回值
2026-08-03 15:37:47 +08:00

166 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Flutter 项目规范
> 严格遵循本文档定义的架构模式、状态管理标准和代码风格。未经授权不得引入新的第三方包或架构模式。优先组合而非继承,业务逻辑不进入 UI 组件。
---
## 1. 技术栈
- **语言:** DartSDK >=3.0.0,严格空安全)
- **框架:** Flutter最新稳定通道
- **状态管理:** `flutter_riverpod`v2.x注解 + 代码生成)
- **路由:** `go_router`
- **网络请求:** `dio`(配合 `json_annotation` + `freezed` 进行 JSON 序列化)
- **数据模型:** `freezed` + `build_runner`
- **本地存储:** `hive` / `shared_preferences`
- **依赖注入:** Riverpod Providers不使用 GetIt
- **国际化:** `flutter_localizations`l10n / ARB 格式)
---
## 2. 目录结构
采用 **特性优先架构Feature-First**,特性内部结合 **整洁架构Clean Architecture** 分层:
```text
lib/
├── app/ # 全局应用配置
│ ├── app.dart # MaterialApp 入口
│ ├── router/ # 路由定义GoRouter
│ ├── theme/ # 主题、颜色、排版
│ └── constants/ # 全局常量、API 端点
├── core/ # 跨特性共享代码
│ ├── network/ # Dio 客户端、拦截器、错误处理
│ ├── storage/ # 本地存储辅助工具
│ ├── utils/ # 辅助函数、扩展方法
│ └── widgets/ # 共享 UI 组件(按钮、输入框)
├── features/ # 特性模块
│ ├── auth/ # 示例:认证模块
│ │ ├── data/ # 数据源、API 端点、DTO
│ │ ├── domain/ # 领域模型、仓库接口
│ │ └── presentation/ # UI 页面、组件、控制器
│ │ ├── controllers/
│ │ ├── pages/
│ │ └── widgets/
│ └── home/ # 示例:首页模块
│ ├── data/
│ ├── domain/
│ └── presentation/
├── l10n/ # 国际化(.arb 文件)
└── main.dart # 应用入口
```
---
## 3. 分层职责
### 表示层(`presentation/`
UI 组件 + Riverpod Notifier / AsyncNotifier 控制器。
- 只能通过 `ref.watch``ref.listen` 消费状态。
- 禁止在 `onPressed``build()` 中直接调用 API 或编写业务逻辑。
### 领域层(`domain/`
纯 Dart 领域实体(`@freezed`)和仓库接口定义。
- 零 Flutter/UI 依赖。
### 数据层(`data/`
实现仓库接口,通过 Dio 处理 API 请求,将 JSON DTO 映射为领域实体。
---
## 4. 编码规范
### 状态管理Riverpod
- 使用 `@riverpod` 注解 + `build_runner` 代码生成。
- 异步操作优先使用 `AsyncNotifierProvider`,配合 `AsyncValue`Loading / Data / Error
```dart
@riverpod
class UserProfileController extends _$UserProfileController {
@override
FutureOr<User?> build() async {
return _fetchUser();
}
Future<void> updateName(String newName) async {
state = const AsyncValue.loading();
state = await AsyncValue.guard(
() => ref.read(userRepositoryProvider).updateName(newName),
);
}
}
```
### 数据建模freezed
所有数据类/实体必须用 `freezed` 实现不可变,并配置嵌套 JSON 映射:
```dart
import 'package:freezed_annotation/freezed_annotation.dart';
part 'user_model.freezed.dart';
part 'user_model.g.dart';
@freezed
class UserModel with _$UserModel {
const factory UserModel({
required String id,
required String email,
String? name,
}) = _UserModel;
factory UserModel.fromJson(Map<String, dynamic> json) =>
_$UserModelFromJson(json);
}
```
### UI 组件
- 尽可能使用 `const` 构造函数,避免不必要的重建。
- 复杂子树提取为独立私有/公有无状态组件,不要写冗长的内联辅助方法(如 `_buildHeader()`)。
- 响应式适配使用 `LayoutBuilder` / `MediaQuery` 或项目统一的屏幕适配工具。
---
## 5. 命名约定
| 类别 | 规范 | 示例 |
|---|---|---|
| 文件/文件夹 | `snake_case.dart` | `user_profile.dart` |
| 类/枚举 | `PascalCase` | `UserProfilePage` |
| 变量/方法 | `camelCase` | `getUserData()` |
| Provider | 以 `Provider` 结尾 | `userRepositoryProvider` |
| 私有成员 | `_` 前缀 | `_handleTap()` |
---
## 6. 代码生成
修改或新增带代码生成的模型/控制器后,运行:
```bash
# 一次性生成
flutter pub run build_runner build --delete-conflicting-outputs
# 监听模式
flutter pub run build_runner watch --delete-conflicting-outputs
```
---
## 7. 完成标准
- 新文件遵循特性优先结构。
- 代码为空安全、完全类型化,并进行 `const` 优化。
- 对应创建数据层、领域层和表示层组件。
- 不存在原始 `setState`(状态统一由 Riverpod 管理)。