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

7.5 KiB
Executable File
Raw Blame History

登录后只显示地图问题修复总结

🎯 修复目标

解决登录后重新打开app时只显示地图而其他页面底部面板、登录框等不显示的问题。

🔧 修复内容

1. 增强登录状态验证逻辑

修改位置: _kr_validateAndSetLoginStatus() 方法

修复内容:

  • 多重验证: 同时检查 hasTokenisLoginFlag
  • 详细日志: 添加更详细的状态验证日志
  • Token验证: 确保Token不为空且不为空字符串
  • 状态设置: 明确设置登录状态并记录日志
// 多重验证登录状态
final hasToken = KRAppRunData().kr_token != null && KRAppRunData().kr_token!.isNotEmpty;
final isLoginFlag = KRAppRunData().kr_isLogin.value;
final isValidLogin = hasToken && isLoginFlag;

KRLogUtil.kr_i('登录状态验证: hasToken=$hasToken, isLogin=$isLoginFlag, isValid=$isValidLogin', tag: 'HomeController');
KRLogUtil.kr_i('Token内容: ${KRAppRunData().kr_token?.substring(0, 10)}...', tag: 'HomeController');

2. 确保订阅服务初始化

新增方法: _kr_ensureSubscribeServiceInitialized()

修复内容:

  • 状态检查: 检查订阅服务当前状态
  • 智能初始化: 根据状态决定是否需要初始化
  • 错误处理: 初始化失败时设置错误状态
  • 自动重试: 失败时自动启动重试机制
void _kr_ensureSubscribeServiceInitialized() {
  try {
    // 检查订阅服务状态
    final currentStatus = kr_subscribeService.kr_currentStatus.value;
    
    if (currentStatus == KRSubscribeServiceStatus.kr_none || 
        currentStatus == KRSubscribeServiceStatus.kr_error) {
      // 设置加载状态并初始化
      kr_currentListStatus.value = KRHomeViewsListStatus.kr_loading;
      kr_subscribeService.kr_refreshAll().then((_) {
        KRLogUtil.kr_i('订阅服务初始化完成', tag: 'HomeController');
      }).catchError((error) {
        KRLogUtil.kr_e('订阅服务初始化失败: $error', tag: 'HomeController');
        kr_currentListStatus.value = KRHomeViewsListStatus.kr_error;
        _kr_retrySubscribeService();
      });
    }
  } catch (e) {
    KRLogUtil.kr_e('确保订阅服务初始化失败: $e', tag: 'HomeController');
    kr_currentListStatus.value = KRHomeViewsListStatus.kr_error;
  }
}

3. 添加超时处理机制

修改位置: _kr_initLoginStatus() 方法

修复内容:

  • 超时检测: 10秒后检查订阅服务是否还在加载
  • 自动处理: 超时时自动设置为错误状态
  • 重试机制: 超时后自动启动重试
// 设置超时处理
Timer(const Duration(seconds: 10), () {
  if (kr_currentListStatus.value == KRHomeViewsListStatus.kr_loading) {
    KRLogUtil.kr_w('订阅服务初始化超时,设置为错误状态', tag: 'HomeController');
    kr_currentListStatus.value = KRHomeViewsListStatus.kr_error;
    _kr_retrySubscribeService();
  }
});

4. 增强错误处理和重试机制

新增方法: _kr_retrySubscribeService()

修复内容:

  • 智能重试: 3秒后自动重试
  • 多次重试: 最多重试3次
  • 渐进延迟: 重试间隔逐渐增加
  • 状态检查: 只在错误状态时重试
