Как отказаться от State (Jetpack Compose) в классе бизнес-логики?

Есть класс репозитория (не судите меня: он не реализует паттерн "Repository"), который инкапсулирует часть бизнес-логики.

object RepositoryImpl : Repository {

    override val currentTranslationId = mutableStateOf<TranslationId>(TranslationId.None)

    override val catechismState = mutableStateOf<CatechismState>(CatechismState.Never)

    override var scrollPosition = ScrollPosition.DEFAULT

    override fun savePositionToPrefs(context: Context) {
        saveToPrefs(
            Position(currentTranslationId.value, scrollPosition),
            context
        )
    }

    override fun loadPositionFromPrefs(context: Context) {
        val position = loadFromPrefs(context)
        currentTranslationId.value = position.translation
        scrollPosition = position.scroll
    }

    override var previousConditions: SearchConditions? = null

    override val found = mutableStateOf<Found?>(null)
}

На сегодняшний день в нём зашиты State-ы от Jetpack Compose. Я понимаю, что это архитектурно неправильно т.к. ставит бизнес-логику в зависимость от Jetpack Compose.

abstract class CatechismViewModel(application: Application) : RepositoryViewModel(application) {

    protected val _catechismState = repository.catechismState
    val catechismState: State<CatechismState> = _catechismState
}
class ReadingViewModel(application: Application) : CatechismViewModel(application) {

    lateinit var loader: CatechismLoader

    private var _scrollPosition = mutableStateOf(ScrollPosition.DEFAULT)
    val scrollPosition: State<ScrollPosition> = _scrollPosition

    init {
        CatechismLoaderComponent.inject(this)
        _scrollPosition.value = repository.scrollPosition
    }

    private fun loadCatechism() {
        viewModelScope.launch(Dispatchers.IO) {
            try {
                _catechismState.value = CatechismState.Loaded(
                    loader.load(
                        (repository.currentTranslationId.value as TranslationId.Id).value,
                        context = getApplication()
                    )
                )
            } catch (e: FileLoadingException) {
                _catechismState.value = CatechismState.Error(e)
            }
        }
    }

    fun selectToLoad() {
        _catechismState.value = CatechismState.SelectedToLoad
        loadCatechism()
    }

    fun saveScrollPosition(state: LazyListState) {
        repository.scrollPosition = ScrollPosition(state.firstVisibleItemIndex,
            state.firstVisibleItemScrollOffset)
    }
}

ViewModel-и ссылаются на эти свойства из класса репозитория.

Подскажите, пожалуйста, как правильно избавиться от этой зависимости. Я пробовал переделать MutableState в MutableStateFlow. Но беда в том, что вызвать collectAsState() можно только из composable-функции, а мне нужно из ViewModel.

Мой проект полностью на гитхабе


Ответы (0 шт):