diff --git a/core/Clash.Meta b/core/Clash.Meta index d1dc1e4..1c46eb8 160000 --- a/core/Clash.Meta +++ b/core/Clash.Meta @@ -1 +1 @@ -Subproject commit d1dc1e4433928ae2202fdb89798126b6ce7fd111 +Subproject commit 1c46eb82bfa75828dcef7664816d2e8aab20df03 diff --git a/core/common.go b/core/common.go index 7f62912..4c00b11 100644 --- a/core/common.go +++ b/core/common.go @@ -175,8 +175,10 @@ func patchConfig(general *config.General) { const concurrentCount = math.MaxInt +var wg = sync.WaitGroup{} +var exit = make(chan struct{}) + func hcCompatibleProvider(proxyProviders map[string]provider.ProxyProvider) { - wg := sync.WaitGroup{} ch := make(chan struct{}, concurrentCount) for _, proxyProvider := range proxyProviders { proxyProvider := proxyProvider @@ -184,6 +186,11 @@ func hcCompatibleProvider(proxyProviders map[string]provider.ProxyProvider) { log.Infoln("Start initial Compatible provider %s", proxyProvider.Name()) wg.Add(1) ch <- struct{}{} + select { + case <-exit: + return // 收到退出信号,退出协程 + default: + } go func() { defer func() { <-ch; wg.Done() }() if err := proxyProvider.Initial(); err != nil { @@ -193,7 +200,13 @@ func hcCompatibleProvider(proxyProviders map[string]provider.ProxyProvider) { } } +} +func cancelHc() { + close(exit) + wg.Wait() + exit = make(chan struct{}) + wg = sync.WaitGroup{} } func applyConfig(isPatch bool) { @@ -205,5 +218,6 @@ func applyConfig(isPatch bool) { patchConfig(cfg.General) } else { executor.ApplyConfig(cfg, true) + healthcheck() } } diff --git a/core/hub.go b/core/hub.go index 92e4e8c..7380b06 100644 --- a/core/hub.go +++ b/core/hub.go @@ -120,6 +120,10 @@ func changeProxy(s *C.char) bool { return true } +// clearEffect +func clearConfigEffect() { +} + //export getTraffic func getTraffic() *C.char { up, down := statistic.DefaultManager.Now() diff --git a/lib/controller.dart b/lib/controller.dart index 0253c34..1988854 100644 --- a/lib/controller.dart +++ b/lib/controller.dart @@ -236,7 +236,6 @@ class AppController { } healthcheck() { - if (globalState.healthcheckLock) return; for (final delay in appState.delayMap.entries) { setDelay( Delay( diff --git a/lib/fragments/proxies.dart b/lib/fragments/proxies.dart index d75a92e..c7b6a47 100644 --- a/lib/fragments/proxies.dart +++ b/lib/fragments/proxies.dart @@ -84,7 +84,11 @@ class _ProxiesFragmentState extends State ); }, builder: (_, state, __) { - _tabController ??= TabController( + if (_tabController != null) { + _tabController!.dispose(); + _tabController = null; + } + _tabController = TabController( length: state.groupNames.length, vsync: this, initialIndex: state.currentIndex, diff --git a/lib/state.dart b/lib/state.dart index d2d39b0..928601d 100644 --- a/lib/state.dart +++ b/lib/state.dart @@ -23,7 +23,6 @@ class GlobalState { List updateFunctionLists = []; List currentNavigationItems = []; bool updatePackagesLock = false; - bool healthcheckLock = false; startListenUpdate() { if (timer != null && timer!.isActive == true) return; diff --git a/lib/widgets/clash_message_container.dart b/lib/widgets/clash_message_container.dart index 1d66e2b..d2c77af 100644 --- a/lib/widgets/clash_message_container.dart +++ b/lib/widgets/clash_message_container.dart @@ -38,14 +38,12 @@ class _ClashMessageContainerState extends State @override void onDelay(Delay delay) { - globalState.healthcheckLock = true; context.appController.setDelay(delay); WidgetsBinding.instance.addPostFrameCallback((_) { globalState.updateSortNumDebounce ??= debounce( () { context.appController.updateGroups(); context.appController.appState.sortNum++; - globalState.healthcheckLock = false; }, milliseconds: 5000, ); diff --git a/pubspec.yaml b/pubspec.yaml index e1f59a6..28e164d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: fl_clash description: A multi-platform proxy client based on ClashMeta, simple and easy to use, open-source and ad-free. publish_to: 'none' -version: 0.7.11 +version: 0.7.12 environment: sdk: '>=3.1.0 <4.0.0'