从fullScreenCover返回时如何触发onAppear?现有代码触发失败
SwiftUI解决fullScreenCover关闭后onAppear不触发的问题
问题根源:绑定在NavigationView上的onAppear仅在视图首次加载时触发,关闭fullScreenCover后NavigationView并未被销毁重建,因此不会再次触发该回调。以下是三种可行的解决方法:
方案1:将onAppear移至NavigationView内部子视图
把onAppear绑定到NavigationView内的VStack上,每次从fullScreenCover返回时,子视图的onAppear会被触发:
struct ProfileView: View { @StateObject var viewModel = ProfileViewViewModel() var body: some View { NavigationView { VStack { if let user = viewModel.user { profile(user: user) } else { Text("Loading Profile...") } } .navigationTitle("Profile") .onAppear { // 移至此处 viewModel.fetchUser() } } .fullScreenCover(isPresented: $viewModel.showingPreview) { PreviewAvatarView() } } }
方案2:利用fullScreenCover的onDismiss回调
直接通过fullScreenCover的onDismiss参数指定关闭时的操作,逻辑更直接明确:
struct ProfileView: View { @StateObject var viewModel = ProfileViewViewModel() var body: some View { NavigationView { VStack { if let user = viewModel.user { profile(user: user) } else { Text("Loading Profile...") } } .navigationTitle("Profile") } .onAppear { viewModel.fetchUser() } .fullScreenCover(isPresented: $viewModel.showingPreview, onDismiss: { viewModel.fetchUser() // 弹窗关闭时调用 }) { PreviewAvatarView() } } }
方案3:监听showingPreview状态变化
通过onChange监听弹窗状态,当状态从true变为false时执行刷新逻辑:
struct ProfileView: View { @StateObject var viewModel = ProfileViewViewModel() var body: some View { NavigationView { VStack { if let user = viewModel.user { profile(user: user) } else { Text("Loading Profile...") } } .navigationTitle("Profile") } .onAppear { viewModel.fetchUser() } .fullScreenCover(isPresented: $viewModel.showingPreview) { PreviewAvatarView() } .onChange(of: viewModel.showingPreview) { newValue in if !newValue { // 弹窗关闭时触发 viewModel.fetchUser() } } } }
推荐优先选择方案2,它直接关联弹窗关闭动作,逻辑清晰且针对性强;方案1适合需要视图每次可见都刷新的场景;方案3则适用于需监听状态变化的复杂场景。
内容的提问来源于stack exchange,提问作者dunoiww
相关产品推荐
相关产品推荐

