219 lines
7.5 KiB
Markdown
Executable File
219 lines
7.5 KiB
Markdown
Executable File
# 登录后只显示地图问题修复总结
|
||
|
||
## 🎯 修复目标
|
||
|
||
解决登录后重新打开app时只显示地图而其他页面(底部面板、登录框等)不显示的问题。
|
||
|
||
## 🔧 修复内容
|
||
|
||
### **1. 增强登录状态验证逻辑**
|
||
|
||
#### **修改位置**: `_kr_validateAndSetLoginStatus()` 方法
|
||
|
||
#### **修复内容**:
|
||
- **多重验证**: 同时检查 `hasToken` 和 `isLoginFlag`
|
||
- **详细日志**: 添加更详细的状态验证日志
|
||
- **Token验证**: 确保Token不为空且不为空字符串
|
||
- **状态设置**: 明确设置登录状态并记录日志
|
||
|
||
```dart
|
||
// 多重验证登录状态
|
||
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()`
|
||
|
||
#### **修复内容**:
|
||
- **状态检查**: 检查订阅服务当前状态
|
||
- **智能初始化**: 根据状态决定是否需要初始化
|
||
- **错误处理**: 初始化失败时设置错误状态
|
||
- **自动重试**: 失败时自动启动重试机制
|
||
|
||
```dart
|
||
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秒后检查订阅服务是否还在加载
|
||
- **自动处理**: 超时时自动设置为错误状态
|
||
- **重试机制**: 超时后自动启动重试
|
||
|
||
```dart
|
||
// 设置超时处理
|
||
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次
|
||
- **渐进延迟**: 重试间隔逐渐增加
|
||
- **状态检查**: 只在错误状态时重试
|
||
|
||
```dart
|
||
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时自动尝试初始化
|
||
- **详细日志**: 添加详细的状态变化日志
|
||
|
||
```dart
|
||
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. **完善了错误处理和恢复逻辑**
|
||
|
||
这些修复将显著减少问题的发生频率,提高应用的稳定性和用户体验。
|