LighthouseApp/CONNECTION_INFO_DISAPPEAR_ANALYSIS.md
speakeloudest 75d4c48e41
Some checks failed
Build Windows / build (push) Has been cancelled
feat: 源码提交
2025-10-19 23:30:54 -07:00

5.9 KiB
Executable File
Raw Permalink Blame History

连接信息消失问题分析

🔍 问题描述

用户反馈在什么情况下把app关掉后重新打开下面的"当前连接"和"连接方式"都不显示了。

📋 显示逻辑分析

1. 当前连接显示条件

显示位置: kr_home_bottom_panel.dart 第94-97行

// 1. 如果已订阅,展示当前连接卡片
if (hasValidSubscription)
  Container(
      margin: EdgeInsets.only(top: 12.h),
      child: const KRHomeConnectionInfoView())

显示条件: hasValidSubscription

final hasValidSubscription = 
    controller.kr_subscribeService.kr_currentSubscribe.value != null;

2. 连接方式显示条件

显示位置: kr_home_bottom_panel.dart 第118-123行

// 4. 连接选项(分组和国家入口)
Padding(
  padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 12.w),
  child: const KRHomeConnectionOptionsView(),
),

显示条件: 始终显示(在已登录状态下)

3. 登录状态判断

显示逻辑: kr_home_bottom_panel.dart 第72-85行

if (isNotLoggedIn)
  // 未登录状态下,只显示连接选项
  SingleChildScrollView(
    child: Column(
      children: [
        Padding(
          padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 12.w),
          child: const KRHomeConnectionOptionsView(),
        ),
      ],
    ),
  )
else
  // 已登录状态下,显示完整内容
  Expanded(
    child: SingleChildScrollView(
      child: Column(
        children: [
          // 当前连接卡片需要hasValidSubscription
          // 连接选项
        ],
      ),
    ),
  )

🎯 问题根源分析

核心问题: kr_currentSubscribe.valuenull

kr_currentSubscribe.valuenull 时:

  1. 当前连接卡片不显示: hasValidSubscription = false
  2. 连接方式可能不显示: 取决于登录状态

可能导致 kr_currentSubscribe.valuenull 的情况:

1. 订阅服务初始化失败

  • 网络问题: API请求失败
  • 服务器问题: 后端服务异常
  • 超时问题: 请求超时

2. 订阅数据获取失败

  • API返回空列表: subscribes.isEmpty
  • 订阅过期: 所有订阅都已过期
  • 权限问题: 用户没有可用订阅

3. 应用启动时序问题

  • 竞态条件: 订阅服务初始化晚于UI渲染
  • 状态同步问题: 登录状态和订阅状态不同步
  • 缓存问题: 本地缓存数据损坏

4. 登录状态问题

  • Token失效: 用户token过期或无效
  • 登录状态丢失: kr_isLogin.value = false
  • 用户信息加载失败: 用户信息初始化失败

🔧 具体场景分析

场景1: 网络问题

启动应用 → 登录成功 → 订阅服务初始化 → 网络请求失败 → kr_currentSubscribe.value = null → 当前连接不显示

场景2: 订阅过期

启动应用 → 登录成功 → 订阅服务初始化 → 获取订阅列表 → 所有订阅已过期 → kr_currentSubscribe.value = null → 当前连接不显示

场景3: 竞态条件

启动应用 → UI渲染 → 订阅服务还在初始化中 → kr_currentSubscribe.value = null → 当前连接不显示

场景4: 登录状态问题

启动应用 → 登录状态判断错误 → 显示未登录界面 → 连接方式显示但当前连接不显示

📊 调试方法

1. 检查关键状态

// 在 kr_home_bottom_panel.dart 中添加日志
KRLogUtil.kr_i('当前登录状态: ${controller.kr_currentViewStatus.value}', tag: 'HomeBottomPanel');
KRLogUtil.kr_i('当前订阅: ${controller.kr_subscribeService.kr_currentSubscribe.value}', tag: 'HomeBottomPanel');
KRLogUtil.kr_i('订阅服务状态: ${controller.kr_subscribeService.kr_currentStatus.value}', tag: 'HomeBottomPanel');

2. 检查订阅服务初始化

// 在 kr_subscribe_service.dart 中添加日志
KRLogUtil.kr_i('订阅服务初始化开始', tag: 'SubscribeService');
KRLogUtil.kr_i('获取订阅列表结果: ${subscribes.length} 个订阅', tag: 'SubscribeService');
KRLogUtil.kr_i('当前订阅设置: ${kr_currentSubscribe.value?.name}', tag: 'SubscribeService');

3. 检查网络请求

// 检查API请求是否成功
KRLogUtil.kr_i('API请求状态: ${result.isLeft() ? "失败" : "成功"}', tag: 'SubscribeService');

🛠️ 修复建议

1. 增强错误处理

// 在订阅服务初始化失败时,显示错误信息而不是空白
if (kr_currentStatus.value == KRSubscribeServiceStatus.kr_error) {
  return _kr_buildErrorView(context);
}

2. 添加重试机制

// 订阅服务初始化失败时自动重试
if (kr_currentSubscribe.value == null && kr_currentStatus.value == KRSubscribeServiceStatus.kr_error) {
  // 延迟重试
  Future.delayed(Duration(seconds: 3), () {
    kr_refreshAll();
  });
}

3. 改善用户体验

// 显示加载状态而不是空白
if (kr_currentSubscribe.value == null && kr_currentStatus.value == KRSubscribeServiceStatus.kr_loading) {
  return _kr_buildLoadingView();
}

4. 添加状态检查

// 定期检查订阅状态
Timer.periodic(Duration(seconds: 30), (timer) {
  if (kr_currentSubscribe.value == null && kr_isLogin.value) {
    kr_refreshAll();
  }
});

📝 总结

问题根源: kr_currentSubscribe.valuenull,导致 hasValidSubscription = false

主要原因:

  1. 订阅服务初始化失败
  2. 网络请求失败
  3. 订阅数据获取失败
  4. 应用启动时序问题
  5. 登录状态问题

解决方案:

  1. 增强错误处理和重试机制
  2. 改善用户体验(显示加载状态)
  3. 添加状态检查和自动恢复
  4. 完善日志记录便于调试

建议: 先添加详细的日志记录,确定具体是哪种情况导致的问题,然后针对性地修复。