void _kr_retrySubscribeService() {
  KRLogUtil.kr_i('启动订阅服务重试机制', tag: 'HomeController');
  
  Timer(const Duration(seconds: 3), () {
    if (kr_currentListStatus.value == KRHomeViewsListStatus.kr_error) {
      KRLogUtil.kr_i('重试订阅服务初始化', tag: 'HomeController');
      
      kr_subscribeService.kr_refreshAll().then((_) {
        KRLogUtil.kr_i('订阅服务重试成功', tag: 'HomeController');
      }).catchError((error) {
        KRLogUtil.kr_e('订阅服务重试失败: $error', tag: 'HomeController');
        
        // 第二次重试
        Timer(const Duration(seconds: 5), () {
          if (kr_currentListStatus.value == KRHomeViewsListStatus.kr_error) {
            KRLogUtil.kr_i('第二次重试订阅服务初始化', tag: 'HomeController');
            kr_subscribeService.kr_refreshAll().catchError((error) {
              KRLogUtil.kr_e('第二次重试失败: $error', tag: 'HomeController');
            });
          }
        });
      });
    }
  });
}

5. 优化异步初始化时序

修改位置: _bindSubscribeStatus() 方法

修复内容:

  • 状态监听: 增强订阅服务状态监听
  • 智能处理: 根据状态自动处理不同情况
  • 自动初始化: 状态为none时自动尝试初始化
  • 详细日志: 添加详细的状态变化日志
void _bindSubscribeStatus() {
  ever(kr_subscribeService.kr_currentStatus, (data) {
    KRLogUtil.kr_i('订阅服务状态变化: $data', tag: 'HomeController');
    
    if (KRAppRunData.getInstance().kr_isLogin.value) {
      switch (data) {
        case KRSubscribeServiceStatus.kr_loading:
          kr_currentListStatus.value = KRHomeViewsListStatus.kr_loading;
          break;
        case KRSubscribeServiceStatus.kr_error:
          kr_currentListStatus.value = KRHomeViewsListStatus.kr_error;
          _kr_retrySubscribeService();
          break;
        case KRSubscribeServiceStatus.kr_success:
          kr_currentListStatus.value = KRHomeViewsListStatus.kr_none;
          break;
        case KRSubscribeServiceStatus.kr_none:
          // 如果状态为none且已登录尝试初始化
          if (kr_currentViewStatus.value == KRHomeViewsStatus.kr_loggedIn) {
            _kr_ensureSubscribeServiceInitialized();
          }
          break;
      }
    }
  });
}

🎯 修复效果

解决的问题:

  1. 竞态条件: 通过增强状态验证和确保订阅服务初始化解决
  2. 订阅服务初始化失败: 通过添加重试机制和超时处理解决
  3. 状态监听器注册时机: 通过优化异步初始化时序解决
  4. 登录状态验证不准确: 通过多重验证和详细日志解决

预期改善:

  1. 减少只显示地图的情况: 通过确保订阅服务正确初始化
  2. 提高状态一致性: 通过增强状态验证和同步检查
  3. 增强错误恢复能力: 通过自动重试机制
  4. 改善用户体验: 通过超时处理和智能重试

📊 监控和调试

关键日志点:

  • 登录状态验证: hasToken=xxx, isLogin=xxx, isValid=xxx
  • 订阅服务当前状态: xxx
  • 订阅服务状态变化: xxx
  • 启动订阅服务重试机制
  • 订阅服务初始化超时

状态检查:

  • kr_currentViewStatus 的值
  • kr_currentListStatus 的值
  • kr_subscribeService.kr_currentStatus 的值
  • KRAppRunData().kr_isLogin 的值

🚀 测试建议

测试场景:

  1. 正常登录: 验证登录后所有功能正常显示
  2. 网络异常: 验证网络异常时的重试机制
  3. 超时情况: 验证超时处理和自动重试
  4. 状态切换: 验证登录/登出状态切换
  5. 多次重试: 验证多次重试后的最终状态

验证要点:

  • 登录后底部面板是否正常显示
  • 订阅服务是否成功初始化
  • 错误状态是否自动恢复
  • 重试机制是否正常工作
  • 日志信息是否详细准确

📝 总结

通过系统性的修复,我们解决了登录后只显示地图问题的根本原因:

  1. 增强了状态验证的可靠性
  2. 确保了订阅服务的正确初始化
  3. 添加了超时处理和重试机制
  4. 优化了异步初始化的时序
  5. 完善了错误处理和恢复逻辑

这些修复将显著减少问题的发生频率,提高应用的稳定性和用户体验。