From af9cfd0f592546878be5890c48aee4233734f164 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Mon, 5 Jan 2026 14:15:53 +0800 Subject: [PATCH] Fix publishing changes during view updates warning Defer state mutations in .onReceive handlers to next run loop by wrapping them in Task { @MainActor in ... } --- .../Views/Dashboard/ActiveDashboardView.swift | 28 +++++++++++-------- MacLibrary/MainView.swift | 16 ++++++----- SFI/MainView.swift | 12 ++++---- 3 files changed, 31 insertions(+), 25 deletions(-) diff --git a/ApplicationLibrary/Views/Dashboard/ActiveDashboardView.swift b/ApplicationLibrary/Views/Dashboard/ActiveDashboardView.swift index 8c5ac4b..55faf2b 100644 --- a/ApplicationLibrary/Views/Dashboard/ActiveDashboardView.swift +++ b/ApplicationLibrary/Views/Dashboard/ActiveDashboardView.swift @@ -155,19 +155,23 @@ import SwiftUI } #if os(iOS) || os(tvOS) .onReceive(environments.commandClient.$groups) { _ in - updateButtonVisibility() - #if os(iOS) - if useLegacyTabView, coordinator.selection == .groups, !buttonState.showGroupsButton { - coordinator.selection = .overview - } - #endif + Task { @MainActor in + updateButtonVisibility() + #if os(iOS) + if useLegacyTabView, coordinator.selection == .groups, !buttonState.showGroupsButton { + coordinator.selection = .overview + } + #endif + } }.onReceive(profile.$status) { _ in - updateButtonVisibility() - #if os(iOS) - if useLegacyTabView, coordinator.selection == .groups, !buttonState.showGroupsButton { - coordinator.selection = .overview - } - #endif + Task { @MainActor in + updateButtonVisibility() + #if os(iOS) + if useLegacyTabView, coordinator.selection == .groups, !buttonState.showGroupsButton { + coordinator.selection = .overview + } + #endif + } }.onAppear { updateButtonVisibility() } diff --git a/MacLibrary/MainView.swift b/MacLibrary/MainView.swift index 83abfd8..ef9be57 100644 --- a/MacLibrary/MainView.swift +++ b/MacLibrary/MainView.swift @@ -77,13 +77,15 @@ public struct MainView: View { } .onReceive(NotificationCenter.default.publisher(for: .navigateToSettingsPage)) { notification in guard let page = notification.object as? SettingsPage else { return } - pendingSettingsPage = page - if viewModel.selection == .settings { - settingsNavigationPath = NavigationPath() - settingsNavigationPath.append(page) - pendingSettingsPage = nil - } else { - viewModel.selection = .settings + Task { @MainActor in + pendingSettingsPage = page + if viewModel.selection == .settings { + settingsNavigationPath = NavigationPath() + settingsNavigationPath.append(page) + pendingSettingsPage = nil + } else { + viewModel.selection = .settings + } } } .environment(\.selection, $viewModel.selection) diff --git a/SFI/MainView.swift b/SFI/MainView.swift index 6be5d4c..884493a 100644 --- a/SFI/MainView.swift +++ b/SFI/MainView.swift @@ -92,22 +92,22 @@ struct MainView: View { updateButtonVisibility() } .onReceive(environments.commandClient.$groups) { _ in - updateButtonVisibility() + Task { @MainActor in updateButtonVisibility() } } .onReceive(environments.commandClient.$connections) { _ in - updateButtonVisibility() + Task { @MainActor in updateButtonVisibility() } } .onReceive(environments.commandClient.$hasAnyConnection) { _ in - updateButtonVisibility() + Task { @MainActor in updateButtonVisibility() } } .onReceive(NotificationCenter.default.publisher(for: .NEVPNStatusDidChange)) { _ in - updateButtonVisibility() + Task { @MainActor in updateButtonVisibility() } } .onReceive(environments.$extensionProfile) { _ in - updateButtonVisibility() + Task { @MainActor in updateButtonVisibility() } } .onReceive(environments.$emptyProfiles) { _ in - updateButtonVisibility() + Task { @MainActor in updateButtonVisibility() } } .sheet(isPresented: $showGroups) { GroupsSheetContent()