import 'package:flutter/widgets.dart'; import 'package:patbond_flutter/analytics/analytics_page_name.dart'; import 'package:patbond_flutter/analytics/page_view_tracker.dart'; /// 集中式 page_viewed 路由埋点(03 号评估 §3.2:NavigatorObserver 派生, /// 页面零侵入;06 号报告 §5.2 验收 1/4)。 /// /// 只统计 [PageRoute](bottom sheet / dialog 是 PopupRoute,不计曝光); /// 路由名不在 [AnalyticsPageName] 枚举内不上报(后端会整条 rejected, /// 不白白消耗队列)。didPop 补报「回退后重新曝光的前一页」;弹回到 /// 无名根路由(认证状态机的 AnimatedSwitcher 宿主)时经 [resolveRootPage] /// 解析当前根部页面。 class AnalyticsRouteObserver extends NavigatorObserver { AnalyticsRouteObserver({required this.tracker, this.resolveRootPage}); final PageViewTracker tracker; /// 根路由(无 RouteSettings.name)当前展示页的解析器,由 app.dart /// 按认证状态与主壳当前 Tab 提供;返回 null 则不补报。 final AnalyticsPageName? Function()? resolveRootPage; void _reportRoute(Route? route) { if (route is! PageRoute) return; final page = AnalyticsPageName.fromRouteName(route.settings.name); if (page != null) tracker.report(page); } @override void didPush(Route route, Route? previousRoute) { _reportRoute(route); } @override void didReplace({Route? newRoute, Route? oldRoute}) { _reportRoute(newRoute); } @override void didPop(Route route, Route? previousRoute) { if (previousRoute is! PageRoute) return; final page = AnalyticsPageName.fromRouteName(previousRoute.settings.name); if (page != null) { tracker.report(page); } else if (previousRoute.isFirst) { final rootPage = resolveRootPage?.call(); if (rootPage != null) tracker.report(rootPage); } } }