Как отказаться от 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.
Мой проект полностью на гитхабе