Show Dialog from ViewModel in Android MVVM Architecture

30,729

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

Share:
30,729
lucasb.aquino
Author by

lucasb.aquino

Updated on December 18, 2021

Comments

  • lucasb.aquino
    lucasb.aquino over 2 years

    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?

  • lucasb.aquino
    lucasb.aquino almost 7 years
    What I'm doing is creating a LiveData <Boolean> for every action I need to be triggered in my View to call a new screen or display dialog, but I'm not satisfied with that solution, it does not seem right in my eyes.
  • Jose Alcérreca
    Jose Alcérreca almost 7 years
    We're working on a sample for exactly this. I called it LiveEvent and it uses a LiveData<Boolean> to check if it's been called already. Stay tuned.
  • Alex Radzishevsky
    Alex Radzishevsky almost 7 years
    I'm interested in LiveEvent sample. Where/when it is going to be published?
  • Jose Alcérreca
    Jose Alcérreca almost 7 years
  • superjugy
    superjugy almost 5 years
    How would one go about a confirmation dialog where the viewmodel needs to know the answer to the dialog? the viewmodel triggers the singleevent or the event wrapper, but then, how do you know what the user chose?
  • hushed_voice
    hushed_voice over 4 years
    Hey, JoseAlcérreca can you give some insight into @superjugy 's question?? Ideally, how should the dialog box result be communicated to the ViewModel? Let's say, its a confirmation box for creating an account & I need to make an API call when the user clicks proceed in the alert dialog. How will I let my VM know t user confirmed?
  • superjugy
    superjugy over 4 years
    I ended up using the following approach. It solved the 2 way communication issue. Basically you need a callback registered with your notification. blog.tonysneed.com/2011/01/28/…
  • Atamyrat Babayev
    Atamyrat Babayev almost 3 years
    Hi Vlad, your first link is broken!)