All streams
Search
Write a publication
Pull to refresh
17
0
Артур Артиков @a_artikov

Тимлид, Android-разработчик

Send message

В разделе "Проблема" ставится задача "Отобразить ленту с двумя типами данных — текст с описанием и картинка", а в разделе "Решение" решается другая задача.

Получается, нам требуется, чтоб значения полей зависели друг от друга, и не было возможности эту зависимость сломать. В случае MVVM я вижу такое решение.
Нужно организовать состояние так, чтоб оно состояло из двух частей:
1) Основное состояние — оно изменяемое, его можно менять достаточно свободно, не нарушая при этом никаких зависимостей.
2) Производное состояние — напрямую менять его нельзя, оно пересчитывается автоматически как чистая функция от основного состояния.

Пример:
private var hasCreditOffer by state(false)
private var hasAvailableAdvertisement by state(false)
private var namesLoading by state(false)

val isCreditDialogShowing by computed { hasCreditOffer }

val isBannerShowing by computed {
    hasAvailableAdvertisement && !isCreditDialogShowing 
}

val progressShowing by computed {
    namesLoading && !isCreditDialogShowing && !isBannerShowing 
}

Похожие идеи можно увидеть в библиотеке MobX, которая достаточно популярна во фронтенд-мире.
А почему бы не сравнить MVI с MVVM?
Тогда loading, isBannerShowing, isCreditDialogShowing из вашего примера были бы отдельными наблюдаемыми полями. А вместо processAction стало бы:

fun loadNames() {
    loading = true 
    isBannerShowing = false         
    isCreditDialogShowing = false
}

fun loadBanner() {
    loading = false 
    isBannerShowing = true         
    isCreditDialogShowing = false
}

fun loadCreditDialogInfo() {
    loading = false 
    isBannerShowing = false         
    isCreditDialogShowing = true
}

Чем это хуже?
Dagger 2 тоже можно использовать как service locator, если дергать component откуда ни поподя. Это же относится к любому DI фреймворку. Поэтому не понятно, почему в интернете критикуют именно Koin.
Классная статья. Расскажите пожалуйста, как с этим подходом отображать ошибки, например, с помощью алерт-диалога. Чем в этом случае будет ошибка — стейтом или эвентом? Как правильно обработать скрытие ошибки пользователем?
2

Information

Rating
Does not participate
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Date of birth
Registered
Activity

Specialization

Mobile Application Developer
Lead
Android development