修正切换订阅计划多节点列表展示问题

This commit is contained in:
2025-10-23 13:24:48 +08:00
parent f1a8dfe4e7
commit 6936fab392
8 changed files with 80 additions and 29 deletions
+2
View File
@@ -1044,6 +1044,8 @@ class AppConfig {
return "${KRProtocol.kr_https}://${KRDomain.kr_api}";
}
/// ⚠️ 已遗弃:WebSocket 连接不再使用
@Deprecated('wsBaseUrl has been deprecated')
String get wsBaseUrl {
if (kDebugMode) {
return "ws://192.168.0.113";
+4 -19
View File
@@ -258,26 +258,11 @@ class KRAppRunData {
}
/// 建立 Socket 连接
/// ⚠️ 已遗弃:wsBaseUrl 不再使用
Future<void> _kr_connectSocket(String userId) async {
// 如果已存在连接,先断开
await _kr_disconnectSocket();
final deviceId = KRDeviceInfoService().deviceId ?? 'unknown';
KRLogUtil.kr_i('设备ID: $deviceId', tag: 'AppRunData');
KrSocketService.instance.kr_init(
baseUrl: AppConfig.getInstance().wsBaseUrl,
userId: userId,
deviceNumber: deviceId,
token: kr_token ?? "",
);
// 设置消息处理回调
KrSocketService.instance.setOnMessageCallback(_kr_handleMessage);
// 设置连接状态回调
KrSocketService.instance.setOnConnectionStateCallback(_kr_handleConnectionState);
// 建立连接
KrSocketService.instance.connect();
// 已遗弃,不再建立 Socket 连接
KRLogUtil.kr_i('Socket 连接已遗弃', tag: 'AppRunData');
// 如果需要实时消息,使用其他实现方式
}
/// 处理接收到的消息
+24 -3
View File
@@ -26,12 +26,33 @@ class KRNodeList {
return const KRNodeList(list: []);
}
// 获取第一个订阅对象
final subscribeData = listData[0] as Map<String, dynamic>;
// 尝试找到与请求参数 id 匹配的订阅项
// 如果 json 中有 subscribeId,则查找匹配项;否则使用第一个
Map<String, dynamic>? subscribeData;
final String? requestSubscribeId = json['subscribeId']?.toString();
if (requestSubscribeId != null && requestSubscribeId.isNotEmpty) {
// 查找 id 匹配的订阅项
try {
subscribeData = listData.firstWhere(
(item) => (item as Map<String, dynamic>)['id']?.toString() == requestSubscribeId,
orElse: () => listData[0] as Map<String, dynamic>
) as Map<String, dynamic>;
KRLogUtil.kr_i('✅ 找到匹配的订阅项: id=$requestSubscribeId', tag: 'NodeList');
} catch (e) {
KRLogUtil.kr_w('⚠️ 未找到匹配的订阅项,使用第一个', tag: 'NodeList');
subscribeData = listData[0] as Map<String, dynamic>;
}
} else {
// 如果没有提供 subscribeId,使用第一个
subscribeData = listData[0] as Map<String, dynamic>;
}
final bool isTryOut = subscribeData['is_try_out'] as bool? ?? false;
final List<dynamic>? nodesData = subscribeData['nodes'] as List<dynamic>?;
KRLogUtil.kr_i('节点列表解析: is_try_out=$isTryOut, 节点数=${nodesData?.length ?? 0}', tag: 'NodeList');
KRLogUtil.kr_i('🔍 节点列表解析: subscribe_id=${subscribeData['id']}, is_try_out=$isTryOut, 节点数=${nodesData?.length ?? 0}', tag: 'NodeList');
KRLogUtil.kr_i('📊 所有订阅项数量: ${listData.length}', tag: 'NodeList');
return KRNodeList(
list: nodesData?.map((e) => KrNodeListItem.fromJson(e as Map<String, dynamic>)).toList() ?? [],
@@ -9,6 +9,7 @@ import 'package:kaer_with_panels/app/model/response/kr_package_list.dart';
import 'package:kaer_with_panels/app/network/base_response.dart';
import 'package:kaer_with_panels/app/network/http_error.dart';
import 'package:kaer_with_panels/app/network/http_util.dart';
import 'package:kaer_with_panels/app/utils/kr_log_util.dart';
import '../../model/response/kr_already_subscribe.dart';
import '../../model/response/kr_node_group_list.dart';
@@ -55,7 +56,24 @@ class KRSubscribeApi {
HttpError(msg: baseResponse.retMsg, code: baseResponse.retCode));
}
return right(baseResponse.model);
// 将请求的 subscribeId 传入节点列表模型中
final nodeList = baseResponse.model;
// 将请求ID添加到模型中用于查找匹配的订阅项
// 使用 body 字段重新解析,以便能够找到正确的订阅项
if (baseResponse.body.isNotEmpty && baseResponse.body.containsKey('list')) {
try {
// 添加订阅ID信息到解析参数中
baseResponse.body['subscribeId'] = id.toString();
final reparsed = KRNodeList.fromJson(baseResponse.body);
return right(reparsed);
} catch (e) {
// 如果重新解析失败,使用原始模型
KRLogUtil.kr_w('重新解析节点列表失败: $e,使用原始模型', tag: 'SubscribeApi');
}
}
return right(nodeList);
}
/// 获取用户可用订阅
@@ -230,11 +230,10 @@ class KRSingBoxImp {
"log-level": "warn",
"resolve-destination": false,
"ipv6-mode": "ipv4_only",
// "remote-dns-address": "https://cloudflare-dns.com/dns-query",
"remote-dns-address": "udp://1.1.1.1",
"remote-dns-domain-strategy": "",
"direct-dns-address": "223.5.5.5",
"direct-dns-domain-strategy": "",
"remote-dns-address": "udp://8.8.8.8",
"remote-dns-domain-strategy": "prefer_ipv4",
"direct-dns-address": "udp://1.1.1.1",
"direct-dns-domain-strategy": "prefer_ipv4",
"mixed-port": kr_port,
"tproxy-port": kr_port,
"local-dns-port": 36450,