About MVVM with new architecture components, I've a question, how should I implement if my app needs to display for example a Dialog with 3 options from some action that happened in my VM? Who is responsible for sending to Activity/Fragment the command to show dialog?
UI-related actions like opening new activities or showing dialogs are triggered from the view (an activity or fragment), not from a ViewModel. The ViewModel doesn't have a reference to the view to prevent leaks and keep the presentation layer "reactive".
You can subscribe your view (activity or fragment) to an observable in the ViewModel so that when it changes, you can start your dialog or new activity from the view. Then the view resets that state in the ViewModel when it's dealt with.
Edit: We wrote official guidance for this: https://developer.android.com/topic/architecture/ui-layer/events
LiveEvent
and it uses a LiveData<Boolean>
to check if it's been called already. Stay tuned. –
Binetta In Android, most commonly the communication from the ViewModel to the view (Activity/Fragment) is through observing LiveData value. In ViewModel set MutableLiveData value and expose it to the view as LiveData to observe. This is handy when reacting to some state change. Set state persists and is relevant until the next change. It's handy for instance with configuration changes, our view state is preserved in the ViewModel.
But sometimes this is not desirable - with "brief" or "stateless" actions - which only briefly change the state of the UI and are relevant only at the time when action happened - such as action to show a message (be it a toast or a snackbar) - we don't want to re-show an error message 10 min later just because screen rotation occurred; or a navigation action - we don't want to reopen another screen on top. These can be handled with SingleLiveEvent pattern as described in Jose Alcérreca's answer.
I have created a small library for easy implementation for sending such actions - called "brief actions" - actions, not events, because events are something we react to and actions we send/initiate.
You can check it out here:
https://bintray.com/vlad-markovic/maven/com.vladmarkovic.briefactions#read
It's also open source; please feel free to contribute:
https://github.com/vlad-markovic/AndroidBriefActions
Import in Gradle with:
implementation "com.vladmarkovic.briefactions:briefactions:$briefActionsVersion"
in dialog:
val viewModel =
ViewModelProvider(context as ViewModelStoreOwner)[MyViewModel::class.java]
viewModel.sendUserAnswer()
© 2022 - 2024 — McMap. All rights reserved.