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 行

接口数据使用可重置的离线样本;源码结构与条件已映射,未做 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 行

    接口数据使用可重置的离线样本;源码结构与条件已映射,未做 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 行

        接口数据使用可重置的离线样本;源码结构与条件已映射,未做 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 行

        接口数据使用可重置的离线样本;源码结构与条件已映射,未做 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 行

        接口数据使用可重置的离线样本;源码结构与条件已映射,未做 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 行

        三个指南为页内展开收起,非弹窗。

        浏览器: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 行

        源码仅操作本地消息列表。输入后不新增自动回复或模拟客服会话。

        浏览器:已在浏览器打开;初始按钮已进行隔离 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 行

        /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 行

        接口数据使用可重置的离线样本;源码结构与条件已映射,未做 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 行

        接口数据使用可重置的离线样本;源码结构与条件已映射,未做 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 行

        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 行

        接口数据使用可重置的离线样本;源码结构与条件已映射,未做 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 行

        原生图片导出和分享用模拟窗口表示;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 空回调。目录展示示例文章参数。

        浏览器: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 行

          分类和“查看全部文章”实际跳在线客服。邮件按钮仅显示邮箱,不发送邮件。

          浏览器:已在浏览器打开;初始按钮已进行隔离 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 行

          “手动输入代码 →”标题是空回调;下方输入框和加入按钮有效。二维码是不可扫码的占位。

          浏览器:已在浏览器打开;初始按钮已进行隔离 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/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 行

          接口数据使用可重置的离线样本;源码结构与条件已映射,未做 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 行

          活跃会话区域的方法未被 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 行

          支付 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 事件检查,未逐分支浏览器点击。

          源码方法和交互索引

          这是静态匹配索引,包含可能未调用的方法;是否启用以上方说明为准。

          • _syncStatus · 第 83 行
          • :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 行

          源码 _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 维护。生成不会替代源码审阅。