我有一个@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 = true
将onOpenURL
设置为活动状态。
到目前为止一切都还好。
问题可能是我有同一环境对象的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
用作单个实例?
答案 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启动不同的视图,请参见: