Магія MVI. Або як легко перейти з MVVM і не пошкодувати
MVI (Model-View-Intent) — це архітектурний патерн для розробки програмного забезпечення, який часто використовується в Android-розробці. Зокрема, в розробці на Jetpack Compose.
Як і дорослі партнерські відносини, все починається з контракту. Саме контракт, як і в усіх дорослих партнерських відносинах, визначає перелік наших дій, компетенцій, відповідальності тощо.
Це контракт між нашим UI та ViewModel в якій буде міститись зберігання стану і обробка подій.
Ось і почалась магія, помітили? Як легко ми опрацювали дані які нам прийшли. Два поля і натискання кнопки «Save». А коду написали буквально кілька рядків.
Вся магія обробки ховається у BaseViewModel. Але якщо глянути на неї ближче, то і там нічого складного немає.
Як бачите, я не збрехав — нічого складного.
Нам лиш треба реалізувати дві функції initState()
, яка ініціалізує первісний стан UI. Та handleEvent()
, яка всі події і обробляє. Що ми успішно і зробили.
Виглядає так, ніби нічого особливого. Код, який нам не довелось писати у ExampleViewModel ми написали у BaseViewModel, та ще й контракт додали з купою додаткових даних.
Але коли у вас багато екранів, багато в’юмоделей, такий підхід значно скоротить і спростить розробку — для зміни стану якогось елемента на UI не потрібно писати окремий метод бо є setState().
А на UI достатньо викликати setEvent()
і він передасть усю інформацію про подію, яка відбулась у в’юмодель.
Це також спрощує додавання в’юмоделі у compose function. Адже всі, хто розробляє на Jetpack Compose прекрасно знають, що як тільки додав в’юмодель — preview успішно зламалось. Так, це все можна обійти, але не всі способи зручні, особливо коли в’юмодель приймає купу аргументів
То ж зараз я покажу досить простий спосіб як це зробити з малими затратами праці (як я і люблю).
Це наш UI. Як бачите, він містить всього два колбеки для обробки події та навігації. Якби наша в’юмодель мала функцію на кожну подію, то колбеків би знадобилось значно більше.
І завершальний шматок коду, де все починається. А може закінчується, це вже з якого боку подивитись.
Ось така ось магія, яка не містить жодної магії.
Раніше я до цього патерну ставився скептично, адже звик користуватись MVVM. Тепер от думаю, що як я жив без цього раніше.
Спробуйте та переконайтесь і самі, якщо не пробували.
А якщо пробували — діліться досвідом. Адже ніщо не досконале, і в цього зручного патерну теж є певні обмеження і застереження.
Цей текст з особистого блогу, опублікований з дозволу автора.
Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: