203 lines
5.9 KiB
Markdown
Executable File
203 lines
5.9 KiB
Markdown
Executable File
# 连接信息消失问题分析
|
||
|
||
## 🔍 问题描述
|
||
|
||
用户反馈:在什么情况下,把app关掉后重新打开,下面的"当前连接"和"连接方式"都不显示了。
|
||
|
||
## 📋 显示逻辑分析
|
||
|
||
### **1. 当前连接显示条件**
|
||
|
||
#### **显示位置**: `kr_home_bottom_panel.dart` 第94-97行
|
||
```dart
|
||
// 1. 如果已订阅,展示当前连接卡片
|
||
if (hasValidSubscription)
|
||
Container(
|
||
margin: EdgeInsets.only(top: 12.h),
|
||
child: const KRHomeConnectionInfoView())
|
||
```
|
||
|
||
#### **显示条件**: `hasValidSubscription`
|
||
```dart
|
||
final hasValidSubscription =
|
||
controller.kr_subscribeService.kr_currentSubscribe.value != null;
|
||
```
|
||
|
||
### **2. 连接方式显示条件**
|
||
|
||
#### **显示位置**: `kr_home_bottom_panel.dart` 第118-123行
|
||
```dart
|
||
// 4. 连接选项(分组和国家入口)
|
||
Padding(
|
||
padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 12.w),
|
||
child: const KRHomeConnectionOptionsView(),
|
||
),
|
||
```
|
||
|
||
#### **显示条件**: 始终显示(在已登录状态下)
|
||
|
||
### **3. 登录状态判断**
|
||
|
||
#### **显示逻辑**: `kr_home_bottom_panel.dart` 第72-85行
|
||
```dart
|
||
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.value` 为 `null`
|
||
|
||
当 `kr_currentSubscribe.value` 为 `null` 时:
|
||
1. **当前连接卡片不显示**: `hasValidSubscription = false`
|
||
2. **连接方式可能不显示**: 取决于登录状态
|
||
|
||
### **可能导致 `kr_currentSubscribe.value` 为 `null` 的情况**:
|
||
|
||
#### **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. 检查关键状态**
|
||
```dart
|
||
// 在 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. 检查订阅服务初始化**
|
||
```dart
|
||
// 在 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. 检查网络请求**
|
||
```dart
|
||
// 检查API请求是否成功
|
||
KRLogUtil.kr_i('API请求状态: ${result.isLeft() ? "失败" : "成功"}', tag: 'SubscribeService');
|
||
```
|
||
|
||
## 🛠️ 修复建议
|
||
|
||
### **1. 增强错误处理**
|
||
```dart
|
||
// 在订阅服务初始化失败时,显示错误信息而不是空白
|
||
if (kr_currentStatus.value == KRSubscribeServiceStatus.kr_error) {
|
||
return _kr_buildErrorView(context);
|
||
}
|
||
```
|
||
|
||
### **2. 添加重试机制**
|
||
```dart
|
||
// 订阅服务初始化失败时自动重试
|
||
if (kr_currentSubscribe.value == null && kr_currentStatus.value == KRSubscribeServiceStatus.kr_error) {
|
||
// 延迟重试
|
||
Future.delayed(Duration(seconds: 3), () {
|
||
kr_refreshAll();
|
||
});
|
||
}
|
||
```
|
||
|
||
### **3. 改善用户体验**
|
||
```dart
|
||
// 显示加载状态而不是空白
|
||
if (kr_currentSubscribe.value == null && kr_currentStatus.value == KRSubscribeServiceStatus.kr_loading) {
|
||
return _kr_buildLoadingView();
|
||
}
|
||
```
|
||
|
||
### **4. 添加状态检查**
|
||
```dart
|
||
// 定期检查订阅状态
|
||
Timer.periodic(Duration(seconds: 30), (timer) {
|
||
if (kr_currentSubscribe.value == null && kr_isLogin.value) {
|
||
kr_refreshAll();
|
||
}
|
||
});
|
||
```
|
||
|
||
## 📝 总结
|
||
|
||
**问题根源**: `kr_currentSubscribe.value` 为 `null`,导致 `hasValidSubscription = false`
|
||
|
||
**主要原因**:
|
||
1. 订阅服务初始化失败
|
||
2. 网络请求失败
|
||
3. 订阅数据获取失败
|
||
4. 应用启动时序问题
|
||
5. 登录状态问题
|
||
|
||
**解决方案**:
|
||
1. 增强错误处理和重试机制
|
||
2. 改善用户体验(显示加载状态)
|
||
3. 添加状态检查和自动恢复
|
||
4. 完善日志记录便于调试
|
||
|
||
**建议**: 先添加详细的日志记录,确定具体是哪种情况导致的问题,然后针对性地修复。
|
||
|