Найти тему
MirProg

Построение MVI, MVVM архитектуры на Arkts для Android разработчиков, замена flow и livedata

Для Android разработчика есть привычные инструменты. Для связи View(UI) и ViewModel обычно используется livedata или flow. Обычно у viewmodel есть публичный поток данных, на который подписывается View через методы collectAsState и тд. В Harmony это реализовано немного иначе.

Здесь расскажу, чем заменить.

Переменные в View, которые содержат какое-то состояние помечаются различными декораторами. Для передачи данных между ViewModel и View можно использовать AppStorage и LocalStorage, они отличаются скоупом, который привязан к экрану или к всему приложению. Глобальную и локальную память. С глобальным скоупом проще, AppStorage можно сразу в каком-то месте получить в модели без инициализации и что-то передать. Но это хорошо, для глобальных каких-то вещей, единых для всех экранов. Для локальной памяти нужно создать сторадж и передать его во View декоратор Entry. Аннотации здесь называются декораторами.

-2

Entry - точка входа в навигации, это экран

Component - View, аналог Composable

-3

@LocalStorageProp - замена flow и collectAsState, декоратор для связи через локальную память, принимает string, удобнее передавать константу для отслеживания по проекту, где что передается по этому ключу. Подстановка константы может не работать на ранних версиях api, проверено на версии 12 - работает, на api 9 - не работает, работает только с строкой напрямую 'splashEnd'

-4

@Watch - следит за изменением переменной и вызывает колбек, принимает string, компилятор ищет колбек в верстке и дает ошибку, если не находит такое название

Есть переменная состояния, через которую мы хотим сказать View, что пришло время перейти на другой экран. Например, мы показали splash screen, что-то загрузили, теперь хотим перейти дальше.

Мы через LocalStorage передадим по ключу SPLASH_END значение, изменение которого, вызовет колбек onSplashEnd

ViewModel принимает localStorage

-5

Далее мы в нужный момент передаем значение

-6

После этого обновится View и вызовет, router например.

Так можно построить MVVM архитектуру и MVI с организацией единого стейта и однократных событий.

Офф. дока.