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

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

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

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

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

Оновлений Codex Desktop отримав 90+ плагінів, SSH та вбудований браузер

Компанія OpenAI представила масштабне оновлення свого десктопного застосунку Codex. Воно перетворює інструмент з простого помічника…

17.04.2026

Робочий експлойт за ціною вживаного авто: Claude Opus зламав захист Google Chrome за $2283

Модель штучного інтелекту Claude Opus 4.6 від компанії Anthropic продемонструвала здатність створювати функціональні експлойти для…

17.04.2026

Data-брокери на руїнах стартапів: розробники LLM-моделей скуповують архіви компаній

Ринок навчання штучного інтелекту виходить на новий рівень: тепер «паливом» для нейромереж стають не лише…

17.04.2026

21-річна польська програмістка знайшла та виправила баг у Linux, який старший за неї

Молода польська розробниця Каміла Шевчик змогла розв'язати технічну проблему в інтерфейсі Linux, яка залишалася непоміченою…

17.04.2026

Більше ніяких зависань: Android 17 жорстко обмежить обсяг пам’яті для програм

Компанія Google випустила четверту та фінальну бету Android 17, яка стала важливою віхою на шляху…

17.04.2026

Anthropic випустила Claude Opus 4.7. Повний огляд можливостей нової моделі

Компанія Anthropic офіційно представила свою найпотужнішу на сьогодні LLM-модель — Claude Opus 4.7, яка стала…

17.04.2026