【发布时间】:2020-10-12 19:29:48
【问题描述】:
我有一个@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() 设置为活动状态。
如果用户通过小部件打开应用程序,我通过在onOpenURL 中设置showDetailView = true 来设置ImageDetailView() 处于活动状态。
到目前为止一切都很好。
问题可能是我有同一个 environmentObject 的 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 用作单个实例?
【问题讨论】: