feat: 更改节点测速
Some checks failed
Build Windows / 编译 libcore (Windows) (20.15.1) (push) Successful in 20m53s
Build Windows / build (push) Has been cancelled

This commit is contained in:
speakeloudest 2025-11-21 02:52:23 -08:00
parent 9123d5f0e4
commit becc03acfd
4 changed files with 104 additions and 56 deletions

View File

@ -1,11 +1,12 @@
import 'package:get/get.dart';
import 'package:flutter/material.dart';
import 'package:kaer_with_panels/app/utils/kr_log_util.dart';
import 'package:kaer_with_panels/app/services/kr_subscribe_service.dart';
import 'package:kaer_with_panels/app/services/singbox_imp/kr_sing_box_imp.dart';
import '../../../localization/app_translations.dart';
import 'package:kaer_with_panels/app/modules/kr_home/controllers/kr_home_controller.dart';
class HINodeListController extends GetxController {
class HINodeListController extends GetxController with WidgetsBindingObserver {
///
final KRSubscribeService kr_subscribeService = KRSubscribeService();
@ -94,4 +95,40 @@ class HINodeListController extends GetxController {
KRLogUtil.kr_i('调试模式已重置', tag: 'HINodeListController');
}
@override
void onInit() {
super.onInit();
WidgetsBinding.instance.addObserver(this);
ever(homeController.kr_cutTag, (tag) {
if (homeController.kr_isLatency.value) return;
KRLogUtil.kr_i('🔄 节点切换成功 - 自动触发延迟测试', tag: 'HINodeListView');
homeController.kr_urlTest();
});
}
@override
void onReady() {
super.onReady();
if (homeController.kr_isLatency.value) return;
KRLogUtil.kr_i('🔄 节点列表显示 - 自动触发延迟测试', tag: 'HINodeListView');
homeController.kr_urlTest();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
super.didChangeAppLifecycleState(state);
//
if (state == AppLifecycleState.resumed) {
if (homeController.kr_isLatency.value) return;
KRLogUtil.kr_i('🔄 节点列表显示 - 自动触发延迟测试', tag: 'HINodeListView');
homeController.kr_urlTest();
}
}
@override
void onClose() {
WidgetsBinding.instance.removeObserver(this);
super.onClose();
}
}

View File

@ -84,16 +84,9 @@ class HINodeListView extends GetView<HINodeListController> {
);
}
/// /
/// /使
Widget _kr_buildRegionList(BuildContext context) {
return Obx(() {
//
WidgetsBinding.instance.addPostFrameCallback((_) {
if (!controller.homeController.kr_isConnected.value && !controller.homeController.kr_isLatency.value) {
KRLogUtil.kr_i('🔄 节点列表显示 - 自动触发延迟测试', tag: 'HINodeListView');
controller.homeController.kr_urlTest();
}
});
return _kr_buildListContainer(
context,
child: ListView(
@ -217,14 +210,6 @@ class HINodeListView extends GetView<HINodeListController> {
///
Widget _buildSubscribeList(BuildContext context) {
return Obx(() {
//
WidgetsBinding.instance.addPostFrameCallback((_) {
if (!controller.homeController.kr_isConnected.value && !controller.homeController.kr_isLatency.value) {
KRLogUtil.kr_i('🔄 节点列表显示 - 自动触发延迟测试', tag: 'HINodeListView');
controller.homeController.kr_urlTest();
}
});
return _kr_buildListContainer(
context,
child: ListView(
@ -293,7 +278,14 @@ class HINodeListView extends GetView<HINodeListController> {
),
),
// 2. Text: "根据网络IP自动匹配最快线路"
Obx(() {
Text(
'根据网络IP自动匹配最快线路', //
style: KrAppTextStyle(
fontSize: 10,
color: Colors.white,
),
),
/* Obx(() {
// auto
if (controller.homeController.kr_cutTag.value == 'auto') {
final autoNodeInfo = controller.homeController.kr_getGlobalAutoSelectedNode();
@ -314,7 +306,7 @@ class HINodeListView extends GetView<HINodeListController> {
color: Colors.white,
),
);
}),
}),*/
],
),
),

View File

@ -1438,7 +1438,7 @@ class KRHomeController extends GetxController with WidgetsBindingObserver {
print('当前活动组----$group}');
// auto
if (kr_cutTag.value == 'auto' && group.type == ProxyType.urltest && group.tag == 'auto') {
if (kr_cutTag.value.endsWith('auto') && group.type == ProxyType.urltest && group.tag == 'auto') {
final selectedNode = group.selected;
final node = kr_subscribeService.keyList[selectedNode];
return {
@ -1447,21 +1447,7 @@ class KRHomeController extends GetxController with WidgetsBindingObserver {
'country': node?.country ?? '',
};
}
// country-auto
if (kr_cutTag.value.endsWith('-auto') && group.type == ProxyType.urltest) {
if (group.tag == kr_cutTag.value) {
final selectedNode = group.selected;
final node = kr_subscribeService.keyList[selectedNode];
return {
'nodeName': selectedNode,
'delay': node?.urlTestDelay.value ?? -2,
'country': node?.country ?? '',
};
}
}
}
print('hhhhhh${kr_subscribeService.keyList}', );
// country-auto SingBox
if (kr_cutTag.value.endsWith('-auto')) {
@ -2280,7 +2266,8 @@ class KRHomeController extends GetxController with WidgetsBindingObserver {
for (var node in allNodes) {
final delay = node.urlTestDelay.value;
if (delay > 0 && delay < 3000 && delay < fastestDelay) {
KRLogUtil.kr_w('🔍 检查节点 ${node.tag} 的延迟: $delay', tag: 'HomeController');
if (delay > 0 && delay < fastestDelay) {
fastestDelay = delay;
fastestNode = node;
}
@ -2446,7 +2433,7 @@ class KRHomeController extends GetxController with WidgetsBindingObserver {
KRLogUtil.kr_d('找到 selector 组: ${group.tag}, 选中: ${group.selected}', tag: 'HomeController');
// auto模式urltest组获取延迟
if (kr_cutTag.value == "auto") {
if (kr_cutTag.value.endsWith('auto')) {
for (var item in group.items) {
if (item.tag == "auto" && item.urlTestDelay != 0) {
kr_currentNodeLatency.value = item.urlTestDelay;
@ -2455,17 +2442,6 @@ class KRHomeController extends GetxController with WidgetsBindingObserver {
}
}
}
// -auto模式urltest组获取延迟
else if (kr_cutTag.value.endsWith('-auto')) {
final countryCode = kr_cutTag.value.replaceAll('-auto', '');
for (var item in group.items) {
if (item.tag == kr_cutTag.value && item.urlTestDelay != 0) {
kr_currentNodeLatency.value = item.urlTestDelay;
KRLogUtil.kr_i('${countryCode}-auto模式延迟值: ${item.urlTestDelay}ms', tag: 'HomeController');
return true;
}
}
}
//
else {
for (var item in group.items) {

View File

@ -642,15 +642,7 @@ class KRSingBoxImp {
"enable-fake-dns": false,
"enable-dns-routing": true,
"independent-dns-cache": true,
"rules": [
// - HiddifyOptions.Rules
// Native config.BuildConfig()
// libcore domains 使 "domain:ip.sb" domain_suffix
{
"domains": "domain:api.hifast.biz", // domain: domain_suffix
"outbound": "bypass" // bypass = direct
}
],
"rules": _kr_buildHiddifyRules(),
"mux": {
"enable": false,
"padding": false,
@ -709,6 +701,57 @@ class KRSingBoxImp {
return op;
}
List<Map<String, dynamic>> _kr_buildHiddifyRules() {
final rules = <Map<String, dynamic>>[];
rules.add({
"domains": "domain:api.hifast.biz",
"outbound": "bypass"
});
final nodeDomains = _kr_collectNodeDomains();
for (final d in nodeDomains) {
rules.add({
"domains": "domain:$d",
"outbound": "bypass"
});
}
KRLogUtil.kr_i('✅ 节点域名白名单数量: ${nodeDomains.length}', tag: 'SingBox');
KRLogUtil.kr_i('✅ 节点域名白名单集合: ${jsonEncode(nodeDomains.toList())}', tag: 'SingBox');
return rules;
}
Set<String> _kr_collectNodeDomains() {
final set = <String>{};
void addFromOutbound(Map<String, dynamic> o) {
final server = o['server']?.toString();
if (server != null && server.isNotEmpty && InternetAddress.tryParse(server) == null) {
set.add(server.toLowerCase());
}
final tls = o['tls'];
if (tls is Map) {
final sni = tls['server_name']?.toString();
if (sni != null && sni.isNotEmpty && InternetAddress.tryParse(sni) == null) {
set.add(sni.toLowerCase());
}
}
}
for (final g in kr_outbounds) {
addFromOutbound(g);
}
for (final g in Kr_allOutbounds) {
for (final it in g.outboundList) {
addFromOutbound(it.config);
}
}
return set;
}
/// DNS
///
/// - 使 DoH + DNSfinal