MVVM vs. MVI - Understand the Difference Once and for All

  Рет қаралды 50,897

Philipp Lackner

Philipp Lackner

Күн бұрын

Пікірлер
@DanielLuche
@DanielLuche 7 ай бұрын
Since 2022 I'm using MVI and I'm really enjoying this. Excellent video and explanation, everytime I see your videos the subject became clear for me. Thanks
@george_sigalas
@george_sigalas 7 ай бұрын
I've used MVP, MVVM, and MVI professionally over the past 3 years. I personally tend towards using a mixture of MVVM and MVI. And there are a couple of reasons. - The MVVM pattern is just too good on a practical level. You don't have to worry about configuration changes, coroutine scopes, etc. It just works. - The MVI pattern is very good to reason about and Kotlin superpowers it. All in all the MVVM pattern solves many technical challenges of previous architectures, such as configuration changes, data access and DI. ViewModels in many cases are an extension of the actual View. Now, combine that with the simplicity of MVI and we have an amazing architecture pattern that is very easy to reason about.
@rarmijob
@rarmijob 7 ай бұрын
All this time using MVI thinking it was MVVM hahaha, thanks for the video!!!
@johnaqualls389
@johnaqualls389 7 ай бұрын
Same 😄
@redditPepe
@redditPepe 4 ай бұрын
me too xD
@afaqrabbia
@afaqrabbia 4 ай бұрын
Same 🙈
@leonelp9593
@leonelp9593 2 ай бұрын
LMAO same over here
@renvzla
@renvzla 2 ай бұрын
man I was so scared when I noticed the same thing happened to me
@jam4l
@jam4l 7 ай бұрын
I have just found out that I have used MVI in my latest project (relatively a small project) with out me knowing anything about MVI 💀 this actually make me think that MAYBE the right architecture will naturally enforce it self into your project, without you thinking about it that match...
@pelealexandru
@pelealexandru 7 ай бұрын
you are not alone! i've also just realised i've implemented MVI to the bone! (thinking i'm doing plain MVVM)
@weaponx3373
@weaponx3373 7 ай бұрын
exactly, I didn't know this too. I just thought it is a different way of writing viewModel class. but know knowing the term it get clearer to me.
@10wyk-f2y
@10wyk-f2y 7 ай бұрын
the same)))
@PedroBarbosaRoman
@PedroBarbosaRoman 7 ай бұрын
I don't think that the difference lies in using using a ui state object instead of multiple states for each field, since we can have the same MVVM implementation but with an ui object instead of multiple mutable states for each fields. I think the difference is more on the "intent" part, which makes state management more manageable and predictable. For instance, when I was using Redux, a state management library for React, the intents would enable us to have an "history" of all the past uiStates and the actions that produces them, for debugging purposes or others, and that is really not possible in MVVM unless we track the changes in other ways. In MVI the foundation for that to be possible is already baked in by using the actions. By the way, in Redux we also had the concept of reducers, but I'm not sure if that is exclusive to MVI.
@blaupunkt1221
@blaupunkt1221 7 ай бұрын
Personally, I think its totally fine to use a mixture of both.
@tiltedbybox6118
@tiltedbybox6118 7 ай бұрын
Yeah for example if some of the MVVM states are dependent on one another, you can just group them in a MVI fashion. Maybe it has disadvantages, but it works and still keeps things relatively clean.
@Mike-er2ih
@Mike-er2ih 7 ай бұрын
Exactly what I'm doing. Works very good.
@jakosss
@jakosss 7 ай бұрын
Orbit mvi is the hybrid approach. Very simple and nice pattern
@cloakrabbit767
@cloakrabbit767 7 ай бұрын
Mvi is just more boilerplate
@philblandford5560
@philblandford5560 7 ай бұрын
I've always thought there are two aspects to MVI that don't necessarily need to belong together - a single state object, and a message queue with sealed classes. You can always use one without the other, depending on your requirements. Lots of methods in your VM? Use a message queue MVI style. Only one method? Probably not worth it. Likewise if a screen has lots of components that update frequently and independently of each other, maybe a single state object isn't best, but if it's fairly static, it may make more sense to use a single data class. I just mix and match MVVM and MVI according to what I need.
@JocelinoFernandes-l4j
@JocelinoFernandes-l4j 7 ай бұрын
I make a mixture of both, all my state are wrapped in data class and my methods remains in viewmodel, my ui receives a data class as state and callbacks from viewmodel, that's make more sense for me, to use the better of both worlds.
@MrStopMotionKid
@MrStopMotionKid 6 ай бұрын
This appears to be the approach that the Google Android Basics with Compose course teaches while calling it MVVM. It's what I generally use too but only because I was taught it that way
@h8pathak
@h8pathak 3 ай бұрын
This is still MVVM, as described by Google in their docs.
@zidan6900
@zidan6900 2 ай бұрын
so one thing that makes MVI different than MVVM is in the sealed interface part for the action (not using ViewModel callbacks on the UI)?
@ibrahimaydn2030
@ibrahimaydn2030 7 ай бұрын
As an android developer, I watch every video with eagerness. 🤩
@henrik908
@henrik908 7 ай бұрын
Heyyy how are you ?
@ibrahimaydn2030
@ibrahimaydn2030 7 ай бұрын
@@henrik908 good , know ı you ? 😄
@henrik908
@henrik908 7 ай бұрын
@@ibrahimaydn2030 Nahh you a stranger to me just asked it I mean their is allot going.
@zappy__idk-vw8eg
@zappy__idk-vw8eg 7 ай бұрын
For most React Devs learning Android + Jetpack Compose, go with MVI as it's very similar to Redux
@dusilva3796
@dusilva3796 7 ай бұрын
I aways used MVVM, however looking at MVI it seems very nice.
@kgandkg
@kgandkg 2 ай бұрын
excellent and simple comparison (as usual). one nuance i might add for MVI is that it makes testing more intuitive. the ability to drive the view model in tests with a single place for inputs and single place for outputs can make it easier for testing.
@gekylafas
@gekylafas 7 ай бұрын
Having a single onAction() which handles all user events seems a bit unnatural for me. It also tends towards large viewmodels. On the other hand, having a single state class is nice.
@DjuroRadusinovic
@DjuroRadusinovic 7 ай бұрын
Personally, I use MVI. I see issues with MVVM when complexity increases. For now I combine MVI with having Events (intent), Actions, Reducers, UiState and SideEffects. Because of this, my viewmodels are very simple, even the most complex ones don't reach more than 200 lines. Also, the whole codebase is very testable. It respects single responsibility and after getting used to it, making changes becomes very simple. It is maybe important to say that now, the most difficult part is to define Events, Actions and the UiState properly. They are all sealed classes and I think this is the best way to represent business logic
@weaponx3373
@weaponx3373 7 ай бұрын
I didn't know the difference in between mvvm and mvi . mvi is much more readable. knowing the difference will help me learning mvi faster. thanks for the video
@arielapp9469
@arielapp9469 7 ай бұрын
do you guys remember when the common architecture was MVC? how about relax about what is the best architecture, and do what you're most comfortable with?
@funkypopper
@funkypopper 27 күн бұрын
Clear and easy to undersand both MVVM and MVI. Thanks, Philipp!
@MrCalyho
@MrCalyho Ай бұрын
The problem with that MviAction enum is not the size but that as your code grows it opens the door to that same 'when' statement being duplicated everywhere. This over time becomes a maintanence nightmare. You already started duplicating once in this example. As for the callback hell that can happen with the MVVM you can slap those callbacks on an interface and maybe even put the MvvmScreen as an extension function on that interface - a 'scope' if you may. The callback functions are then easily available in the scope of the screen and easy to find.
@sparshchadha5469
@sparshchadha5469 7 ай бұрын
Hey, please create a video on different flavours of app that companies usually create and how we can write functions in gradle files
@gleb-dev
@gleb-dev 7 ай бұрын
Probably, another advantage of MVI is a more loose dependency between the view and the ViewModel. The view just sends events to the ViewModel and the ViewModel itself decides what to do with it. Whereas in MVVM the view holds direct references to callbacks, and any change in the methods can potentially break the build. In modern IDEs it's not a problem, but for Kotlin Multiplatform linting doesn't work
@ngapps
@ngapps 7 ай бұрын
This shortcut with KFunction instead of multiple lambdas is smths crazy beatuful! This is what I was missing in my MVI implementation
@nikwintren
@nikwintren 7 ай бұрын
You can check out my reply regarding another solution. I'm not selling something, I just want some genuine input :P
@berkc5323
@berkc5323 3 ай бұрын
I am using a mixture of both where the UI state is a single data class and the callbacks trigger viewmodel functions directly. That way im getting rid of the extra sealed interface that holds the events, also keeping my composable's constructor simpler (compared to the MVVM version showed in the video) because i have a single UI state data class.
@alsh2887
@alsh2887 Ай бұрын
It was really good explanation of the differences of both approaches. So I've got to know that I was using MVVM and I was using it wrong :) For now in my new projects I'm using MVI. And I must say from that video I also understand my mistakes. For me MVI looks better improving code readability.
@laujimmy9282
@laujimmy9282 7 ай бұрын
Thanks for your content, finally I get to fully understand the difference between MVVM and MVI. It seems mixing them is the best way to go, as long as it makes the code clean and readable.
@coldwised
@coldwised 7 ай бұрын
If you have a large viewmodels and problems with navigation, you should try the Decompose library
@LightDante
@LightDante 6 күн бұрын
MVI is like the ideal version MVVM, but in reality it's more easy to apply and maintain MVVM
@finchicoph
@finchicoph 6 ай бұрын
I am using both, I expose a single state, but I don't use the intent layer. 😁 I think MVI is really good, especially if combined with Rx. The elegance 👌.
@josephofem5448
@josephofem5448 7 ай бұрын
I mostly use MVI but of late, I sort of use a mix of both as I find it more convenient.
@baijusharma6027
@baijusharma6027 7 ай бұрын
Any plans to start a series on AOSP, as there are lots of things to cover and online no tutorial available.
@ayeshdon
@ayeshdon 7 ай бұрын
@philipp shall we have playlist on android AR and Android automotive.
@Alchemist10241
@Alchemist10241 7 ай бұрын
11:14 for navigation events I used to create another UI event class but with this approach I don't need to.
@szpitor
@szpitor 7 ай бұрын
I think as most says in here use mvvm with mvi I would prefer. End of the day make the code read able that is the most important goal.
@Guilo583
@Guilo583 7 ай бұрын
i am a little bit confused. Some you use the event class in your mvvm project is that not similar to mvi?
@warTag68
@warTag68 Ай бұрын
would be interesting to see how would a mixture between both look like. also instead of intercepting ui events you can use effect pattern
@amirrezalotfi8919
@amirrezalotfi8919 Ай бұрын
very wonderful tutorial!! i have question about holding state in MVI. I want to have value of EditText in state in viewModel. so every time text changed, state must be updated and then ui updated. Problem occur when updating state was heavy (such loading image and …). what should we do in this scenario?
@nikwintren
@nikwintren 7 ай бұрын
I am, apparently, using MVI / MVVM - neither, both, hybrid... and by the sound of what you're saying it bridges both MVVM and MVI eliminating the all/most bad parts. - I have an object "FeatureModels" that houses my supporting actors; `data class State()` | `sealed interface Event{}` | `interface Actions {}` - My ViewModel extends StateEventViewModel (or a subset for smaller screens State / Event) which exposes a single state (StateFlow) , a single "event buss" through a Channel and it also implements the Actions interface. - My Composable ScreenWrapper ("Route") holds a composable ("Screen") which takes always only two arguments: State and Actions. Route have access to the navController, NavBackStackEntry as parameters. It gets the ViewModel from hilt, collects State from ViewModel and holds the screen: FeatureScreen(state = state, actions = viewModel). Then the Route does `viewModel.collectEvents { event -> when (event) { ... } }` which mostly just handles navigation or platform interactions. - Also 1: The ViewModel have some nice `update { state -> state.copy(x ) ...) }` and `sendEvent(Event.GoToDetails("itemID"))` utility functions - Also 2: I have some extension functions that handles observing state and events using lifecycle etc. for the Route - Also 3: In the Feature Models object I have another object that holds nice to have preview states and actions: Preview {val emptyState: State get() = ..., val actions get() = ... } To me this is flawless, and I love it, but what is it? MVVM or MVI?
@georgikopchev1739
@georgikopchev1739 7 ай бұрын
Based on the video, should be MVI
@mateusznepath3344
@mateusznepath3344 7 ай бұрын
16:07 oh wow didn't know about the snapshotFlow. But wouldn't it trigger extra recomposition?
@yossimaskin1393
@yossimaskin1393 7 ай бұрын
Is there a reason why you used mutableStateOf and not MutableStateFlow? I remember you had a video in which you preffered the StateFlow approach. Is that changed over the time? I'm just curious
@clementjoymasinamela4244
@clementjoymasinamela4244 7 ай бұрын
It depends, if you wanna map, filter etc then use MutableStateFlow but if not you can use mutableStateOf
@bogdan.801
@bogdan.801 7 ай бұрын
And what if I use the single screen state like in MVI but all the actions of the screen are done with a separate method like in MVVM? Is it wrong?
@Ayor88
@Ayor88 7 ай бұрын
I'm a bit confused about navcontroller and navigation, since in your example you pass it to the composable and in the official documentaiton, it's recommanded to not pass it and just expose navigation action. That would be nice to have more info on this topic (I know you have many videos about navigation in compose, but I encountered many case uncovered by these)
@Atlantican16
@Atlantican16 25 күн бұрын
To declare onAction intents, why to use sealed class, and not enum class instead? However we don't need the intents to have a class body. They are just data types. Is there some benefits to use sealed classes for intents?
@skarloti
@skarloti 7 ай бұрын
When we use KMP, we have a solution with expect (Common) and actual MVVM deployments on different platforms. So MVI becomes redundant.
@PhilippLackner
@PhilippLackner 7 ай бұрын
Why does it become redundant? Usually, you'd want to share the ViewModel and maybe even the UI
@زيد_اليماني
@زيد_اليماني 7 ай бұрын
Great video, I really like mvi pattern a lot it makes the code less complex and more readable
@forbiddenbox
@forbiddenbox 7 ай бұрын
could you make another app tutorial? your plalist is very outdated and I find it hard to learn so this is the best channel
@PartyPooperXX
@PartyPooperXX 5 ай бұрын
I had an interview, and they disagreed with your approach. They told me that MVI always needs to have a Redux implementation to change the state and handle the actions. What responses would be good in that case? I told them that we still use the Action as the intent to change the UI state, but they told me in the feedback that I didn't understand MVI architecture.
@warTag68
@warTag68 Ай бұрын
sounds like a toxic company to work for and you sir dodged a bullet
@jackeblan
@jackeblan 7 ай бұрын
It seems that I will move to MVI since it might fix the problem of my composables having alot of callbacks to viewmodel. A problem raised by state hoisting. Having alot of parameters to a function defies clean code.
@denissolomasov
@denissolomasov 27 күн бұрын
What is the difference between private set and backing field in the example at 16.30? It seems to me they are the same
@est4058
@est4058 7 ай бұрын
In last 5 years, iOS, Flutter and now Android - all MVI. Just found it more predictable in development, maintenance and testing. Also should to note that SwiftUI, Flutter and Compose - all perfectly fit to MVI
@-sb9nb
@-sb9nb 7 ай бұрын
In MVI , do we need to create some state or sharedFlow for oneTime events like toasts or snackBar . And how to handle error- in the main UiState or maybe create another state for error ?
@josephmalachosky7141
@josephmalachosky7141 7 ай бұрын
Would using state.copy() to update values of the UI state data class from the ViewModel indicate I'm mixing practices of MVVM and MVI? I'm invoking my VM from my View directly, but I am holding reference to a single UI state data class as MutableStateFlow(MyUiState())
@cloakrabbit767
@cloakrabbit767 7 ай бұрын
I don't see the benefit of MVI. Would someone explain? To me it seems it's just more boilerplate code
@SamyakKumar-ck8se
@SamyakKumar-ck8se 7 ай бұрын
of course mvvm, because d LEGEND Philip uses it most of the time
@ztzmtv7069
@ztzmtv7069 7 ай бұрын
I use MVI in complex screens but when the screen is simple, MVVM is better in my opinion
@TheShadowvaultAwaits
@TheShadowvaultAwaits 7 ай бұрын
Most mvi tutorials I've seen except yours, have a store and a reducer. Can you elaborate on that?
@PhilippLackner
@PhilippLackner 7 ай бұрын
Store = the combination of state class and VM Reducer = onAction function
@aditya3n
@aditya3n 7 ай бұрын
@@PhilippLackner possible to share your source code of this MVVM and MVI? I'm trying to implement MVI on my KMP project..
@yewo.m
@yewo.m 7 ай бұрын
MVI reminds me of Elm and Redux/useReducer in React (I'm a web dev learning mobile, BTW)
@ayeshdon
@ayeshdon 7 ай бұрын
Thanks @philipp Since this both very similar we can you both in single project. thats my option here.
@sabbib007madness
@sabbib007madness 7 ай бұрын
so what is the pattern which has a state class with "Callbacks", is that MVIVM? I'm starting to miss the vanilla days of android where android team told everyone to figure out their own architecture. seem like we've gone away from the original definition of MVVM which was data changes are a stream of data emitted by VM and were starting to label everything like a religion 😮‍💨
@veluchamykarthik107
@veluchamykarthik107 7 ай бұрын
Could you make video about clean architecture
@emanuelemaso3061
@emanuelemaso3061 7 ай бұрын
The best comparison found out there! Cheers 👏
@sebastianluna4190
@sebastianluna4190 6 ай бұрын
So MVI is more like redux then 🤔
@grumpyshoe
@grumpyshoe 7 ай бұрын
A really nice explanation! Thanks for your effort Philipp! 👍
@vitalijuskolinko9011
@vitalijuskolinko9011 7 ай бұрын
I've tried MVi and I liked it :) Will use it as default for the next projects )
@lifebylazy
@lifebylazy 7 ай бұрын
You're the man phillip thank you!
@DeveloperDikshitaPatel
@DeveloperDikshitaPatel 6 ай бұрын
How to get details of the workshop? As i am late to book me slot
@devatrii
@devatrii 7 ай бұрын
lol i didn't even knew that i was using MVI
@SoftSkilsDevs
@SoftSkilsDevs 7 ай бұрын
😂😂😂 you're not alone
@alfetch1337
@alfetch1337 6 ай бұрын
MVI! :) For a long time now. More simple and readable code.
@vegadhardik
@vegadhardik 7 ай бұрын
Very informative video and great explanation, I love each of your videos. Thanks for sharing.
@Coldalecs
@Coldalecs 7 ай бұрын
Love it! keep up the good work! Very informative.
@walrider7374
@walrider7374 7 ай бұрын
MVI reminds me on Flutter BLOC pattern
@selebdroid6423
@selebdroid6423 5 ай бұрын
Good explanation, thanks a lot! Bump words
@dev-sr1rq
@dev-sr1rq 5 ай бұрын
If you don't use MVI, maintenance is almost impossible in a big project.
@robchr
@robchr 7 ай бұрын
In my experience, MVVM is more flexible for having multiple concurrently running asynchronous operations that update the UiState. MVI only allows for a single asynchronous operation at a time which can be easier write tests for.
@walrider7374
@walrider7374 7 ай бұрын
I think I understand what you mean (I'm a Junior), can you help me? What you are saying is that (as for an example) if my UI has 2 buttons that ultimately make a HTTP call that can potentially take 1 or 2 seconds, and both are pressed simultaniously something may go wrong? Like if I press button A and ActionA is dispatched and before it finishes I press ActionB it will somehow cancel ActionA?
@Rajmanov
@Rajmanov 7 ай бұрын
​@@walrider7374 no, you can queue it or handle it separately through middleware or a similar mechanism to ensure both actions are addressed.
@k4ba
@k4ba 7 ай бұрын
@@Rajmanov Then @robchr point is invalidad? Or this queueing and middleware thing just makes it less efficient than just using MVVM? To my understanding, it's safe to combine both MVVM and MVI dependending on the requirements of each specific UI/Screen
@ManuelSilverioCoder
@ManuelSilverioCoder 7 ай бұрын
As usual you managed to explained this better than anyone out there. Great video!!! I always use MVVM so it is the one that makes sense to me, but I can see the value in knowing both specially when you need to work with an existing app that someone else developed using MVI.
@PhilippLackner
@PhilippLackner 7 ай бұрын
Thank you 🙌🙌
@leonardocvaleriano
@leonardocvaleriano 7 ай бұрын
Whata job!! Thank you for sharing your knowledge!
@graart6076
@graart6076 7 ай бұрын
i like to use MVVM but with states-classes🙂
@processorman2858
@processorman2858 7 ай бұрын
Sir I am unable to access the internet on my android emulator
@androidkotlin-6234
@androidkotlin-6234 7 ай бұрын
MVI is really better then MVVM, because I have only one source of truth for my UI - data class UiState()
@alexmercerind
@alexmercerind 7 ай бұрын
Can we say MVI is built on top of MVVM? No?
@pelealexandru
@pelealexandru 7 ай бұрын
your videos are the best.
@leonelp9593
@leonelp9593 2 ай бұрын
I mean...they are Extremly Similar 🤔 i thought there was other things i didnt know about it have been using MVI in some projects and never Realized about it😂
@Sharon6Lee-u1j
@Sharon6Lee-u1j 2 ай бұрын
Weldon Burgs
@tuanphanvan5169
@tuanphanvan5169 7 ай бұрын
Thank for your video 👍
@DiabloZq
@DiabloZq 7 ай бұрын
Thank you!
@ishubhamsingh
@ishubhamsingh 7 ай бұрын
So it seems i have been using MVI without knowing its MVI since quite a while 😂
@tashi7160
@tashi7160 7 ай бұрын
sometime I feel like we android developers are stuck in M** patterns world.
@abr464
@abr464 7 ай бұрын
Same here, using MVI thinking it was MVVM lol
@KimikoTomaino
@KimikoTomaino 2 ай бұрын
625 Foster Throughway
@EdwardHarris-n9l
@EdwardHarris-n9l Ай бұрын
Rashawn Avenue
@FreddieSlipper-o5s
@FreddieSlipper-o5s 2 ай бұрын
Katrina Fork
@David-zb8br
@David-zb8br 7 ай бұрын
so i been using mvi this whole time thinking it was mvvm 😅
@justmeagain9302
@justmeagain9302 3 ай бұрын
Shet MVI looks tasty
@ElizabethWilliams-q8u
@ElizabethWilliams-q8u 2 ай бұрын
Nader Knolls
@ElsieBernice-v2q
@ElsieBernice-v2q 2 ай бұрын
Huel Causeway
@HoraceCharlotte-q9k
@HoraceCharlotte-q9k 2 ай бұрын
Kuhic Cliff
@AbdulBarek-p3q
@AbdulBarek-p3q 2 ай бұрын
Lopez Michelle Clark Brenda Martinez Ruth
@FreemanArno
@FreemanArno 2 ай бұрын
Wilson David Jones Jose Lopez Timothy
@MaryThomas-f3d
@MaryThomas-f3d Ай бұрын
Keeling River
@BarbaraGarcia-v8d
@BarbaraGarcia-v8d Ай бұрын
Walter Mountain
@RuthDillard-b4b
@RuthDillard-b4b Ай бұрын
Kuhic Mission
@BerthaYork-h1c
@BerthaYork-h1c 2 ай бұрын
Kihn Summit
@DobbinZachary-m3r
@DobbinZachary-m3r 2 ай бұрын
Thompson Christopher Miller Michelle Johnson Anna
5 Kotlin Coroutine Secrets I Wish I Knew Earlier
24:23
Philipp Lackner
Рет қаралды 22 М.
Real Man relocate to Remote Controlled Car 👨🏻➡️🚙🕹️ #builderc
00:24
What type of pedestrian are you?😄 #tiktok #elsarca
00:28
Elsa Arca
Рет қаралды 33 МЛН
Артём Шендрик - Modern MVI и MVVM+ со всех сторон в 2023
49:11
Mobius — конференция по мобильной разработке
Рет қаралды 5 М.
MVI в Android на практике
19:20
Тимофей Коваленко
Рет қаралды 16 М.
ViewModels & Configuration Changes - Android Basics 2023
18:46
Philipp Lackner
Рет қаралды 132 М.
Performance Optimization with @Stable and @Immutable in Jetpack Compose
16:47
This Is My FAVORITE Error Handling Class
28:57
Philipp Lackner
Рет қаралды 34 М.
Everything You NEED to Know About Client Architecture Patterns
5:51
Real Man relocate to Remote Controlled Car 👨🏻➡️🚙🕹️ #builderc
00:24