访问StateObject的对象,而不将其安装在视图上,这将每次创建一个新示例- SwiftUI

rjee0c15  于 2022-12-17  发布在  Swift
关注(0)|答案(2)|浏览(188)

我必须做一些初始设置每次应用程序启动,但我得到的错误:

错误很明显,答案是否定的。我试着把init放在一个子视图中,但我做不到,它需要放在根@main中。这是我如何定义它的:

@StateObject private var amplifyConfig: AmplifyConfig = AmplifyConfig()

init() {
    if(amplifyConfig.isAmplifyConfigured == false) {
        amplifyConfig.dataStoreHubEventSubscriber()
        amplifyConfig.configureAmplify()
    }
}

我如何消除这个警告,并实际实现它,使它不会创建多个示例,在一天结束时,这就是为什么我使用@环境对象?

izkcnapc

izkcnapc1#

在初始化之前,您无法访问任何值,请使用onAppear()

import SwiftUI

@main
struct YourApp: App {
    
    @StateObject private var amplifyConfig: AmplifyConfig = AmplifyConfig()
    
    var body: some Scene {
        
        WindowGroup {
            ContentView()
                .onAppear() {
                    if (!amplifyConfig.isAmplifyConfigured) {
                        amplifyConfig.dataStoreHubEventSubscriber()
                        amplifyConfig.configureAmplify()
                    }
                }
        }
    }
}

更新:实际用例

import SwiftUI

@main
struct YourApp: App {
    
    @StateObject private var amplifyConfig: AmplifyConfig = AmplifyConfig()
    
    @State private var isLoaded: Bool = Bool()
    
    var body: some Scene {
        
        WindowGroup {
            
            VStack {
                if (isLoaded) { ContentView() }
                else { Text("Loading . . .") }
            }
            .onAppear() {
                if (!amplifyConfig.isAmplifyConfigured) {
                    amplifyConfig.dataStoreHubEventSubscriber()
                    amplifyConfig.configureAmplify()
                    completionHandler { value in isLoaded = value }   
                }
                else {
                    isLoaded = true  
                }
            }
        }   
    }
}

func completionHandler(value: @escaping (Bool) -> Void) {
    
    // Some heavy work here, I am using DispatchQueue.main.asyncAfter for replicating that heavy work is happening! But you use your own code here.
    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + DispatchTimeInterval.milliseconds(3000)) { value(true) }

}
mfpqipee

mfpqipee2#

我遇到了这个线程,接受的答案不适用于我的用例,虽然它是正确的。我修复了它使用以下解决方案。
你也可以自己在init中初始化AmplifyConfig,然后把它赋值给@StateObject var ...,如下所示:

@StateObject private var amplifyConfig: AmplifyConfig

init() {
    let amplifyConfig = AmplifyConfig()
    self._amplifyConfig = StateObject(wrappedValue: amplifyConfig)

    if !amplifyConfig.isAmplifyConfigured {
        amplifyConfig.dataStoreHubEventSubscriber()
        amplifyConfig.configureAmplify()
    }
}

相关问题