import 'package:patbond_flutter/analytics/analytics_page_name.dart'; /// trackEvent 形状的回调(生产传 `AnalyticsService.trackEvent`,测试传录制桩)。 typedef TrackEventFn = Future Function(String eventName, [Map? props]); /// page_viewed 上报的单一出口:维护 referrer 链与去重。 /// /// 路由事件(AnalyticsRouteObserver)、主壳 Tab 切换、认证状态机切页 /// 三类曝光都经此上报,referrer(前一页 pageName)才能跨机制连贯; /// 栈底/冷启动首页 referrer 为 null(06 §5.2 验收 3)。 class PageViewTracker { PageViewTracker(this._track); final TrackEventFn _track; String? _lastPageName; AnalyticsPageName? _currentTab; /// 主壳当前 Tab(供回栈补报解析根路由曝光页)。 AnalyticsPageName? get currentTab => _currentTab; /// 上报一次页面曝光;与上一条相同的页面去重(Tab 重复点选等)。 void report(AnalyticsPageName page) { if (page.pageName == _lastPageName) return; final referrer = _lastPageName; _lastPageName = page.pageName; final props = {'pageName': page.pageName}; if (referrer != null) props['referrer'] = referrer; _track('page_viewed', props); } /// 主壳 Tab 曝光:记录当前 Tab 后上报(IndexedStack 无路由事件,手动补点)。 void reportTab(AnalyticsPageName page) { _currentTab = page; report(page); } }