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

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

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

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

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

У Росії націоналізували одну з найбільших геймдев-компаній. Звинуватили в підтримці ЗСУ

Таганський суд Москви ухвалив рішення про передачу у власність держави 100% уставного капіталу IT-компанії «Леста…

04.06.2025

Adobe випустила бета-версію Photoshop для Android

Компанія Adobe оголосила про випуск бета-версії мобільного додатку Photoshop для платформи Android. Реліз стався через…

03.06.2025

Користувачам Windows дозволять видалили Microsoft Store і перестануть нав’язувати Edge — але не всім

Microsoft оголосила, що внесе у Windows деякі зміни щодо роботи сторонніх додатків та сервісів. Компанія…

03.06.2025

Salesforce скорочує найм програмістів. Причина в штучному інтелекті

Завдяки інструментам на базі штучного інтелекту американський IT-гігант Salesforce скоротив найм технічних працівників, у тому…

03.06.2025

OpenAI переписує інструмент кодування Codex CLI з TypeScript на Rust

OpenAI переписала свій інструмент кодування Codex CLI з TypeScript на Rust. Причиною названо підвищення продуктивності…

03.06.2025

В Microsoft Bing інтегрували безкоштовний генератор відео від Sora

Microsoft додала відеогенератор Sora від OpenAI у свій мобільний застосунок Bing. Це перший випадок, коли…

03.06.2025