One Off the Slack: ViewModels... Going, Going, Gone?
Brady Aiello asked:
Since Composables will eventually replace Fragments, I was wondering if we’ll be able to scope ViewModels to Composables, or Composable destinations within Compose Navigation? Keeping lots of ViewModels all scoped to a single Activity, or keeping one god-ViewModel would both hold data for every page in memory concurrently, and that seems like a bad idea.
Google’s Ian Lake eventually chimed in with a definitive answer:
Navigation already scopes ViewModels to individual destinations and had since it’s first alpha
Along the way, though, Google’s Adam Powell pointed out a few key ideas. One is that the old activity destroy-and-recreate cycle is perhaps unnecessary:
if you’re using all-compose, there’s no reason to leave activity recreation for configuration changes enabled since compose knows how to handle them at a much finer granularity
Personally, while I think that this is a fine objective, I suspect that it may
not turn out as well as Adam would like. If nothing else, it will require developers
to pay very close attention to new types of configuration changes, as the
android:configChanges
attribute is a change blacklist. Any new type will trigger
a configuration change, unless developers add it to android:configChanges
.
This will be easy to miss with the typical glacial pace of Android upgrades.
Perhaps this can be handled via Lint.
Adam goes onto say:
which then means the arch components
ViewModel
superclass doesn’t serve much purpose; any old object youremember {}
persists as normal
we have the
savedInstanceState
APIs in compose already for saving across process restarts, and that doesn’t experience the sameViewModel
scoping questions
In other words, viewmodels may not go away, but ViewModel
might not be the base
class for them. We still are going to want something in that role, for testability
if nothing else. But we might be able to avoid some of the ViewModel
quirks.
Read the original thread in the kotlinlang Slack workspace. Not a member? Join that Slack workspace here!