From d08b908e1f1a2a46d1c715b2e36dd7df7b27be5a Mon Sep 17 00:00:00 2001 From: wangjia <809946525@qq.com> Date: Mon, 29 Jun 2026 23:26:19 +0800 Subject: [PATCH] =?UTF-8?q?fix(client):=20=E8=8A=82=E7=82=B9=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E5=BB=B6=E8=BF=9F=E6=8E=A2=E6=B5=8B=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=E6=97=B6=E4=BF=9D=E7=95=99=E6=97=A7=E5=80=BC,=E4=BF=AE?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E5=90=8E=E6=95=B4=E5=88=97=E5=BB=B6=E8=BF=9F?= =?UTF-8?q?=E6=B6=88=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 返工引入的回归:看门狗连接态周期 refresh→_measure 重测所有节点 TCP ping,但连接态 全局 TUN 把到节点的握手接住→probeAll 返回 0→pings[uuid]??n.ping 因 0 非 null 覆盖成空。 改:探测返回 0 时保留旧 ping。连接态保留上次延迟,断开态正常刷新。 Co-Authored-By: Claude Opus 4.8 --- client/lib/state/nodes_provider.dart | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/client/lib/state/nodes_provider.dart b/client/lib/state/nodes_provider.dart index 9120d48..305a8ec 100644 --- a/client/lib/state/nodes_provider.dart +++ b/client/lib/state/nodes_provider.dart @@ -56,13 +56,18 @@ class NodesNotifier extends AsyncNotifier> { } /// 后台实测各节点延迟,完成后回填(notifier 未销毁才更新)。 + /// 探测失败(返回 0,如连接态全局 TUN 把到节点的 TCP 握手接住)时**保留旧 ping**, + /// 不把已知延迟覆盖成空——否则连上后节点列表延迟会整列消失。 Future _measure(List list) async { if (list.isEmpty) return; final pings = await probeAll( [for (final n in list) (uuid: n.uuid, host: n.host, port: n.port)], ); if (_disposed) return; - final updated = [for (final n in list) n.copyWith(ping: pings[n.uuid] ?? n.ping)]; + final updated = [ + for (final n in list) + n.copyWith(ping: (pings[n.uuid] ?? 0) > 0 ? pings[n.uuid]! : n.ping) + ]; state = AsyncData(updated); }