2022-12-12 When to use StateObject wrappedValue initializer

UPDATE 2023-04-28: Apple updated its documentation: https://developer.apple.com/documentation/swiftui/stateobject#Initialize-state-objects-using-external-data

On our team, we recently discussed the use of StateObject in SwiftUI. It's very useful for ViewModels. However you often want to initialize such a ViewModel with one or more parameters and you bump into the following bit of documentation:

"You don't call this initializer directly. Instead, declare a property with the @StateObject attribute in a View, App, or Scene, and provide an initial value"

Source: developer.apple.com

We were not the only ones struggling with this; see also this blog post by Sarun W, where they share a Slack screenshot quoting an Apple engineer saying that this initializer is supported.

Still, using that initializer means that if your view gets recreated, you lose all state since the ViewModel is destroyed and created as well. This is especially harrowing when you do network actions within the ViewModel.

Our conclusion is that StateObject(wrappedValue:) can be used at points in your app where you start a completely new flow. For instance in a popup where you create a screen with a NavigationView or NavigationStack. Otherwise, initialize elsewhere and use @EnvironmentObject.