Магія 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. Тепер от думаю, що як я жив без цього раніше.

Спробуйте та переконайтесь і самі, якщо не пробували.

А якщо пробували — діліться досвідом. Адже ніщо не досконале, і в цього зручного патерну теж є певні обмеження і застереження.

Цей текст з особистого блогу, опублікований з дозволу автора.

Останні статті

Україна — п’ята у світі за кількістю кібератак

Україна опинилась на пʼятому місці у світі серед країн, на які найчастіше спрямовані кібератаки. Про…

17.10.2025

Gemini тепер може виконувати багатоетапні завдання в Google Таблицях

Google удосконалила помічник Gemini, додавши до його функціоналу можливість виконувати в Google Таблицях кілька дій…

17.10.2025

Знання C++ надає максимальні шанси знайти роботу в українському IT, найважче — JavaScript-розробникам

Володіння мовою програмування С++ значно посилює шанси отримати посаду розробника ПЗ в українській IT-компанії. Фахівці…

17.10.2025

Помічником Copilot тепер можна керувати голосом

Microsoft оголосила про масштабну трансформацію Windows 11, яка стосується розширення функціональності Copilot. Відтепер користувачі можуть…

17.10.2025

Anthropic презентує Skills — набір папок, скриптів та інструкцій для Claude

Компанія Anthropic оголосила про випуск інструмента Skills (Навички). Він складається з папок, що містять інструкції,…

17.10.2025

Популярний ML-фреймворк PyTorch оновлено до версії 2.9

Відкритий фреймворк PyTorch, який розроблено в стінах Facebook, і на якому зараз навчають більшість сучасних…

16.10.2025