Basado en esta respuesta: ¿Cuál es la diferencia entre ObservedObject y StateObject en SwiftUI?
Y el código de documentación de Apple aquí: https://developer.apple.com/documentation/swiftui/managing-model-data-in-your-app
En la aplicación SwiftUI, se debe usar un envoltorio de propiedad @StateObject cuando una View crea una instancia del objeto en sí, para que el objeto no se vuelva a crear durante una actualización de la vista.
Si se crea una instancia del objeto en otro lugar, se debe usar un envoltorio @ObservedObject en su lugar.
Sin embargo, hay una línea muy fina que lo hace un poco confuso: ¿qué sucede si el objeto se instancia en otro lugar, pero se "inyecta" en la View y luego la vista es el único propietario/titular de ese objeto? ¿Debería ser @StateObject o @ObservedObject ?
Ejemplo de código para ilustrar el punto:
import SwiftUI import Combine import Foundation struct ViewFactory { func makeView() -> some View { let viewModel = ViewModel() return NameView(viewModel) } } final class ViewModel: ObservableObject { @Published var name = "" init() {} } struct NameView: View { // Should this be an `@ObservedObject` or `@StateObject`? @ObservedObject var viewModel: ViewModel init(_ viewModel: ViewModel) { self.viewModel = viewModel } var body: some View { Text(viewModel.name) } }Basado en este artículo: https://www.hackingwithswift.com/quick-start/swiftui/whats-the-difference- between -observedobject-state-and-environmentobject
Hay una diferencia importante entre @StateObject y @ObservedObject, que es la propiedad: qué vista creó el objeto y qué vista solo lo observa.
La regla es esta: cualquier vista que sea la primera en crear su objeto debe usar @StateObject, para decirle a SwiftUI que es el propietario de los datos y es responsable de mantenerlos vivos. Todas las demás vistas deben usar @ObservedObject, para decirle a SwiftUI que quieren ver los cambios en el objeto, pero que no lo poseen directamente.
parece que si View crea una instancia de ViewModel , debe declararse con @StateObject . Mi código es muy similar, la única diferencia es que ViewModel se crea en otro lugar, pero View lo "posee" después de la inicialización.