Ivan C Myrvold
Ivan C Myrvold

Reputation: 840

Initialize StateObject with another StateObject

I have this App structure, where I need to initialize appearancesStore and behavioursStore with userManager. But I get the error Escaping auto closure captures mutating 'self' parameter and Variable 'self.appearancesStore' captured by a closure before being initialized.

I have tried some different methods of doing this, but it all failed. Do anyone have a suggestion of how to do this?

@main
struct DuneApp: App {
    @StateObject var userManager = UserManager()
    @StateObject var appearancesStore: AppearancesStore
    @StateObject var behavioursStore: BehavioursStore

    init() {
        _appearancesStore = StateObject(wrappedValue: AppearancesStore(manager: self.userManager))
        _behavioursStore = StateObject(wrappedValue: BehavioursStore(manager: self.userManager))
    }

    var body: some Scene {
        WindowGroup {
            AuthenticateView()
                .environmentObject(userManager)
                .environmentObject(appearancesStore)
                .environmentObject(behavioursStore)
        }
    }
}

Upvotes: 5

Views: 1656

Answers (1)

Asperi
Asperi

Reputation: 257493

Try the following

@main
struct DuneApp: App {
    @StateObject var userManager: UserManager
    @StateObject var appearancesStore: AppearancesStore
    @StateObject var behavioursStore: BehavioursStore

    init() {
        let userManager = UserManager()

        _userManager = StateObject(wrappedValue: userManager)
        _appearancesStore = StateObject(wrappedValue: AppearancesStore(manager: userManager))
        _behavioursStore = StateObject(wrappedValue: BehavioursStore(manager: userManager))
    }

    var body: some Scene {
        WindowGroup {
            AuthenticateView()
                .environmentObject(userManager)
                .environmentObject(appearancesStore)
                .environmentObject(behavioursStore)
        }
    }
}

Upvotes: 8

Related Questions