新增:发布页真实化——媒体九宫格编辑态 + 建草稿/迁移发布两步 + 发布漏斗与媒体三段埋点,create 页 demo 发布流退役(T3-17)
CI / flutter-gates (push) Successful in 3m9s
CI / flutter-gates (push) Successful in 3m9s
- 新增 PostComposePage(P3 发布页,push 路由 post_form):正文/类目 (general·help)/九宫格选图(组装 MediaUploader + UploadProgressOverlay, 删格按列表序重发 position)/发布 gating(正文非空 + 在场媒体全 ready) - 发布走「createPost(draft) → PATCH status=published」两步:迁移失败时草稿 已在服务端,UI 明确提示「草稿已保存」;40905 重置幂等键、42203 提示等图、 网络失败同键重放不重复建帖;40902 自动取新 version 重提一次 - 草稿:「存草稿」(manual) 与「取消 → 保留」(on_exit) 两路径 + 进页恢复最新 一条草稿(提示条/清空);「不保留」软删服务端草稿(post_deleted 触点) - 埋点:新增 post_analytics.dart(发布漏斗五事件 + 媒体三段,键集对齐字典 v3);MediaUploader 挂接 started/succeeded/failed(含 cancelled) 与 attemptSeq; pageName 枚举补 post_form - PostMediaEditGrid(同文件编辑态):3 列九宫格 + 虚线「+」格 + 删除角标 + 进度覆盖层 + 失败整格重试;页级上传汇总条 - create 页只余 AI 生成模拟(M4 原样保留),demo 发布流与 AppState.posts / publishPost / updatePost 及其持久化一并退役;首页 story「发布」与 Feed 空态 CTA 改为 push 真实发布页 - 测试 458 → 502(+44):发布页 widget 22、发布埋点 11、媒体三段 7、编辑态 九宫格 4、主壳发布闭环 1;另加桌面真链路 integration_test(env 门控) - flutter analyze 0 问题、dart format 无 diff;compose 六容器真链路实测通过 (选图上传 → 发布 → Feed 置顶 → 第二客户端可见) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:patbond_flutter/analytics/analytics_page_name.dart';
|
||||
import 'package:patbond_flutter/analytics/page_view_tracker.dart';
|
||||
@@ -5,6 +7,9 @@ import 'package:patbond_flutter/core/theme/app_theme.dart';
|
||||
import 'package:patbond_flutter/features/community/community_controller.dart';
|
||||
import 'package:patbond_flutter/features/community/community_interaction_analytics.dart';
|
||||
import 'package:patbond_flutter/features/community/feed_analytics.dart';
|
||||
import 'package:patbond_flutter/features/community/media_uploader.dart';
|
||||
import 'package:patbond_flutter/features/community/post_analytics.dart';
|
||||
import 'package:patbond_flutter/features/community/post_compose_page.dart';
|
||||
import 'package:patbond_flutter/features/create/create_page.dart';
|
||||
import 'package:patbond_flutter/features/home/home_page.dart';
|
||||
import 'package:patbond_flutter/features/pets/health_record_analytics.dart';
|
||||
@@ -28,6 +33,8 @@ class MainShellPage extends StatefulWidget {
|
||||
this.healthRecordAnalytics,
|
||||
this.feedAnalytics,
|
||||
this.interactionAnalytics,
|
||||
this.postAnalytics,
|
||||
this.mediaUploaderFactory,
|
||||
this.pageViewTracker,
|
||||
this.onLogout,
|
||||
});
|
||||
@@ -55,6 +62,12 @@ class MainShellPage extends StatefulWidget {
|
||||
/// 互动域埋点(T3-16 评论成败对 + 关注对;详情页消费)。
|
||||
final CommunityInteractionAnalytics? interactionAnalytics;
|
||||
|
||||
/// post 域埋点(T3-17 发布漏斗五事件 + 媒体三段;发布页消费)。
|
||||
final PostAnalytics? postAnalytics;
|
||||
|
||||
/// 发布页 [MediaUploader] 构造口(桌面实测 / 测试替换选图与压缩层)。
|
||||
final MediaUploaderFactory? mediaUploaderFactory;
|
||||
|
||||
/// Tab 曝光补点(IndexedStack 切换不产生路由事件,03 号评估 §3.2)。
|
||||
final PageViewTracker? pageViewTracker;
|
||||
|
||||
@@ -117,6 +130,28 @@ class _MainShellPageState extends State<MainShellPage> {
|
||||
);
|
||||
}
|
||||
|
||||
/// 发布页(T3-17:真实发布链路)。发布成功后回首页 Feed 并整体刷新,
|
||||
/// 新帖按 `(published_at DESC, id DESC)` 落在首位(跨客户端同一序)。
|
||||
Future<void> openCompose(PostEntryPoint entryPoint) async {
|
||||
final published = await Navigator.of(context).push<bool>(
|
||||
MaterialPageRoute<bool>(
|
||||
settings: RouteSettings(name: AnalyticsPageName.postForm.pageName),
|
||||
builder: (context) => PostComposePage(
|
||||
controller: widget.communityController,
|
||||
entryPoint: entryPoint,
|
||||
analytics: widget.postAnalytics,
|
||||
uploaderFactory: widget.mediaUploaderFactory,
|
||||
),
|
||||
),
|
||||
);
|
||||
if (!mounted || published != true) return;
|
||||
selectTab(0);
|
||||
unawaited(widget.communityController.refresh());
|
||||
ScaffoldMessenger.of(
|
||||
context,
|
||||
).showSnackBar(const SnackBar(content: Text('已发布,去首页看看吧 🐾')));
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return AnimatedBuilder(
|
||||
@@ -135,14 +170,13 @@ class _MainShellPageState extends State<MainShellPage> {
|
||||
feedAnalytics: widget.feedAnalytics,
|
||||
isActive: currentIndex == 0,
|
||||
onOpenServices: openServices,
|
||||
onOpenCreate: () => selectTab(1),
|
||||
onOpenCompose: () => openCompose(PostEntryPoint.feed),
|
||||
onOpenPost: openPost,
|
||||
),
|
||||
CreatePage(
|
||||
appState: widget.appState,
|
||||
// demo 详情页已退役(T3-15):demo 发布流不再导航详情,
|
||||
// 回首页 Feed;发布页真实化随 T3-17 收编。
|
||||
onPublished: (_) => selectTab(0),
|
||||
// T3-17:发布半边已真实化(发布页 push),AI 生成模拟原样留 M4。
|
||||
onOpenCompose: () => openCompose(PostEntryPoint.createTab),
|
||||
),
|
||||
PetsPage(
|
||||
controller: widget.petsController,
|
||||
|
||||
Reference in New Issue
Block a user