同一EnvironmentObject的多个实例

时间:2020-10-12 19:29:48

标签: swift swiftui

我有一个@EnvironmentObject

@main
struct Image_WidgetApp: App {
    @State var imageNumString = ""
    @State var showDetailView = false  
    @EnvironmentObject var userData: UserData
    var body: some Scene {        
        WindowGroup {
            if(!showDetailView){
                ContentView()
                    .onOpenURL { url in
                        imageNumString = url.absoluteString
                        showDetailView = true
                    }
                    .environmentObject(UserData())   // First instance of the environmentObject
            }
            else{
                ImageDetailView( mySubstring: $imageNumString, doneFunction: {
                    self.showDetailView = false
                })                                    
                .environmentObject(UserData())   // Second instance of the environmentObject
            }
        }
    }
}

如果用户通过应用图标打开应用,则我将ContentView()设置为活动状态。

如果用户通过小部件打开应用,则可以通过在ImageDetailView()中设置showDetailView = trueonOpenURL设置为活动状态。

到目前为止一切都还好。

问题可能是我有同一环境对象的2个不同实例。参见https://github.com/peterfriese/Swift-EnvironmentObject-Demo

因为当我在任何视图中进行任何更改时,另一个视图都不知道它。

为了解决这个问题,我尝试使用NavigationLink,因为这种方法旨在将ImageDetailView()推为子视图,但没有机会。单击小部件不会将ImageDetailView()推入导航堆栈。

@main
struct Image_WidgetApp: App {
    @State var imageNumString = ""
    @State var showDetailView = false  
    @EnvironmentObject var userData: UserData
    var body: some Scene {        
        WindowGroup {
                ContentView()
                    .onOpenURL { url in
                        imageNumString = url.absoluteString
                        showDetailView = true
                        if imageNumString.count > 0{

                            imageNumString = url.absoluteString
            
                            NavigationLink(destination: ImageDetailView(mySubstring: $imageNumString), isActive: $showDetailView) {
                                EmptyView()
                            } .hidden()
                        }
                        .environmentObject(UserData())  
            }
        }
    }     
}

如何将@EnvironmentObject用作单个实例?

1 个答案:

答案 0 :(得分:2)

如何将@EnvironmentObject用作单个实例?

您可以创建一个全局UserData实例,并在必要时进行注入:

@main
struct Image_WidgetApp: App { 
    @StateObject var userData = UserData()

    var body: some Scene {        
        WindowGroup {
                FirstView()
                    .environmentObject(userData)
                SecondView()
                    .environmentObject(userData)
            }
        }
    }     
}

关于从App / Widget启动不同的视图,请参见: