SwiftUI中.sheet()打开后自动消失并返回上一级视图问题
SwiftUI弹窗异常问题:打开Google PlacePicker后弹窗自动关闭并返回上一级视图
异常现象
点击打开Google PlacePicker的.sheet()弹窗后,弹窗立即自动关闭,同时当前「Ice Bath」视图被dismiss,直接返回至「Edit Program」视图。(动图演示流程:弹窗弹出瞬间消失,页面退回到上一级)
核心代码
struct EditNotesView: View { @State var openGooglePlaces = false @StateObject var viewModel: EditNotesVM @Environment (\.dismiss) var dismiss var completion: (NotesData) -> Void init(viewModel: EditNotesVM = EditNotesVM(), note: NotesData, bathType: ShowerPrograms, completion: @escaping (NotesData) -> Void) { self._viewModel = StateObject(wrappedValue: viewModel) viewModel.note = note viewModel.selectedShower = bathType self.completion = completion } var body: some View { ZStack { loadView() } } } extension EditNotesView { func loadView() -> some View { VStack { navigationBarView(action: { self.dismiss() }, title: Config.title) locationView() } Spacer() .onAppear { viewModel.loadProgramData() } .sheet(isPresented: $openGooglePlaces) { PlacePicker(address: $viewModel.address, latitude: $viewModel.latitude, longitude: $viewModel.longitude) .presentationDetents([.medium]) } } }
控制台提示
控制台输出显示:EditView先被销毁,进而导致PickerView被关闭。
测试验证代码(可正常运行)
struct TestView: View { @Environment(\.scenePhase) var scenePhase var body: some View { NavigationStack { NavigationLink("First Screen") { GooglePlaceView() } } } } struct GooglePlaceView: View { @State var openGooglePlaces = false @State private var address = "" @State private var latitude = 0.0 @State private var longitude = 0.0 var body: some View { VStack { Button { openGooglePlaces.toggle() } label: { Text("Open Google Places") } } .sheet(isPresented: $openGooglePlaces) { PlacePicker(address: $address, latitude: $latitude, longitude: $longitude) } } }
已排查内容
已知SwiftUI中@State、@Binding或@Published属性变更会触发视图重建,甚至移除NavigationStack中的顶层视图,但已确认不存在此类变量关联导致该异常。
内容的提问来源于stack exchange,提问作者Qazi Ammar
相关产品推荐
相关产品推荐

