/// page_viewed 的 pageName 编译期枚举(06 号报告 §5.2 字典 v2 + 03 号评估 /// §3.2 Tab 映射)。禁止自由路由字符串;带参数路由必须归一化,任何 /// UUID/ID 不得出现在 pageName 或 referrer 中(隐私红线第 5 条)。 /// /// 尚不存在的 M2 页面(petList/petDetail/petForm/recordForm/recordDetail) /// 先留枚举定义、不接线,待健康档案页面族落地时启用。 enum AnalyticsPageName { // —— 字典 v2 初始集合(06 §5.2 验收 2)—— login('login'), register('register'), home('home'), profile('profile'), petList('pet_list'), petDetail('pet_detail'), petForm('pet_form'), recordForm('record_form'), recordDetail('record_detail'), // —— 客户端现存页面/Tab 补充(03 §3.2 Tab 映射,需数据侧同步进字典)—— create('create'), petArchive('pet_archive'), services('services'), postDetail('post_detail'); const AnalyticsPageName(this.pageName); /// 上报值,snake_case,与 RouteSettings.name 一致。 final String pageName; static final Map _byName = { for (final page in values) page.pageName: page, }; /// 路由名 → 枚举;不在枚举内返回 null(调用方不上报,06 §5.2 验收 4)。 static AnalyticsPageName? fromRouteName(String? name) => name == null ? null : _byName[name]; }