QMox / dev · f079dcc / 2026-10-23源码对照与覆盖清单
以当前代码还原现有交互,保留 TODO 和未接入状态。点击条目可回到 H5 页面。
66 源码页面/容器
65 路由声明
207 组交互映射
上述计数不是分支覆盖率。真实接口数据、原生系统能力使用模拟;尚未完成 Flutter 真机视觉与系统集成等价验收。详细范围见覆盖清单。
66 个页面条目
lib/pages/auth/check_email_page.dart路由:/check-email
H5:pages.js:35 · 源文件 249 行
- 重置邮件提示、重新发送和冷却
- 返回登录;本页作为路由组件预览
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_startCountdown · 第 41 行_handleResend · 第 61 行
- :96
onTap: () { - :100
context.go('/forgot-password'); - :195
onPressed: _canResend ? _handleResend : null, - :222
onTap: () => context.go('/login'),
lib/pages/auth/forgot_password_page.dart路由:/forgot-password
H5:pages.js:34 · 源文件 808 行
- 手机号/邮箱切换与获取验证码
- 新密码与确认密码校验
- 成功返回登录;错误时保留表单
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_withTestId · 第 28 行_buildAccountTypeToggle · 第 506 行_buildAccountTypeItem · 第 536 行_buildAccountField · 第 564 行_handleSendCode · 第 728 行_handleSubmit · 第 777 行
- :210
validator: (value) { - :223
onPressed: (_secondsLeft > 0 || _isSendingCode) ? null : _handleSendCode, - :290
onPressed: () { - :297
validator: (value) { - :350
onPressed: () { - :357
validator: (value) { - :376
onPressed: _isSubmitting ? null : _handleSubmit, - :455
context.go('/login'); - :480
onTap: () { - :484
context.go('/login'); - :521
onTap: () => setState(() => _isPhoneReset = true), - :528
onTap: () => setState(() => _isPhoneReset = false), - :542
onTap: onTap, - :606
validator: (value) => Validators.validatePhone(value, l10n: l10n, countryCode: _effectiveCountryCode), - :616
onTap: () async { - :685
validator: (value) => Validators.validatePhone(value, l10n: l10n, countryCode: _effectiveCountryCode), - :720
validator: (value) => Validators.validateEmail(value, l10n: l10n), - :796
context.go('/login');
lib/pages/auth/login_page.dart路由:组件直接构造/导航容器
H5:pages.js:32 · 源文件 2011 行
- 国内手机号/邮箱、密码/短信验证码切换
- 账号格式、密码长度、协议勾选和验证码校验
- 记住账号演示;登录成功与初始化分流
- 第三方已关联/待绑定手机的模拟返回
- FAQ、账号服务地区切换、登录失效
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:login-draft:切换验证码/密码、进入协议再返回后,账号、密码输入与协议勾选保持
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_withTestId · 第 91 行_showSessionExpiredNotice · 第 180 行_loadRememberedUser · 第 213 行_captureCurrentDraft · 第 229 行_restoreDraftForMode · 第 241 行_applyRememberedCredentials · 第 251 行_initWechatInstalled · 第 309 行_syncAccountModeWithRegion · 第 320 行_ensurePrivacyReady · 第 348 行_ensureConsentForAction · 第 356 行_handleAuthTermsToggle · 第 370 行_buildLoginForm · 第 569 行_switchLoginMode · 第 614 行_buildAccountTypeToggle · 第 645 行_buildAccountTypeItem · 第 682 行_buildAccountField · 第 730 行_buildPasswordField · 第 905 行_buildPasswordInput · 第 922 行_buildSmsCodeInput · 第 973 行_buildSecondaryActionsRow · 第 1021 行_buildRememberMeCheckbox · 第 1042 行_buildCodeLoginToggle · 第 1101 行_buildForgotPasswordLink · 第 1134 行_sendLoginCode · 第 1157 行_buildSignInButton · 第 1211 行_buildAgreeTermsRow · 第 1268 行_buildDivider · 第 1365 行_hasThirdPartyLoginOptions · 第 1381 行_buildThirdPartyLogin · 第 1388 行_buildCircularSocialButton · 第 1491 行_handleWeChatLogin · 第 1512 行_buildSignUpLink · 第 1539 行_buildLoginOptionsHelpLink · 第 1564 行_handleLogin · 第 1582 行_handleAppleLogin · 第 1644 行_handleSocialLogin · 第 1679 行_completeLogin · 第 1733 行_showHelpDialog · 第 1828 行_showFAQSheet · 第 1832 行_showLoginHelpSheet · 第 1840 行_showDirectSwitchToMainland · 第 1860 行_showRegionSelectionSheet · 第 1989 行
- :489
onTap: () { - :493
context.go('/'); - :518
onTap: _showHelpDialog, - :662
onTap: () async { - :672
onTap: () async { - :691
onTap: onTap, - :748
validator: (value) => Validators.validatePhone(value, l10n: l10n, countryCode: _effectiveCountryCode), - :785
onTap: () async { - :833
validator: (value) => Validators.validatePhone(value, l10n: l10n, countryCode: _effectiveCountryCode), - :872
validator: (value) => Validators.validateEmail(value, l10n: l10n), - :929
validator: (value) { - :955
onPressed: () { - :984
validator: (value) { - :1006
onPressed: _secondsLeft > 0 || _isSendingCode ? null : _sendLoginCode, - :1081
onTap: () => toggleRememberMe(!_rememberMe), - :1090
onTap: () => toggleRememberMe(!_rememberMe), - :1114
onPressed: () { - :1138
onPressed: () => context.push('/forgot-password'), - :1243
onTap: _isEmailLoginLoading ? null : () async { - :1296
onTap: () async { - :1400
onPressed: (_isEmailLoginLoading || _isThirdPartyLoading) ? null : _handleAppleLogin, - :1432
onPressed: (_isEmailLoginLoading || _isThirdPartyLoading) ? null : _handleWeChatLogin, - :1466
onPressed: _handleWeChatLogin, - :1496
onTap: (_isEmailLoginLoading || _isThirdPartyLoading) ? null : onPressed, - :1553
context.push('/register'); - :1568
onTap: _showLoginHelpSheet, - :1716
context.go('/social-bind-phone', extra: pending); - :1776
context.push('/welcome'); - :1786
context.go('/main/me'); - :1819
context.go('/'); - :1835
onRegionSelectionTap: _showRegionSelectionSheet, - :1854
context.push('/forgot-password'); - :1864
final confirmed = await showModalBottomSheet<bool>( - :1894
onPressed: () => Navigator.of(dialogContext).pop(false), - :1923
onPressed: () => Navigator.of(dialogContext).pop(true), - :1946
onPressed: () => Navigator.of(dialogContext).pop(false),
lib/pages/auth/onboarding_page.dart路由:组件直接构造/导航容器
H5:pages.js:31 · 源文件 357 行
- 登录与注册入口
- 隐藏内部环境入口仅展示说明,不复现内部密码
内部环境切换为源码已有隐藏入口,在原型中以说明代替。不复制服务配置或内部口令。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
- :78
onTap: () { - :139
onPressed: () { - :140
context.push('/login'); - :180
onPressed: () { - :181
context.push('/register'); - :261
showDialog<void>( - :315
onPressed: () => Navigator.of(ctx).pop(), - :319
onPressed: () async {
lib/pages/auth/register_page.dart路由:组件直接构造/导航容器
H5:pages.js:33 · 源文件 1379 行
- 国内手机号/邮箱;国际邮箱
- 密码确认、短信码、协议勾选校验
- 注册成功进入 welcome;地区切换
- 接口失败不写入模拟账户
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_withTestId · 第 83 行_loadRememberMe · 第 139 行_ensurePrivacyReady · 第 147 行_syncAccountModeWithRegion · 第 155 行_ensureConsentForAction · 第 177 行_handleAuthTermsToggle · 第 201 行_buildRegisterForm · 第 379 行_buildAccountTypeToggle · 第 437 行_buildAccountTypeItem · 第 484 行_buildAccountField · 第 533 行_buildPasswordField · 第 744 行_buildConfirmPasswordField · 第 788 行_buildRememberMeCheckbox · 第 832 行_buildRegisterSmsRow · 第 865 行_buildCreateAccountButton · 第 976 行_buildLegalText · 第 1014 行_buildSignInLink · 第 1130 行_buildAccountServiceRegionEntry · 第 1158 行_showRegionSelectionSheet · 第 1190 行_kickOffPostRegisterInit · 第 1213 行_handleEmailRegister · 第 1225 行_showHelpDialog · 第 1353 行_showFAQSheet · 第 1357 行_showLoginHelpSheet · 第 1365 行
- :319
onTap: () { - :323
context.go('/'); - :346
onTap: _showHelpDialog, - :454
onTap: () async { - :469
onTap: () async { - :493
onTap: onTap, - :585
validator: (value) { - :596
onTap: () async { - :685
validator: (value) { - :734
validator: (value) { - :778
validator: (value) { - :822
validator: (value) { - :915
onPressed: _secondsLeft > 0 || _isSendingCode - :988
onTap: _isLoading ? null : () async { - :1016
onTap: () async { - :1054
onTap: () { - :1078
onTap: () { - :1102
onTap: () { - :1148
context.push('/login'); - :1164
onTap: _showRegionSelectionSheet, - :1285
context.push('/welcome'); - :1292
context.push('/login'); - :1339
context.push('/welcome'); - :1360
onRegionSelectionTap: _showRegionSelectionSheet, - :1369
context.push('/login'); - :1374
context.push('/forgot-password');
lib/pages/auth/social_bind_phone_page.dart路由:/social-bind-phone
H5:pages.js:36 · 源文件 439 行
- 手机号、验证码校验
- 验证并绑定后进入欢迎/主页面
- 第三方身份与授权均模拟
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_debugLog · 第 30 行_buildPreviewCard · 第 260 行_sendCode · 第 293 行_submit · 第 335 行_completeLogin · 第 376 行
- :121
validator: (value) => Validators.validatePhone(value, l10n: L10n.of(context)), - :147
validator: (value) => Validators.validateCode(value, l10n: L10n.of(context)), - :170
onPressed: (_isSendingCode || _secondsLeft > 0) ? null : _sendCode, - :188
onPressed: _isSubmitting ? null : _submit, - :220
onTap: () { - :224
context.go('/login'); - :419
context.push('/welcome'); - :430
context.go('/'); - :437
context.go('/main/me');
lib/pages/auth/splash_page.dart路由:/splash
H5:pages.js:30 · 源文件 321 行
- 冷启动与隐私协议选择
- 未登录进入欢迎首页;登录后按家庭状态分流
- 初始化失败;登录失效;版本检查为模拟
真实启动动画和时序用“进入”控制演示;初始化、登录和家庭分流仍可走流程。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_debugLog · 第 34 行_isLoggedIn · 第 41 行_openWebView · 第 45 行_checkVersionAfterLogin · 第 53 行_isVersionNewer · 第 115 行
- :62
await showDialog<void>( - :84
onPressed: () async { - :173
context.go('/'); - :196
context.go('/login'); - :200
context.go('/init-error'); - :211
context.go('/login'); - :214
context.go('/init-error'); - :232
context.go('/setup-recovery'); - :234
context.go('/main/me'); - :243
context.go('/main/me'); - :245
context.go('/login'); - :247
context.go('/');
lib/pages/auth/welcome_page.dart路由:/welcome
H5:pages.js:37 · 源文件 195 行
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_buildOptionCard · 第 101 行
- :78
onTap: () => context.push('/main/add-guide'), - :91
onTap: () => context.push('/main/join-family?from=welcome'), - :166
onPressed: onTap,
lib/pages/common/init_error_page.dart路由:/init-error
H5:pages.js:38 · 源文件 222 行
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_debugLog · 第 22 行_retry · 第 32 行_backToLogin · 第 80 行
- :47
context.go('/login'); - :64
context.go('/main/me'); - :100
context.go('/login'); - :171
onPressed: _isRetrying ? null : _retry, - :198
onPressed: _isRetrying ? null : _backToLogin,
lib/pages/common/setup_recovery_page.dart路由:/setup-recovery
H5:pages.js:39 · 源文件 1227 行
- 无孩子无设备/有设备无孩子/有孩子无设备/未关联/已完成
- 全家庭存在任意孩子时允许主页面
- 绑定、添加、关联、加入家庭入口
- 切换账户;删除账户前置校验与两次确认
是否进主页面以所有家庭是否存在孩子判断,不要求已绑设备;同时保留当前家庭的五种恢复状态。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_refreshState · 第 59 行_navigateAndRefresh · 第 82 行_showQuickActionsMenu · 第 88 行_buildQuickActionsButton · 第 158 行_buildQuickActionMenuItem · 第 186 行_handleSwitchAccount · 第 241 行_canDeleteAccount · 第 270 行_showDeleteAccountBlockedMessage · 第 276 行_showDeleteAccountDialog · 第 286 行_sendDeleteAccountCode · 第 332 行_showVerificationCodeDialog · 第 365 行_showFinalConfirmDialog · 第 513 行_executeDeleteAccount · 第 582 行_buildSteps · 第 838 行_buildStepCard · 第 858 行_buildConnector · 第 994 行_buildJoinFamilyOption · 第 1011 行_getTitle · 第 1053 行_getDescription · 第 1068 行
- :72
context.go('/main/me'); - :83
await context.push(route, extra: extra); - :163
onTap: _showQuickActionsMenu, - :257
context.go('/login'); - :292
final confirmed1 = await showDialog<bool>( - :306
onPressed: () => Navigator.pop(context, false), - :313
onPressed: () => Navigator.pop(context, true), - :370
return showDialog<bool>( - :482
onPressed: isVerifying ? null : () => Navigator.pop(ctx), - :489
onPressed: isVerifying ? null : doVerify, - :518
await showDialog<void>( - :547
onPressed: isDeleting ? null : () => Navigator.pop(context), - :554
onPressed: controller.text == confirmText && !isDeleting - :625
context.go('/login'); - :670
onTap: () => context.go('/main/me'), - :759
onPressed: () => context.go('/main/me'), - :786
onPressed: () async { - :803
context.go('/login'); - :849
onTap: steps[i].onTap, - :965
onPressed: onTap, - :1034
onPressed: () => _navigateAndRefresh('/main/join-family?from=setup-recovery'), - :1092
onTap: () => _navigateAndRefresh('/main/link-to-child'), - :1118
onTap: () => _navigateAndRefresh('/main/me/add-child'), - :1148
onTap: () { - :1168
onTap: () {
lib/pages/common/web_view_page.dart路由:组件直接构造/导航容器
H5:pages.js:85 · 源文件 74 行
- 标题、返回、外部内容容器
- 不抓取或伪造现行协议;外部正文占位
- 模拟网页失败与重试
协议正文属于外部服务,未复制旧版协议或生成伪正文;仅还原容器、标题、返回和失败反馈。
浏览器:login-draft:切换验证码/密码、进入协议再返回后,账号、密码输入与协议勾选保持
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
lib/pages/guide/child_add_page.dart路由:组件直接构造/导航容器
H5:pages.js:42 · 源文件 867 行
- 设备卡片、步骤2/2、孩子姓名生日性别
- 必填、未来生日、头像格式反馈
- 保存后关联设备并进入设置完成
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_pickAndUploadAvatar · 第 148 行_isSupportedAvatarFile · 第 202 行_buildDeviceCard · 第 352 行_buildPhotoUpload · 第 417 行_buildNameField · 第 467 行_buildDateField · 第 523 行_selectBirthDate · 第 584 行_buildGenderField · 第 600 行_buildGenderButton · 第 629 行_buildContinueButton · 第 661 行_handleContinue · 第 701 行
- :161
showDialog(context: context, barrierDismissible: false, builder: (context) => const Center(child: CircularProgressIndicator())); - :325
onTap: () { - :329
context.go('/guide-pair-scan'); - :422
onTap: _pickAndUploadAvatar, - :510
validator: (value) { - :543
onTap: _selectBirthDate, - :632
onPressed: () { - :668
onPressed: _handleContinue, - :746
context.push('/setup-complete'); - :774
context.push('/setup-complete');
lib/pages/guide/device_connect_page.dart路由:/main/add-guide
H5:pages.js:40 · 源文件 928 行
- 引导扫码、相机权限、缩放、连接帮助
- 有效/下载App二维码/格式无效/缺SN/已绑定/地区不匹配
- 绑定后添加孩子;外设响应模拟
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_debugLog · 第 32 行_initializeScanner · 第 101 行_startCamera · 第 164 行_recreateScannerController · 第 186 行_stopCamera · 第 205 行_applyZoomScale · 第 215 行_showPermissionDialog · 第 241 行_buildTipBox · 第 463 行_buildScannerArea · 第 502 行_buildZoomControl · 第 613 行_buildBottomButton · 第 665 行_resolveBindableChildId · 第 670 行_handleScannedCode · 第 692 行_looksLikeUrl · 第 804 行_isOfficialDownloadAppQr · 第 808 行_showScannedDownloadAppQrDialog · 第 820 行_bindDevice · 第 885 行
- :245
final shouldOpen = await showDialog<bool>( - :257
onPressed: () => Navigator.of(context).pop(false), - :261
onPressed: () => Navigator.of(context).pop(true), - :443
onTap: () => context.pop(), - :786
context.push('/child-info', extra: extra); - :825
await showDialog<void>( - :832
onPressed: () => Navigator.of(context).pop(),
lib/pages/guide/help_connect_page.dart路由:/help-connect
H5:pages.js:41 · 源文件 463 行
- 连接排查步骤
- 6位激活码校验与配对
- 返回扫码与在线客服
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_handlePair · 第 29 行_buildStep · 第 407 行
- :49
context.push('/child-info', extra: { - :223
onTap: _isPairing ? null : _handlePair, - :280
onTap: () { - :282
context.push('/main/live-chat'); - :332
onTap: () { - :380
onTap: () { - :384
context.go('/login');
lib/pages/guide/setup_complete_page.dart路由:/setup-complete
H5:pages.js:45 · 源文件 323 行
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_debugLog · 第 20 行_buildFeatureList · 第 129 行_buildFeatureItem · 第 184 行_buildIcon · 第 251 行
- :91
onPressed: () async { - :100
context.go('/main/today');
lib/pages/main/activity/badges_page.dart路由:/main/badges
H5:pages.js:60 · 源文件 655 行
- 等级进度、已获得/未解锁两组展示
- 徽章卡片没有点击回调;不生成弹窗,接口数据模拟
源码按已获得和未解锁两组展示;卡片没有点击回调。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_loadData · 第 56 行_refreshData · 第 85 行_preloadImagesSequentially · 第 270 行_buildBadgeGrid · 第 331 行_buildBadgeCard · 第 603 行
- :385
onTap: () => context.pop(),
lib/pages/main/activity/discovery_detail_page.dart路由:无调用证据;仅源码附录,不接入正式流程
H5:pages.js:56 · 源文件 376 行
- 同名旧组件保留为源码附录
- 未找到正式调用;不接入现有业务流程
旧同名组件未找到调用证据,只保留目录预览。正式物种详情使用 main/me/discovery_detail_page.dart。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_buildSpeciesImage · 第 115 行_buildFunFactsSection · 第 180 行_buildDiscoveryInfoSection · 第 302 行_buildInfoRow · 第 354 行
- :41
onTap: () => context.pop(),
lib/pages/main/activity/explore_page.dart路由:/main/explore
H5:pages.js:54 · 源文件 964 行
- 探索时间线/照片视图
- 时间范围与物种详情跳转
- 空状态与加载更多
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_onFamilyChanged · 第 65 行_loadDiscoveries · 第 71 行_loadMoreDiscoveries · 第 143 行_showTimeRangeMenu · 第 152 行_buildHeader · 第 354 行_buildTabs · 第 419 行_buildTab · 第 465 行_buildTimelineView · 第 512 行_buildGalleryView · 第 563 行_buildDiscoveryCard · 第 608 行_buildDiscoveryGridItem · 第 771 行_buildLoadMoreButton · 第 869 行_formatTime · 第 896 行_formatDate · 第 905 行
- :396
onTap: () => _showTimeRangeMenu(buttonContext), - :435
onTap: () { - :453
onTap: () { - :477
onTap: onTap, - :612
onTap: () { - :613
context.push('/main/discovery-detail', extra: discovery); - :773
onTap: () { - :774
context.push('/main/discovery-detail', extra: discovery); - :875
onPressed: _loadMoreDiscoveries,
lib/pages/main/activity/explorer_level_page.dart路由:/main/explorer-level
H5:pages.js:61 · 源文件 1421 行
- 等级进度与最近XP
- 等级路径、AI伙伴、获得XP说明页内展开收起
- 等级与奖励数据模拟,不作为业务数值依据
三个指南为页内展开收起,非弹窗。
浏览器:companions-inline:孩子AI伙伴跳探索者等级,等级路径与AI伙伴可在页内展开收起,无额外弹窗
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_loadLevelData · 第 50 行_getUnlockedAiRolesCount · 第 138 行_getLevelName · 第 168 行_buildGuideItem · 第 560 行_buildXpRecordItem · 第 644 行_buildHowToEarnXpContent · 第 774 行_buildXpActivityItem · 第 854 行_buildLevelPathContent · 第 958 行_buildLevelPathItem · 第 1011 行_buildAiCompanionsContent · 第 1182 行_buildAiCompanionItem · 第 1290 行
- :221
onTap: () => context.pop(), - :450
onTap: () { - :468
onTap: () { - :485
onTap: () { - :573
onTap: onTap,
lib/pages/main/activity/recent_activities_page.dart路由:/main/recent-activities
H5:pages.js:55 · 源文件 430 行
- 全部/发现/作品筛选
- 保留当前源码固定空列表,不补接真实活动接口
源码 _loadActivities 只置空列表;筛选器可操作,结果仍为空。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_loadActivities · 第 36 行_buildTopBar · 第 133 行_buildFilterTabs · 第 162 行_buildFilterTab · 第 192 行_buildActivitiesList · 第 220 行_buildActivityItem · 第 284 行
- :196
onTap: () { - :333
onTap: () { - :335
context.push('/main/discovery-detail', extra: data); - :337
context.push('/main/artwork-detail', extra: data); - :339
context.push('/main/photo-detail', extra: data.first);
lib/pages/main/activity/today_page.dart路由:组件直接构造/导航容器
H5:pages.js:49 · 源文件 2282 行
- 活动主导航、孩子切换、统计跳转
- 时间范围、总结、亮点与最近活动
- 无设备提示、无内容提示与绑定入口
- 相册/作品统计使用主导航切换
- 接口内容与统计值为模拟数据
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:child-before-scan:多孩子无设备时先选小满,扫码成功后活动页仍为小满,绑定入口消失
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_debugLog · 第 34 行_onMainScroll · 第 149 行_loadMoreActivities · 第 169 行_onFamilyChanged · 第 257 行_onHighlightsScroll · 第 259 行_loadMoreHighlights · 第 306 行_loadData · 第 364 行_updateUIWithActivityData · 第 560 行_formatTimeAgo · 第 933 行_buildHighlightsSection · 第 969 行_buildScrollBarInline · 第 1352 行_buildScrollBar · 第 1447 行_buildNoDeviceBanner · 第 1548 行_buildHeader · 第 1617 行_buildStatsCards · 第 1645 行_buildSummaryCard · 第 1702 行_buildRecentActivitiesSection · 第 1754 行_buildDateHeader · 第 1818 行_buildGettingStartedTips · 第 1855 行_buildEmptyState · 第 1902 行_buildTipItem · 第 1953 行_buildActivityItem · 第 1979 行
- :743
onTap: () { - :1068
onTap: () async { - :1104
final result = await context.push('/main/discovery-detail', extra: discoveryModel); - :1141
final result = await context.push('/main/photo-detail', extra: targetPhoto); - :1165
final result = await context.push('/main/discovery-detail', extra: discoveryModel); - :1191
final result = await context.push('/main/artwork-detail', extra: artwork); - :1216
final result = await context.push('/main/artwork-detail', extra: fallbackArtwork); - :1231
final result = await context.push('/main/photo-detail', extra: photo); - :1241
context.push('/main/badges'); - :1586
onPressed: () { - :1590
context.push('/main/add-device'); - :1592
context.push('/main/link-to-child'); - :1670
onTap: () => MainTabPage.switchToPhotosTab(tab: 'Photos'), - :1681
onTap: () => context.push('/main/field-guide', extra: {'from': 'today'}), - :1692
onTap: () => MainTabPage.switchToPhotosTab(tab: 'Artworks'), - :1711
onTap: onTap, - :2058
final result = await context.push('/main/chat-detail', extra: conversation); - :2080
final result = await context.push('/main/photo-detail', extra: photo); - :2119
final result = await context.push('/main/artwork-detail', extra: artwork); - :2145
final result = await context.push('/main/artwork-detail', extra: fallbackArtwork); - :2157
onTap: onTap,
lib/pages/main/chat/chat_detail_page.dart路由:/main/chat-detail
H5:pages.js:52 · 源文件 882 行
- 关于照片、对话轮次、消息顺序
- 语音播放/暂停状态模拟
- 照片关联跳转;不新增发消息入口
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:delete-return:删除示例照片后返回原聊天详情,照片关联卡消失
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_loadData · 第 84 行_loadAudioDurations · 第 129 行_formatLocalizedTime · 第 155 行_formatTimestamp · 第 175 行_formatDuration · 第 244 行_toggleAudio · 第 253 行_buildHeader · 第 356 行_buildAboutPhotoCard · 第 396 行_buildMessageBubble · 第 551 行_buildFooter · 第 817 行
- :365
onTap: () => context.pop(), - :417
onTap: () { - :420
context.push('/main/photo-detail', extra: _relatedPhoto); - :635
onTap: () => _toggleAudio(audioId, audioUrl!), - :703
onTap: () { - :728
context.push('/main/photo-detail', extra: photo);
lib/pages/main/chat/chat_history_page.dart路由:组件直接构造/导航容器
H5:pages.js:51 · 源文件 848 行
- 按孩子显示对话列表
- 列表与无对话状态
- 打开对话详情;分页依赖以模拟列表表示
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_onScroll · 第 124 行_refreshUnreadCount · 第 143 行_onFamilyChanged · 第 148 行_resetAndLoadConversations · 第 153 行_loadConversations · 第 162 行_loadMoreConversations · 第 289 行_loadConversationsFromLocal · 第 394 行_formatLocalizedTime · 第 465 行_formatTimestamp · 第 485 行_buildHeader · 第 626 行_buildHeaderActions · 第 671 行_buildLoadingIndicator · 第 682 行_buildConversationCard · 第 686 行
- :591
onTap: () { - :706
onTap: () { - :707
context.push('/main/chat-detail', extra: conversation);
lib/pages/main/chat/live_chat_page.dart路由:/main/live-chat
H5:pages.js:81 · 源文件 504 行
- 客服欢迎语与常见问题
- 输入文本添加本地消息
- 保持源码本地列表行为,不伪造真人或AI自动回复
源码仅操作本地消息列表。输入后不新增自动回复或模拟客服会话。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_sendMessage · 第 67 行_sendCommonQuestion · 第 81 行_buildMessageBubble · 第 356 行_buildMessageText · 第 445 行_buildCommonQuestionButton · 第 476 行
- :109
onTap: () => context.pop(), - :327
onTap: _sendMessage, - :478
onTap: () => _sendCommonQuestion(question),
lib/pages/main/main_layout.dart路由:组件直接构造/导航容器
H5:pages.js:94 · 源文件 181 行
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_buildBottomNavigationBar · 第 35 行_buildNavItemEmoji · 第 88 行
- :101
onTap: () { - :103
context.go(route);
lib/pages/main/main_tab_page.dart路由:/main
H5:pages.js:95 · 源文件 239 行
- 四个Tab容器与切换
- 保留各Tab状态与返回路径
- 别名/main/today、chat-history、photos、me均指向/main;原始别名行为单列说明
/main/today、/main/chat-history、/main/photos、/main/me 均重定向 /main。未传 initialIndex 时为活动页;实际 Tab 操作使用索引切换。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_onFamilyChanged · 第 81 行_onTabTapped · 第 115 行_changeTab · 第 120 行_switchToPhotosTab · 第 127 行_buildBottomNavigationBar · 第 147 行_buildNavItemEmoji · 第 196 行
- :208
onTap: () => _onTabTapped(index),
lib/pages/main/me/about_page.dart路由:/main/about
H5:pages.js:82 · 源文件 451 行
- 应用版本1.2.0+47、历史、协议
- 已最新/发现新版本/审核中模拟
- 应用商店跳转模拟
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:about-privacy-delete:关于的隐私政策进入隐私与数据;删除入口提示先移除孩子/设备
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_onVersionChanged · 第 43 行_checkUpdateOnPageLoad · 第 49 行_loadVersion · 第 57 行_isGoogleChannel · 第 69 行_resolveGooglePlayUrl · 第 73 行_launchUpdate · 第 88 行_checkUpdate · 第 107 行
- :164
await showDialog<void>( - :237
onPressed: () async { - :256
onPressed: () async { - :344
onTap: _checkUpdate, - :353
onTap: () => context.push('/main/version-history'), - :370
onTap: () { - :371
context.push('/main/privacy-data'); - :389
onTap: () { - :412
onTap: () {
lib/pages/main/me/add_child_page.dart路由:组件直接构造/导航容器
H5:pages.js:42 · 源文件 803 行
- 姓名生日性别、头像选择
- 查看者限制、未来日期及必填校验
- 普通添加后进入关联设备
- 从扫码路径进入时保持后续绑定上下文
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_pickAndUploadAvatar · 第 129 行_isSupportedAvatarFile · 第 218 行_setDefaultNickname · 第 234 行_buildPhotoUpload · 第 347 行_buildNameField · 第 433 行_buildDateField · 第 489 行_selectBirthDate · 第 553 行_buildGenderField · 第 569 行_buildGenderButton · 第 598 行_handleContinue · 第 634 行
- :150
showDialog( - :272
context.go('/guide-pair-scan'); - :321
onTap: _handleContinue, - :352
onTap: _pickAndUploadAvatar, - :476
validator: (value) { - :509
onTap: _selectBirthDate, - :606
onPressed: () { - :677
context.go('/main/me'); - :701
context.go(next);
lib/pages/main/me/add_device_page.dart路由:/main/add-device
H5:pages.js:40 · 源文件 779 行
- 扫码、缩放、权限拒绝与重试
- 二维码类型、跨区、绑定拒绝模拟
- 绑定后与所选孩子关联
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:child-before-scan:多孩子无设备时先选小满,扫码成功后活动页仍为小满,绑定入口消失
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_debugLog · 第 31 行_initializeScanner · 第 105 行_startCamera · 第 181 行_recreateScannerController · 第 209 行_stopCamera · 第 231 行_applyZoomScale · 第 241 行_showPermissionDialog · 第 268 行_buildScannerArea · 第 367 行_buildZoomControl · 第 467 行_handleScannedRaw · 第 518 行_looksLikeUrl · 第 585 行_isOfficialDownloadAppQr · 第 589 行_showScannedDownloadAppQrDialog · 第 601 行_waitUntilChildReady · 第 673 行_handleScannedSn · 第 713 行_bindDevice · 第 749 行
- :272
final shouldOpen = await showDialog<bool>( - :284
onPressed: () => Navigator.of(context).pop(false), - :288
onPressed: () => Navigator.of(context).pop(true), - :606
await showDialog<void>( - :613
onPressed: () => Navigator.of(context).pop(), - :733
context.go('/main/me');
lib/pages/main/me/change_password_page.dart路由:/main/change-password
H5:pages.js:72 · 源文件 313 行
- 当前密码按账户状态显示
- 新密码与确认密码校验
- 忘记密码入口;成功返回,不保存真实密码
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_label · 第 169 行_error · 第 178 行_passwordField · 第 183 行_handleSubmit · 第 228 行
- :147
..onTap = () => context.push('/forgot-password?from=change-password'), - :162
onPressed: _isSubmitting ? null : _handleSubmit, - :221
onPressed: onToggle,
lib/pages/main/me/child_detail_page.dart路由:/main/child-detail
H5:pages.js:62 · 源文件 2004 行
- 资料、年龄性别、等级与统计
- 编辑、徽章、图鉴、亮点和设备跳转
- AI伙伴跳探索者等级;无孩子状态
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:companions-inline:孩子AI伙伴跳探索者等级,等级路径与AI伙伴可在页内展开收起,无额外弹窗
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_debugLog · 第 35 行_loadChildData · 第 94 行_calculateAge · 第 216 行_formatAgeDisplay · 第 227 行_formatTimeAgo · 第 258 行_preloadNewBadgeImages · 第 278 行_buildQuickAccessCard · 第 1568 行_buildListItem · 第 1624 行_buildCompanionsScrollBar · 第 1679 行_buildBadgesScrollBar · 第 1763 行_buildHighlightItem · 第 1839 行
- :551
onTap: () { - :553
context.go('/main/today'); - :739
onPressed: () async { - :740
final result = await context.pushNamed( - :810
onTap: () { - :813
context.push('/main/explorer-level'); - :950
onTap: () { - :965
onTap: () { - :968
context.push('/main/field-guide', extra: {'from': 'child-profile'}); - :980
onTap: () { - :983
context.push('/main/badges'); - :1019
onTap: () { - :1021
context.push('/main/badges'); - :1248
onTap: () { - :1250
context.push('/main/explorer-level'); - :1478
onTap: () => context.push('/main/guide-settings'), - :1580
onTap: onTap, - :1632
onTap: onTap, - :1860
onTap: () { - :1864
context.push('/main/field-guide', extra: {'from': 'child-profile'}); - :1886
context.push('/main/artwork-detail', extra: artwork); - :1910
context.push('/main/photo-detail', extra: photo); - :1918
context.push('/main/badges');
lib/pages/main/me/device_settings_page.dart路由:/main/guide-settings
H5:pages.js:70 · 源文件 1249 行
- 设备信息、在线离线、电量存储网络
- 每日时长开关与15–120分钟滑动
- 草稿与保存;失败不写入已保存设置
- 更换孩子与解绑;户主限制、验证码、输入删除设备
- 源码注释掉的AI对话/创意工坊/地图任务开关不显示
AI 对话、创意工坊、地图任务开关在源码中被注释,H5 不显示。硬件信息和保存响应是示例。
浏览器:device-relink:设备时长保存、更换关联孩子后返回刷新。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_debugLog · 第 28 行_onDeviceChanged · 第 56 行_loadDeviceData · 第 91 行_buildSectionTitle · 第 813 行_buildInfoRow · 第 829 行_saveSettings · 第 841 行_handleUnlinkDevice · 第 891 行_sendUnlinkDeviceCode · 第 973 行_showUnlinkVerificationCodeDialog · 第 1004 行_showUnlinkFinalConfirmDialog · 第 1189 行
- :512
onTap: () => context.push('/main/child-detail', extra: _linkedChild), - :586
onTap: () async { - :589
final result = await context.push('/main/link-to-child', extra: { - :636
onTap: () async { - :639
final result = await context.push('/main/add-child', extra: { - :697
onPressed: _handleUnlinkDevice, - :787
onPressed: _hasUnsavedChanges ? _saveSettings : null, - :899
final confirmed = await showDialog<bool>( - :921
onPressed: () => Navigator.of(context).pop(false), - :928
onPressed: () => Navigator.of(context).pop(true), - :964
context.go('/main/me'); - :1009
return showDialog<bool>( - :1144
onPressed: isVerifying ? null : () => Navigator.pop(ctx), - :1157
onPressed: isVerifying ? null : doVerify, - :1199
return showDialog<bool>( - :1231
onPressed: () => Navigator.pop(context, false), - :1238
onPressed: isMatch ? () => Navigator.pop(context, true) : null,
lib/pages/main/me/discovery_detail_page.dart路由:/main/discovery-detail
H5:pages.js:56 · 源文件 390 行
- 物种图片、名称、分类、趣味事实
- 首次发现、见过次数、对话轮次
- 物种内容为模拟接口返回
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_buildSpeciesImage · 第 116 行_buildSpeciesImageChild · 第 147 行_buildFunFactsSection · 第 194 行_buildDiscoveryInfoSection · 第 316 行_buildInfoRow · 第 368 行
- :42
onTap: () => context.pop(),
lib/pages/main/me/edit_child_profile_page.dart路由:/main/edit-child-profile
H5:pages.js:42 · 源文件 842 行
- 资料修改与保存反馈
- 查看者限制编辑;仅户主可删除
- 绑定设备阻断删除;输入删除加孩子姓名确认
- 删除最后孩子按所有家庭重新判断入口
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_debugLog · 第 43 行_loadChildData · 第 81 行_selectBirthDate · 第 121 行_isSupportedAvatarFile · 第 136 行_pickAndUploadAvatar · 第 142 行_saveChanges · 第 232 行_removeChild · 第 294 行_showDeleteConfirmDialog · 第 365 行_buildGenderButton · 第 810 行
- :163
showDialog( - :352
context.go('/setup-recovery'); - :354
context.go('/main'); - :371
return showDialog<bool>( - :414
onPressed: () => Navigator.of(context).pop(false), - :421
onPressed: () { - :480
onTap: () => context.pop(), - :515
onTap: _pickAndUploadAvatar, - :611
onTap: _selectBirthDate, - :718
onPressed: _removeChild, - :802
onPressed: _saveChanges, - :816
onTap: () {
lib/pages/main/me/edit_profile_page.dart路由:/main/edit-profile
H5:pages.js:64 · 源文件 697 行
- 姓名与头像可编辑;有手机号显示只读电话,否则显示只读邮箱
- 邮箱验证入口及状态
- 有修改才可保存;成功返回并同步跨页资料
手机号和邮箱均不可编辑;有手机号仅显示电话,否则显示邮箱及验证状态。仅昵称/头像可改,有修改才允许保存。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_loadUserData · 第 66 行_getUserInitial · 第 86 行_isSupportedAvatarFile · 第 102 行_pickAndUploadAvatar · 第 108 行_buildTextField · 第 376 行_wrapTestId · 第 438 行_buildEmailFieldWithVerification · 第 444 行_handleEmailVerification · 第 562 行_handleSave · 第 594 行
- :129
showDialog( - :233
onTap: _pickAndUploadAvatar, - :367
onPressed: _hasChanges ? _handleSave : null, - :524
onPressed: _handleEmailVerification, - :640
context.go('/main/me');
lib/pages/main/me/email_verification_page.dart路由:组件直接构造/导航容器
H5:pages.js:65 · 源文件 353 行
- 只读当前邮箱、6位验证码、60秒发送冷却
- 验证成功同步资料页;错误码反馈
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_sendVerificationCode · 第 55 行_startCountdown · 第 91 行_verifyCode · 第 108 行
- :117
showDialog( - :257
onPressed: (_canResend && !_isSending) ? _sendVerificationCode : null, - :314
onPressed: _codeController.text.trim().isNotEmpty
lib/pages/main/me/export_preview_page.dart路由:组件直接构造/导航容器
H5:pages.js:76 · 源文件 671 行
- 切换家庭、报告统计、设备信息
- 刷新与空状态
- 导出/分享系统面板模拟;可下载示例SVG报告
- 只展示统计摘要,不把私有原始记录放入原型
原生图片导出和分享用模拟窗口表示;H5 可下载示例 SVG 统计摘要。该 SVG 不是 App 实际导出格式。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_refreshData · 第 42 行_captureImage · 第 57 行_showExportOptions · 第 86 行_saveToGallery · 第 127 行_shareImage · 第 147 行_age · 第 251 行_genderLabel · 第 258 行_buildContent · 第 303 行_familySelector · 第 350 行_reportBanner · 第 393 行_familyCard · 第 425 行_childCard · 第 441 行_devicesCard · 第 482 行_card · 第 531 行_grid · 第 566 行_stat · 第 578 行_sectionDivider · 第 586 行_noteRow · 第 597 行_label · 第 617 行_buildBottomBar · 第 625 行
- :88
showModalBottomSheet( - :104
onTap: () { - :115
onTap: () { - :292
TextButton(onPressed: _refreshData, child: Text(l10n.exportTapToRefresh)), - :360
onTap: () => setState(() => _selectedFamily = family), - :636
onPressed: _isRefreshing ? null : _refreshData, - :654
onPressed: (_isExporting || _selectedFamily == null) ? null : _showExportOptions,
lib/pages/main/me/family_members_page.dart路由:/main/family-members
H5:pages.js:66 · 源文件 1099 行
- 所有者、成员与查看者显示
- 户主移除成员;非户主退出家庭
- 邀请入口;无孩子无设备阻断
- 待处理邀请当前固定为空;不补实现重发
待处理邀请在当前页面加载逻辑中固定为空;重发为 TODO。生成演示邀请不改变这一展示。
浏览器:invite-step-back:第二步返回仍停留邀请页,显示第一步选择孩子 invite-done:生成邀请后完成返回家庭成员,待处理邀请仍保留源码空态并显式标注
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_debugLog · 第 26 行_loadMemberData · 第 43 行_handleLeaveFamily · 第 88 行_handleRemoveMember · 第 122 行_handleInviteMember · 第 157 行_buildInviteCard · 第 354 行_buildOwnerCard · 第 427 行_buildEmptyOwnerCard · 第 528 行_buildMembersCard · 第 544 行_buildPendingCard · 第 712 行_buildPermissionLevels · 第 804 行_buildRemoveMemberSection · 第 873 行_buildSectionTitle · 第 950 行_buildSectionHeader · 第 965 行_mapRoleLabel · 第 1031 行_mapRoleLabelByCode · 第 1045 行
- :112
context.go('/main/me'); - :167
context.push('/main/invite-member'); - :279
onTap: _handleInviteMember, - :328
onPressed: _handleLeaveFamily, - :356
onTap: () { - :357
context.push('/main/join-family'); - :673
onPressed: () => _handleRemoveMember(memberId), - :783
onPressed: () { - :922
onPressed: () => _handleRemoveMember(memberId), - :988
onTap: onTap,
lib/pages/main/me/field_guide_page.dart路由:/main/field-guide
H5:pages.js:57 · 源文件 343 行
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_loadData · 第 32 行_buildCategoryCard · 第 245 行
- :154
onTap: () => context.pop(), - :253
onTap: () { - :255
context.push('/main/species-category', extra: {
lib/pages/main/me/help_article_page.dart路由:/main/help-article
H5:pages.js:80 · 源文件 463 行
- 额外参数驱动的文章展示模板
- Chat with us及相关文章保留TODO空回调
- 无帮助中心跳入路径;目录组件预览使用示例文章
页面存在,但帮助中心当前不跳入此页;Chat with us 和相关文章为 TODO 空回调。目录展示示例文章参数。
浏览器:todo-feedback:帮助文章顶部显示独立TODO评审标注,点击Chat with us说明源码未实现,不跳在线客服
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
- :40
onTap: () => context.pop(), - :209
onPressed: () { - :275
onTap: () { - :427
onTap: onTap,
lib/pages/main/me/help_support_page.dart路由:/main/help-support
H5:pages.js:79 · 源文件 672 行
- 搜索、分组和暂无结果
- 分类与查看全部文章按源码跳在线客服
- 邮件支持显示support@qmox.com
- 投诉举报与复制邮箱
分类和“查看全部文章”实际跳在线客服。邮件按钮仅显示邮箱,不发送邮件。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_showReportDialog · 第 27 行_matches · 第 215 行_buildFilteredContent · 第 221 行
- :31
showDialog<void>( - :53
onPressed: () async { - :66
onPressed: () { - :105
onTap: () => context.pop(), - :185
onTap: () { - :225
'onTap': () => context.push('/main/live-chat'), - :229
'onTap': () => context.push('/main/live-chat'), - :233
'onTap': () => context.push('/main/live-chat'), - :240
'onTap': () => context.push('/main/live-chat'), - :244
'onTap': () => context.push('/main/live-chat'), - :248
'onTap': () => context.push('/main/live-chat'), - :255
'onTap': () => context.push('/main/live-chat'), - :259
'onTap': () => context.push('/main/live-chat'), - :263
'onTap': () => context.push('/main/live-chat'), - :322
onTap: () { - :323
context.push('/main/live-chat'); - :334
onTap: () { - :347
onTap: () { - :384
onTap: () { - :385
context.push('/main/live-chat'); - :483
onTap: onTap, - :583
onTap: onTap, - :662
onTap: item['onTap'] as VoidCallback,
lib/pages/main/me/invite_member_page.dart路由:/main/invite-member
H5:pages.js:67 · 源文件 1065 行
- 户主和成员可邀请,查看者被阻止
- 孩子选择、设备选择、权限、生成邀请三步
- 默认选中首个孩子和首台设备
- 邀请摘要、示例二维码、复制邀请码、完成
role 0/1 可邀请,role 2 被阻止。默认首个孩子和首台设备;设备步骤显示所有设备,未额外按孩子过滤。
浏览器:invite-step-back:第二步返回仍停留邀请页,显示第一步选择孩子 invite-done:生成邀请后完成返回家庭成员,待处理邀请仍保留源码空态并显式标注
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_debugLog · 第 27 行_loadData · 第 66 行_calculateAge · 第 116 行_buildHeader · 第 180 行_buildStepIndicator · 第 226 行_buildStepCircle · 第 239 行_buildStepLine · 第 266 行_buildStep1 · 第 276 行_buildChildItem · 第 326 行_buildStep2 · 第 404 行_buildDeviceItem · 第 483 行_buildPermissionCard · 第 554 行_buildStep3 · 第 668 行_formatExpiresAt · 第 829 行_buildSummaryRow · 第 861 行_generateInviteFromBackend · 第 891 行_buildBottomButton · 第 954 行
- :188
onTap: () { - :333
onTap: () { - :487
onTap: () { - :558
onTap: () { - :967
onPressed: () { - :996
onPressed: () => context.pop(), - :1024
onPressed: _isGenerating ? null : () async {
lib/pages/main/me/join_family_page.dart路由:/main/join-family
H5:pages.js:68 · 源文件 829 行
- 扫码权限与缩放
- 手动邀请码输入(最大10字符)与加入按钮
- 空码/无效/过期模拟
- 加入后刷新家庭上下文并判断恢复页
- 手动输入标题为空回调;H5只给评审说明,不增加产品跳转
“手动输入代码 →”标题是空回调;下方输入框和加入按钮有效。二维码是不可扫码的占位。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_debugLog · 第 29 行_initializeScanner · 第 100 行_startCamera · 第 159 行_stopCamera · 第 209 行_recreateScannerController · 第 219 行_handleBack · 第 266 行_applyZoomScale · 第 419 行_buildZoomControl · 第 444 行_showPermissionDialog · 第 496 行_buildPermissionPlaceholder · 第 530 行_buildScannerArea · 第 583 行_handleScannedCode · 第 686 行_handleJoinWithCode · 第 756 行
- :269
context.go('/welcome'); - :333
onTap: () {}, - :382
onPressed: _isProcessing ? null : _handleJoinWithCode, - :500
final shouldOpen = await showDialog<bool>( - :510
onPressed: () => Navigator.of(context).pop(false), - :514
onPressed: () => Navigator.of(context).pop(true), - :561
onPressed: () { - :738
context.go('/main/me'); - :740
context.go('/setup-recovery'); - :796
context.go('/main/me'); - :798
context.go('/setup-recovery');
lib/pages/main/me/language_settings_page.dart路由:/main/language-settings
H5:pages.js:77 · 源文件 189 行
- 源码七种语言选择与保存
- 静态文案使用仓库语言表;示例动态内容不作为翻译验收
七份语言表取自源码;H5 按匹配的静态文案翻译。组合文案、演示内容和跨平台布局仍需逐语言验收。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_buildLanguageOption · 第 115 行_handleSave · 第 150 行
- :76
onTap: () { - :107
onPressed: _handleSave, - :121
onTap: onTap,
lib/pages/main/me/link_to_child_page.dart路由:/main/link-to-child、/main/add-child
H5:pages.js:43 · 源文件 526 行
- 现有孩子选择与新建孩子入口
- 更换关联与添加设备前选择孩子两种上下文
- 已有设备完成后更新关联并返回;新绑定流程完成后进入扫码
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:device-relink:设备时长保存、更换关联孩子后返回刷新。 child-before-scan:多孩子无设备时先选小满,扫码成功后活动页仍为小满,绑定入口消失
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_debugLog · 第 36 行_initializeData · 第 58 行_completeSetup · 第 84 行_buildChildOption · 第 283 行_buildAddNewChildOption · 第 368 行_buildDeviceCard · 第 417 行_calculateAge · 第 469 行
- :128
context.push('/main/add-device'); - :258
onTap: canSubmit ? _completeSetup : null, - :295
onTap: () { - :370
onTap: () { - :380
context.push('/main/me/add-child', extra: extra);
lib/pages/main/me/link_to_device_page.dart路由:/main/link-to-device
H5:pages.js:44 · 源文件 309 行
- 设备选择与当前关联信息
- 添加新设备、完成关联、暂时跳过
- 未选择设备提示
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:link-device-disabled:未选择设备完成按钮禁用,选择设备后启用
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_loadDevices · 第 36 行_handleDone · 第 59 行_buildDeviceRow · 第 89 行
- :65
context.go('/main/me'); - :85
context.go('/main/me'); - :96
onTap: () { - :197
onTap: () => context.push('/main/add-device', extra: {'childId': widget.childId}), - :240
onTap: canSubmit ? _handleDone : null, - :253
onTap: () { - :256
context.go('/main/me');
lib/pages/main/me/me_page.dart路由:组件直接构造/导航容器
H5:pages.js:63 · 源文件 1394 行
- 资料、家庭切换、成员、孩子和设备
- 国内订阅开关与设置入口
- 添加孩子/按孩子数量选择设备绑定入口
- 地区切换与退出登录确认
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_onVersionChanged · 第 56 行_onSubscriptionChanged · 第 62 行_onFamilyChanged · 第 68 行_loadFromCache · 第 83 行_loadSubscriptionHome · 第 92 行_loadData · 第 100 行_refreshUnreadCount · 第 123 行_buildSectionHeader · 第 290 行_buildAiExplorerServiceCard · 第 343 行_buildProfileCard · 第 423 行_buildFamilyCard · 第 535 行_buildChildrenCard · 第 622 行_buildDevicesCard · 第 754 行_switchRegionWithAccountHandoff · 第 905 行_confirmAndSwitchRegion · 第 934 行_showRegionSwitchSheet · 第 952 行_buildRegionOption · 第 1009 行_buildSettingsCard · 第 1045 行_buildSettingsItem · 第 1117 行_buildSettingsItemWithBadge · 第 1170 行_buildSettingsItemWithWidget · 第 1234 行_buildSettingsDivider · 第 1278 行_calculateAge · 第 1285 行_formatAgeDisplay · 第 1297 行_wrapTestId · 第 1330 行_wrapSettingsTestId · 第 1335 行_buildSignOutButton · 第 1344 行_handleSignOut · 第 1387 行
- :164
onTap: () { - :165
context.push('/main/live-chat'); - :218
onAdd: () => context.push('/main/me/add-child'), - :235
context.push('/main/add-device'); - :237
context.push('/main/link-to-child'); - :316
onTap: onAdd, - :359
onTap: () async { - :360
await context.push('/main/subscription'); - :509
onPressed: () async { - :510
final result = await context.push('/main/edit-profile'); - :550
onTap: () async { - :551
final result = await context.push('/main/switch-family'); - :666
onTap: () async { - :667
final result = await context.push('/main/child-detail', extra: {'from': 'me', 'childId': child.id}); - :793
onPressed: () { - :797
context.push('/main/add-device'); - :799
context.push('/main/link-to-child'); - :838
onTap: () { - :840
context.push('/main/guide-settings', extra: {'deviceSn': device.deviceId}); - :956
await showModalBottomSheet<void>( - :983
onTap: () async { - :994
onTap: () async { - :1015
onTap: onTap, - :1058
onTap: () => context.push('/main/family-members'), - :1066
onTap: () => context.push('/main/security'), - :1074
onTap: () => context.push('/main/notifications'), - :1083
onTap: () => context.push('/main/language-settings'), - :1092
onTap: () => context.push('/main/privacy-data'), - :1100
onTap: () => context.push('/main/help-support'), - :1110
onTap: () => context.push('/main/about'), - :1129
onTap: onTap, - :1183
onTap: onTap, - :1246
onTap: onTap, - :1351
onPressed: () async { - :1363
context.go('/');
lib/pages/main/me/notifications_center_page.dart路由:/main/notifications-center
H5:pages.js:74 · 源文件 938 行
- 全部/未读筛选、全部已读
- notice进入自动已读;内容消息点击已读
- 当前家庭访问限制与目标详情跳转
- 系统消息正文为模拟数据
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_debugLog · 第 34 行_onScroll · 第 67 行_loadMessages · 第 74 行_loadMore · 第 153 行_markAllRead · 第 181 行_changeFilter · 第 193 行_markRead · 第 199 行_openMessage · 第 243 行_canAccessMessage · 第 367 行_canAccessMessageUnused · 第 371 行_normalizeRouteValue · 第 399 行_chip · 第 505 行_buildMessageCard · 第 531 行_buildLeadingImage · 第 640 行_looksLikeImageUrl · 第 690 行_buildLeadingFallback · 第 799 行_formatLocalizedTime · 第 880 行_formatMessageTime · 第 899 行_isYesterday · 第 933 行
- :284
await context.push(normalizedValue, extra: routeExtra); - :432
onPressed: _messages.any((m) => !m.isRead) ? _markAllRead : null, - :457
onTap: () => _changeFilter(null), - :464
onTap: () => _changeFilter(0), - :509
onTap: onTap, - :538
onTap: () => _openMessage(message),
lib/pages/main/me/notifications_page.dart路由:/main/notifications
H5:pages.js:73 · 源文件 475 行
- 设备、分享、发现、更新七类开关
- 系统通知权限拒绝与引导设置
- 保存与失败;没有自动添加保存按钮
系统拒绝通知授权时会关闭七类通知开关;隐私备份开关不受此规则影响。系统设置界面不在 H5 中复制。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_loadSettings · 第 42 行_saveSettings · 第 68 行_ensureSystemPermissionMatchesSettings · 第 80 行_handleToggleChange · 第 163 行_buildSectionTitle · 第 404 行_buildToggleItem · 第 419 行_buildDivider · 第 469 行
- :102
final shouldOpen = await showDialog<bool>( - :109
onPressed: () => Navigator.of(context).pop(false), - :113
onPressed: () => Navigator.of(context).pop(true), - :176
final shouldOpen = await showDialog<bool>( - :183
onPressed: () => Navigator.of(context).pop(false), - :187
onPressed: () => Navigator.of(context).pop(true),
lib/pages/main/me/privacy_data_page.dart路由:/main/privacy-data
H5:pages.js:75 · 源文件 895 行
- 照片自动备份、聊天备份开关
- 下载数据、协议页面
- 账户删除前置检查、验证码及输入确认
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:about-privacy-delete:关于的隐私政策进入隐私与数据;删除入口提示先移除孩子/设备
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_loadSettings · 第 40 行_formatLastBackup · 第 45 行_saveSettings · 第 59 行_buildSectionTitle · 第 264 行_buildToggleItem · 第 279 行_buildActionItem · 第 329 行_buildDivider · 第 388 行_canDeleteAccount · 第 405 行_showDeleteAccountBlockedMessage · 第 414 行_cleanErrorMessage · 第 465 行_showDeleteAccountDialog · 第 473 行_sendDeleteAccountCode · 第 530 行_showVerificationCodeDialog · 第 571 行_showFinalConfirmDialog · 第 761 行_executeDeleteAccount · 第 813 行
- :152
onTap: () { - :166
onTap: () => _showDeleteAccountDialog(), - :185
onTap: () { - :217
onTap: () { - :339
onTap: onTap, - :421
await showDialog<void>( - :456
onPressed: () => Navigator.pop(dialogContext), - :479
final confirmed1 = await showDialog<bool>( - :497
onPressed: () => Navigator.pop(context, false), - :505
onPressed: () => Navigator.pop(context, true), - :577
return showDialog<bool>( - :712
onPressed: isVerifying ? null : () => Navigator.pop(ctx), - :728
onPressed: isVerifying ? null : doVerify, - :765
return showDialog<bool>( - :793
onPressed: () => Navigator.pop(context, false), - :800
onPressed: controller.text == confirmText - :815
showDialog( - :877
context.go('/login');
lib/pages/main/me/security_page.dart路由:/main/security
H5:pages.js:71 · 源文件 708 行
- 有密码/无密码对应修改/设置
- 微信/Apple绑定、解绑与保留登录方式限制
- 删除账户入口
- 未被build调用的活跃会话区域不显示
活跃会话区域的方法未被 build 调用,H5 不显示。第三方绑定面板使用模拟返回。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_onGlobalUserChanged · 第 47 行_loadSocialBindings · 第 52 行_handleWechatBind · 第 70 行_handleWechatUnbind · 第 98 行_handleAppleBind · 第 133 行_handleAppleUnbind · 第 184 行_buildSectionHeader · 第 269 行_buildPasswordSection · 第 281 行_buildQuickLoginSection · 第 347 行_buildSocialQuickLoginRow · 第 400 行_buildSocialActionButton · 第 481 行_buildActiveSessionsSection · 第 544 行_buildDeleteAccountSection · 第 676 行
- :295
onTap: () { - :296
context.push('/main/change-password'); - :507
onPressed: disabled ? null : (isBindAction ? onBind : onUnbind), - :641
onPressed: () { - :689
onPressed: () {
lib/pages/main/me/species_category_page.dart路由:/main/species-category
H5:pages.js:58 · 源文件 400 行
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_debugLog · 第 35 行_loadData · 第 50 行_buildSpeciesCard · 第 267 行
- :140
onTap: () => context.pop(), - :278
onTap: () { - :300
context.push('/main/discovery-detail', extra: discoveryModel);
lib/pages/main/me/subscription_checkout_page.dart路由:/main/subscription/checkout
H5:pages.js:88 · 源文件 2236 行
- 月/季/年接口示例套餐
- 设备选择最多5台、过滤已付费有效设备
- 查看者限制、重复下单检查
- 国内微信支付宝/海外iOS Apple/Android Google
- 成功/失败/取消/确认超时/取消但后端已生效
- 合计与权益说明;价格不是当前真实报价
支付 SDK 和后端激活状态分别模拟;只有确认生效才开放权益。不是可付款页面。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_submitInternal · 第 222 行_finalizeSuccessAndLeave · 第 448 行_leaveToSuccessPage · 第 460 行_leaveToSubscriptionManagement · 第 474 行_leaveToHistory · 第 481 行_openLegalUrl · 第 488 行_openPrivacyPolicy · 第 492 行_openTermsOfUse · 第 498 行_legalLinks · 第 510 行_refreshSubscriptionState · 第 541 行_tryResolveByBackend · 第 551 行_waitForBackendActivation · 第 562 行_checkBackendActivated · 第 580 行_isDeviceActivated · 第 596 行_failed · 第 606 行_isPaidStatus · 第 609 行_isPaid · 第 612 行_isTrial · 第 615 行_name · 第 619 行_selectedDevicesHeroTitle · 第 622 行_selectedDevicesHeroSubtitle · 第 632 行_fmt · 第 662 行_formatLocalDateTime · 第 665 行_currencySymbol · 第 676 行_formatMoney · 第 707 行_displayPriceTextFor · 第 718 行_resolvedCurrencyForPlan · 第 744 行_moneyPrefixForPlan · 第 753 行_yearlyEquivalentText · 第 759 行_refreshDisplayPricing · 第 782 行_submitButtonText · 第 831 行_footerHintText · 第 844 行_confirmPartialPendingOrder · 第 860 行_preventDuplicateSubscriptionOrder · 第 881 行_domesticPayButtons · 第 937 行_domesticPayButton · 第 964 行_hero · 第 1197 行_priceCard · 第 1288 行_buildPlanSection · 第 1363 行_planDisplayTitle · 第 1398 行_titleForPlanType · 第 1404 行_descForPlan · 第 1417 行_formatLocalDate · 第 1451 行_planTile · 第 1459 行_deviceSection · 第 1560 行_deviceSubtitle · 第 1605 行_trialRemainingDays · 第 1631 行_deviceRow · 第 1639 行_buildBenefits · 第 1703 行_featureTile · 第 1792 行_priceDetailRow · 第 1816 行_buildAutoRenewNotice · 第 1839 行_buildExpireSection · 第 1880 行_expireRow · 第 1943 行_iconBox · 第 1994 行_assetIconBox · 第 2004 行_check · 第 2015 行_topBtn · 第 2044 行_tag · 第 2059 行
- :241
context.pushReplacement('/main/subscription/history'); - :248
context.pushReplacement('/main/subscription/history'); - :469
context.pushReplacement( - :478
context.go('/main/subscription'); - :485
context.pushReplacement('/main/subscription/history'); - :522
onTap: () => _openTermsOfUse(context), - :533
onTap: () => _openPrivacyPolicy(context), - :862
return showDialog<bool>( - :869
onPressed: () => Navigator.of(context).pop(false), - :873
onPressed: () => Navigator.of(context).pop(true), - :932
context.push('/main/subscription/renewal?deviceSn=$firstDeviceSn'); - :946
onPressed: disabled - :956
onPressed: disabled - :972
onPressed: onPressed, - :1140
onPressed: - :1461
onTap: () { - :1640
onTap: _isPaid(d) - :2047
onTap: onTap, - :2232
OutlinedButton(onPressed: r, child: Text(L10n.of(c).retry)),
lib/pages/main/me/subscription_device_detail_page.dart路由:/main/subscription/device
H5:pages.js:89 · 源文件 307 行
- 状态、套餐、有效期、自动续费、能力可用性
- 有效订阅禁用购买;可订阅设备去结算
- 源码有路由但未找到内部跳入入口,保留评审目录预览
已声明路由,未找到业务页内部跳入入口;保留目录预览。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_capabilityText · 第 122 行_resolvePriceText · 第 130 行_formatDate · 第 162 行
- :216
onPressed: isSubscribed ? null : onSubscribe, - :288
child: OutlinedButton(onPressed: r, child: Text(L10n.of(c).retry)),
lib/pages/main/me/subscription_history_page.dart路由:/main/subscription/history
H5:pages.js:90 · 源文件 1005 行
- 待支付/待确认/确认失败/生效/关闭/退款
- 待支付继续支付;确认中同步状态
- 有效订阅防重复支付;订单详情
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:repay-history:待支付历史订单完成模拟支付后仍停留历史,状态更新已生效
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_failed · 第 115 行_syncStatus · 第 117 行_continuePay · 第 142 行_refreshSubscriptionHome · 第 237 行_waitForOrderActivation · 第 244 行_checkBackendActivated · 第 259 行_hasActivePaidSubscription · 第 274 行_isAutoRenewActive · 第 281 行_showAutoRenewActiveDialog · 第 288 行_showPaidSubscriptionActiveDialog · 第 308 行
- :166
await context.push('/main/subscription/renewal?deviceSn=${item.primaryDeviceSn}'); - :289
return showDialog<bool>( - :296
onPressed: () => Navigator.of(context).pop(false), - :300
onPressed: () => Navigator.of(context).pop(true), - :312
return showDialog<void>( - :319
onPressed: () => Navigator.of(context).pop(), - :343
context.go('/main/subscription'); - :372
onTap: () => context.push('/main/subscription/order/${item.order.orderNo}'), - :521
onTap: onTap, - :579
onPressed: paying ? null : onContinuePay, - :612
onPressed: syncing ? null : onSyncStatus, - :882
OutlinedButton(onPressed: r, child: Text(L10n.of(c).retry)),
lib/pages/main/me/subscription_order_detail_page.dart路由:/main/subscription/order/:orderNo
H5:pages.js:91 · 源文件 464 行
- 订单号、金额、渠道、方式、时间、状态、设备
- 可同步状态订单的同步入口
- 无数据与加载失败
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
- :121
context.go('/main/subscription/history'); - :152
onPressed: _syncing ? null : _syncStatus, - :336
child: OutlinedButton(onPressed: r, child: Text(L10n.of(context).retry)),
lib/pages/main/me/subscription_page.dart路由:/main/subscription
H5:pages.js:87 · 源文件 811 行
- 按设备展示未开通/体验/已订阅/过期/取消续费
- 国内只读与查看者限制
- 完全重合待支付订单跳历史;部分重合二选一
- 订阅、历史、续费、恢复购买入口;查看者有效订阅可查看只读续费页
套餐、价格、权益数据来自接口,H5 值仅供演示。国内入口受开关控制;平台恢复购买仅模拟。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_onSubscriptionChanged · 第 77 行_hasActivePaidSubscription · 第 137 行_openCheckout · 第 160 行_openCheckoutInternal · 第 172 行_confirmPartialPendingOrder · 第 209 行_handleRestorePurchases · 第 481 行
- :182
await context.push('/main/subscription/history'); - :191
await context.push('/main/subscription/history'); - :198
final refreshed = await context.push<bool>( - :211
return showDialog<bool>( - :218
onPressed: () => Navigator.of(context).pop(false), - :222
onPressed: () => Navigator.of(context).pop(true), - :246
context.go('/main'); - :348
onPressed: () { - :351
context.push('/main/add-device'); - :353
context.push('/main/link-to-child'); - :537
await context.push('/main/subscription/history'); - :543
await context.push('/main/subscription/renewal'); - :573
onPressed: enabled ? onTap : null, - :589
onPressed: enabled ? onTap : null, - :627
onPressed: restoring ? null : onRestore, - :659
Widget build(BuildContext context) => Center(child: Column(mainAxisSize: MainAxisSize.min, children: [Text(e, textAlign: TextAlign.center), const SizedBox(height: 12), OutlinedButton(onPressed: r, child: Text(L10n.of(context).retry))])); - :800
onPressed: isViewer && !SubscriptionUi.hasActivePaidSubscription(item)
lib/pages/main/me/subscription_renewal_management_page.dart路由:/main/subscription/renewal
H5:pages.js:92 · 源文件 469 行
- 只列开启自动续费的可访问设备
- 取消后当前已付周期继续可用说明
- 国内及查看者隐藏平台管理入口
- 海外平台取消返回后更新模拟状态
只列 autoRenewEnabled 设备;国内与查看者不显示平台管理入口。平台取消不会立即终止已付周期。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_loadAutoRenewDevices · 第 51 行_refreshHomeAndLoadAutoRenewDevices · 第 67 行_openPlatformSubscriptionManagement · 第 363 行
- :97
context.go('/main/subscription'); - :153
context.go('/main/subscription'); - :329
onPressed: () => _openPlatformSubscriptionManagement(primaryChannel), - :348
onPressed: onBack,
lib/pages/main/me/subscription_success_page.dart路由:/main/subscription/success
H5:pages.js:93 · 源文件 267 行
- 设备、套餐、截止日期
- 查看订阅详情与返回首页
- 仅确认激活后进入,不把支付发起当成成功
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_displayExpireAt · 第 40 行_getPlanTypeLabel · 第 238 行_formatDateTime · 第 257 行
- :68
onTap: () => context.go('/main/subscription'), - :184
onPressed: () { - :185
context.go('/main/subscription'); - :210
onPressed: () { - :211
context.go('/main');
lib/pages/main/me/switch_family_page.dart路由:/main/switch-family
H5:pages.js:69 · 源文件 464 行
- 所有家庭与角色、数量、当前选中
- 切换后孩子和设备上下文同步
- 切换失败维持原家庭
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_loadFamilies · 第 35 行_buildFamilyCard · 第 230 行_buildInfoCard · 第 426 行
- :74
onTap: () => context.pop(), - :256
onTap: () async {
lib/pages/main/me/version_detail_page.dart路由:/main/version-detail/:id
H5:pages.js:84 · 源文件 222 行
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_load · 第 40 行_formatDate · 第 62 行_buildError · 第 193 行
- :206
onPressed: _load, - :214
onPressed: () => context.pop(),
lib/pages/main/me/version_history_page.dart路由:/main/version-history
H5:pages.js:83 · 源文件 266 行
- 版本列表、无历史版本、失败重试
- 版本详情入口;版本列表为示例
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_onScroll · 第 47 行_load · 第 54 行_loadMore · 第 81 行_formatDate · 第 100 行_buildError · 第 183 行_buildRow · 第 205 行
- :196
onPressed: () => _load(refresh: true), - :214
onTap: () { - :215
context.push('/main/version-detail/${item.id}', extra: item);
lib/pages/main/photos/artwork_detail_page.dart路由:/main/artwork-detail
H5:pages.js:53 · 源文件 847 行
- 作品、风格、日期、原始照片跳转
- 删除确认与列表同步
- 保存/分享原生结果模拟
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_debugLog · 第 42 行_loadOriginalPhoto · 第 55 行_handleDeleteArtwork · 第 101 行_handleSaveArtwork · 第 157 行_handleShareArtwork · 第 206 行_buildTopSection · 第 373 行_formatLocalizedTime · 第 393 行_buildTitleAndMetadata · 第 412 行_buildOriginalPhotoSection · 第 509 行_buildPhotoCard · 第 521 行_buildActionButtons · 第 615 行_buildActionButton · 第 679 行_buildActionButtonWithImage · 第 753 行
- :315
onTap: () => context.pop(), - :529
onTap: () { - :531
context.push('/main/photo-detail', extra: _originalPhoto); - :640
onPressed: _handleSaveArtwork, - :654
onPressed: _handleShareArtwork, - :670
onPressed: _handleDeleteArtwork, - :692
onPressed: onPressed, - :722
onPressed: onPressed, - :765
onPressed: onPressed, - :806
onPressed: onPressed,
lib/pages/main/photos/category_species_page.dart路由:/main/category-species
H5:pages.js:59 · 源文件 250 行
- 保留当前源码固定空列表
- 区分 me/species_category 的有效列表实现
源码 _loadData 只置空列表。保留空态,不能用另一物种分类页的有效列表替代。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_loadData · 第 39 行_buildSpeciesCard · 第 153 行
- :64
onTap: () => context.pop(), - :195
onTap: () { - :196
context.push('/main/discovery-detail', extra: species);
lib/pages/main/photos/photo_detail_page.dart路由:/main/photo-detail
H5:pages.js:53 · 源文件 1373 行
- 照片、时间地点设备、识别物种
- 对话及关联作品跳转
- 删除确认与删除后列表同步
- 保存/分享原生结果模拟
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:delete-return:删除示例照片后返回原聊天详情,照片关联卡消失
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_loadData · 第 108 行_handleDeletePhoto · 第 218 行_handleSavePhoto · 第 278 行_handleSharePhoto · 第 327 行_formatLocalizedTime · 第 438 行_buildTopSection · 第 578 行_buildStyleAndDate · 第 605 行_buildDateAndLocation · 第 651 行_buildDeviceLabel · 第 709 行_buildIdentifiedSection · 第 737 行_buildConversationsSection · 第 853 行_buildOriginalPhotoSection · 第 949 行_formatPhotoLocation · 第 1059 行_buildArtworksSection · 第 1067 行_buildActionButtons · 第 1148 行_buildActionButton · 第 1205 行_buildActionButtonWithImage · 第 1279 行
- :484
onTap: () => context.pop(), - :770
onTap: () { - :773
context.push('/main/discovery-detail', extra: _discovery); - :895
onTap: () { - :898
context.push('/main/chat-history'); - :900
context.push('/main/chat-detail', extra: _conversations.first); - :917
onTap: () { - :920
context.push('/main/chat-detail', extra: firstConv); - :976
onTap: () { - :977
context.push('/main/photo-detail', extra: _originalPhoto); - :1107
onTap: () { - :1108
context.push('/main/artwork-detail', extra: artwork); - :1172
onPressed: _handleSavePhoto, - :1184
onPressed: _handleSharePhoto, - :1197
onPressed: _handleDeletePhoto, - :1218
onPressed: onPressed, - :1248
onPressed: onPressed, - :1291
onPressed: onPressed, - :1332
onPressed: onPressed,
lib/pages/main/photos/photos_page.dart路由:组件直接构造/导航容器
H5:pages.js:50 · 源文件 1474 行
- 照片/作品切换;孩子切换
- 时间筛选;瀑布流列表与空状态
- 详情与原始照片关系;模拟分页结束
接口数据使用可重置的离线样本;源码结构与条件已映射,未做 Flutter 真机逐屏视觉或后端结果等价验收。
浏览器:已在浏览器打开;初始按钮已进行隔离 DOM 事件检查,未逐分支浏览器点击。
源码方法和交互索引
这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。
_onScroll · 第 137 行_refreshUnreadCount · 第 163 行_onFamilyChanged · 第 168 行_loadFromGlobalData · 第 173 行_preloadImages · 第 204 行_scheduleAspectRatioRebuild · 第 284 行_loadPhotosData · 第 297 行_loadArtworksData · 第 377 行_loadMorePhotos · 第 453 行_loadMoreArtworks · 第 507 行_buildHeaderActions · 第 706 行_buildHeader · 第 716 行_showTimeRangeMenu · 第 763 行_buildContentTypeToggle · 第 871 行_buildContentTypeButton · 第 916 行_buildTimeRangeFilters · 第 984 行_buildTab · 第 1037 行_buildPhotoGrid · 第 1078 行_buildArtworkGrid · 第 1135 行_ensurePhotoAspectRatios · 第 1209 行_buildArtworkItem · 第 1277 行_buildPhotoItem · 第 1372 行
- :669
onTap: () { - :883
onTap: () { - :901
onTap: () { - :925
onTap: onTap, - :1002
onTap: () { - :1045
onTap: onTap, - :1283
onTap: () async { - :1284
final result = await context.push('/main/artwork-detail', extra: artwork); - :1378
onTap: () async { - :1379
final result = await context.push('/main/photo-detail', extra: photo);
自动索引由 scripts/extract.py 生成,交互清单由 scripts/coverage_spec.json 维护。生成不会替代源码审阅。