Проблема в том, что я сохраняю свой UIState в saveStateHandle, но не могу добавить поток в класс данных UIState, потому что этот поток нельзя разделить.
Это моя модель представления (не хватает некоторого кода, но это не важно для вопроса):
Код: Выделить всё
class PopularMoviesViewModel(
savedStateHandle: SavedStateHandle,
private val movieRepository: MovieRepository
) : ViewModel() {
private val pageSize = 20
data class UIState(
val isLoading: Boolean,
val movies: Flow
>
)
private val _uiStateDelegate = ViewModelPropertyDelegate(
savedStateHandle,
"uiState",
UIState(
false,
flow {}
)
)
private var _uiState by _uiStateDelegate
val uiState = _uiStateDelegate.getStateFlow()
sealed interface Action {
class OnClickMovie(val movie: Movie) : Action
}
init {
loadPopularMovies()
}
private fun loadPopularMovies() {
_uiState = _uiState.copy(movies = Pager(
config = PagingConfig(pageSize = pageSize),
initialKey = 1,
pagingSourceFactory = { movieRepository.getPopularMovies() }
).flow.cachedIn(viewModelScope))
}
}
Код: Выделить всё
@Composable
fun PopularMoviesComposable(
uiState: PopularMoviesViewModel.UIState,
doAction: (PopularMoviesViewModel.Action) -> Unit,
modifier: Modifier = Modifier
) {
Box(
modifier = modifier
.fillMaxSize()
.padding(vertical = 48.dp, horizontal = 16.dp)
) {
val movies = uiState.movies.collectAsLazyPagingItems()
LazyVerticalGrid(
columns = GridCells.Adaptive(128.dp),
verticalArrangement = Arrangement.spacedBy(16.dp),
horizontalArrangement = Arrangement.spacedBy(12.dp)
) {
items(movies.itemCount)
{ index ->
movies[index]?.let {
MovieCard(
movie = it,
onClickMovie = {doAction(PopularMoviesViewModel.Action.OnClickMovie(it))}
)
}
}
}
}
}
Возможно ли это иметь компонуемый объект с таким классом UIState, если в классе UIState есть поток?
Извините за плохой английский.
Я знаю, что могу просто внедрить модель представления в компонуемый объект вместо использования UIState, а затем получить оттуда все, что мне нужно. Дело в том, что при тестировании компонуемых объектов и модели представления я обнаружил, что этот подход с использованием класса данных UIState гораздо проще реализовать.
Возможно, сам подход неверен, и я не прав. правильно понимаете MVI?
Подробнее здесь: https://stackoverflow.com/questions/789 ... data-class