新增:community feature 数据层——契约 v1.3.0 十九操作全覆盖 + ToggleSync 乐观更新状态机(T3-12)
CI / flutter-gates (push) Successful in 2m26s
CI / flutter-gates (push) Successful in 2m26s
- community_models:community/media 域 DTO 逐字段照冻结契约手写 JSON 映射 (Post/FeedCard/PostComment/AuthorSummary 降级形态/媒体两步上传凭据等), 未知枚举抛 FormatException 暴露契约漂移;CursorPage 上移 core 复用 - community_repository:13 路径 19 操作全覆盖;createPost/createComment 必带 Idempotency-Key(每次逻辑提交换新键、刷新重放同键);点赞/收藏/ 关注走 PUT/DELETE 语义幂等 - community_exceptions:v1.3.0 新增 9 码 + 40902 共码类型化异常映射 - toggle_sync:乐观翻转 + 快照回滚 + 单飞合并最终意图 + 代次守卫, 点赞/收藏共用一套参数化状态机,权威终态对账收敛 - community_controller:Feed 多页缓存 + 首屏四态 + 尾部加载三态 + 游标拼接 + 刷新代次丢弃旧尾页;详情副本与卡片互动状态同源;reset 清态 - app.dart 装配:community 服务分端口直连(:8084),共享 TokenRefresher, 登出同步 reset - 测试 286 → 347(模型映射 / 19 操作线路 / 错误映射 / 竞态序列全覆盖) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
+26
-1
@@ -12,6 +12,8 @@ import 'package:patbond_flutter/features/auth/auth_repository.dart';
|
||||
import 'package:patbond_flutter/features/auth/login_page.dart';
|
||||
import 'package:patbond_flutter/features/auth/session_manager.dart';
|
||||
import 'package:patbond_flutter/features/auth/splash_page.dart';
|
||||
import 'package:patbond_flutter/features/community/community_controller.dart';
|
||||
import 'package:patbond_flutter/features/community/community_repository.dart';
|
||||
import 'package:patbond_flutter/features/main/main_shell_page.dart';
|
||||
import 'package:patbond_flutter/features/pets/health_record_analytics.dart';
|
||||
import 'package:patbond_flutter/features/pets/pet_analytics.dart';
|
||||
@@ -25,12 +27,14 @@ class App extends StatefulWidget {
|
||||
this.sessionManager,
|
||||
this.authRepository,
|
||||
this.petsRepository,
|
||||
this.communityRepository,
|
||||
});
|
||||
|
||||
/// 测试注入口;生产默认走安全存储 + 真实 API。
|
||||
final SessionManager? sessionManager;
|
||||
final AuthRepository? authRepository;
|
||||
final PetsRepository? petsRepository;
|
||||
final CommunityRepository? communityRepository;
|
||||
|
||||
@override
|
||||
State<App> createState() => _AppState();
|
||||
@@ -41,6 +45,7 @@ class _AppState extends State<App> {
|
||||
late final SessionManager sessionManager;
|
||||
late final AuthRepository authRepository;
|
||||
late final PetsController petsController;
|
||||
late final CommunityController communityController;
|
||||
late final PetAnalytics petAnalytics;
|
||||
late final HealthRecordAnalytics healthRecordAnalytics;
|
||||
late final SessionTracker _sessionTracker;
|
||||
@@ -88,6 +93,10 @@ class _AppState extends State<App> {
|
||||
petsController = PetsController(
|
||||
repository: widget.petsRepository ?? _buildPetsRepository(),
|
||||
);
|
||||
// T3-12 只装配数据层;Feed segment 的 UI 接线在 T3-14 挂入主壳。
|
||||
communityController = CommunityController(
|
||||
repository: widget.communityRepository ?? _buildCommunityRepository(),
|
||||
);
|
||||
petAnalytics = PetAnalytics(_analytics.trackEvent);
|
||||
healthRecordAnalytics = HealthRecordAnalytics(_analytics.trackEvent);
|
||||
|
||||
@@ -143,6 +152,20 @@ class _AppState extends State<App> {
|
||||
return ApiPetsRepository(api: api);
|
||||
}
|
||||
|
||||
/// community 服务分端口直连(:8084),token 刷新单飞经共享 [TokenRefresher]。
|
||||
CommunityRepository _buildCommunityRepository() {
|
||||
final dio = buildPatbondDio(
|
||||
session: sessionManager,
|
||||
baseUrl: patbondCommunityApiBaseUrl,
|
||||
);
|
||||
final api = ApiClient(
|
||||
dio: dio,
|
||||
session: sessionManager,
|
||||
refresher: _ensureRefresher(),
|
||||
);
|
||||
return ApiCommunityRepository(api: api);
|
||||
}
|
||||
|
||||
AnalyticsPageName? _resolveRootPage() {
|
||||
// 回栈到无名根路由时解析当前认证状态页/主壳 Tab
|
||||
return switch (sessionManager.status) {
|
||||
@@ -153,9 +176,10 @@ class _AppState extends State<App> {
|
||||
}
|
||||
|
||||
void _reportAuthStateChange() {
|
||||
// 登出即清宠物档案内存副本(跨账号不泄漏;重登后列表页重新拉取)。
|
||||
// 登出即清宠物档案与社区 Feed 内存副本(跨账号不泄漏;重登后重新拉取)。
|
||||
if (sessionManager.status == AuthStatus.unauthenticated) {
|
||||
petsController.reset();
|
||||
communityController.reset();
|
||||
}
|
||||
// 认证状态机切页补点(03 §3.2 非路由曝光 1/2)
|
||||
final page = switch (sessionManager.status) {
|
||||
@@ -173,6 +197,7 @@ class _AppState extends State<App> {
|
||||
WidgetsBinding.instance.removeObserver(_sessionTracker);
|
||||
appState.dispose();
|
||||
petsController.dispose();
|
||||
communityController.dispose();
|
||||
if (widget.sessionManager == null) sessionManager.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user