nalexn / clean-architecture-swiftui

SwiftUI sample app using Clean Architecture. Examples of working with CoreData persistence, networking, dependency injection, unit testing, and more.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

ViewModels reinitialize after view changes

guillevc opened this issue · comments

First of all, thanks for all the work put onto this project. I'm building a project based off of this and it's looking really good, but I am encountering some issues that I explain below.

To summarize:

ViewA navigates to ViewB. To achieve this, I implement a NavigationLink(destination: ViewB(viewModel: ViewBViewModel())). When inside ViewB, some app state is modified, which ViewA receives with a onReceive. In the onReceive callback, ViewA makes some changes to its view like disabling a button. This causes ViewA to recalculate itself, which initializes ViewBViewModel again, losing all the changes, including all loaded data from the repository, leaving the user on ViewB with all Loadable set to .notRequested, and all viewModel state lost.

This also happens if the app state is implemented through a EnvironmentObject. If I modify some environment object from ViewB that ViewA uses, ViewA recreates itself, losing all the state on ViewBViewModel.

I am also having some issues related to this when navigating back from a view to its predecessor. In some cases, if I navigate from some view ViewA to other view ViewB, when dismissing ViewB, ViewA gets recalculated, which initializes ViewBViewModel again.

Has anyone encountered this behaviour and came to a solution?

Using @StateObject instead of @ObservedObject for view-owned view models seems to stop views from recreating view models on every view refresh, even if some parent view is changing.

So it could be a potential improvement, at least it's keeping things in place for me.