【问题标题】:Multiple Instance of the Same EnvironmentObject同一 EnvironmentObject 的多个实例
【发布时间】: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 用作单个实例?

【问题讨论】:

    标签: swift swiftui


    【解决方案1】:

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

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

    @main
    struct Image_WidgetApp: App { 
        @StateObject var userData = UserData()
    
        var body: some Scene {        
            WindowGroup {
                    FirstView()
                        .environmentObject(userData)
                    SecondView()
                        .environmentObject(userData)
                }
            }
        }     
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-26
      • 2017-06-18
      • 2016-04-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      相关资源
      最近更新 更多