7.5 KiB
Executable File
7.5 KiB
Executable File
登录后只显示地图问题修复总结
🎯 修复目标
解决登录后重新打开app时只显示地图而其他页面(底部面板、登录框等)不显示的问题。
🔧 修复内容
1. 增强登录状态验证逻辑
修改位置: _kr_validateAndSetLoginStatus() 方法
修复内容:
- 多重验证: 同时检查
hasToken和isLoginFlag - 详细日志: 添加更详细的状态验证日志
- 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;
}
}
});
}
🎯 修复效果
解决的问题:
- 竞态条件: 通过增强状态验证和确保订阅服务初始化解决
- 订阅服务初始化失败: 通过添加重试机制和超时处理解决
- 状态监听器注册时机: 通过优化异步初始化时序解决
- 登录状态验证不准确: 通过多重验证和详细日志解决
预期改善:
- 减少只显示地图的情况: 通过确保订阅服务正确初始化
- 提高状态一致性: 通过增强状态验证和同步检查
- 增强错误恢复能力: 通过自动重试机制
- 改善用户体验: 通过超时处理和智能重试
📊 监控和调试
关键日志点:
登录状态验证: hasToken=xxx, isLogin=xxx, isValid=xxx订阅服务当前状态: xxx订阅服务状态变化: xxx启动订阅服务重试机制订阅服务初始化超时
状态检查:
kr_currentViewStatus的值kr_currentListStatus的值kr_subscribeService.kr_currentStatus的值KRAppRunData().kr_isLogin的值
🚀 测试建议
测试场景:
- 正常登录: 验证登录后所有功能正常显示
- 网络异常: 验证网络异常时的重试机制
- 超时情况: 验证超时处理和自动重试
- 状态切换: 验证登录/登出状态切换
- 多次重试: 验证多次重试后的最终状态
验证要点:
- 登录后底部面板是否正常显示
- 订阅服务是否成功初始化
- 错误状态是否自动恢复
- 重试机制是否正常工作
- 日志信息是否详细准确
📝 总结
通过系统性的修复,我们解决了登录后只显示地图问题的根本原因:
- 增强了状态验证的可靠性
- 确保了订阅服务的正确初始化
- 添加了超时处理和重试机制
- 优化了异步初始化的时序
- 完善了错误处理和恢复逻辑
这些修复将显著减少问题的发生频率,提高应用的稳定性和用户体验。