Как реализовать поток в Android MVI + Compose с классом данных состояния пользовательского интерфейсаAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Как реализовать поток в Android MVI + Compose с классом данных состояния пользовательского интерфейса

Сообщение Anonymous »

Я создаю экран, на котором отображается список элементов. Этот список элементов поступает из Интернета в виде ответа с разбивкой на страницы, поэтому я пытаюсь использовать PagingData и Pager для этого, но просто не могу найти правильный способ передать этот поток в компонуемый объект при поддержке архитектуры MVI.
Проблема в том, что я сохраняю свой 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, а затем получить оттуда все, что мне нужно. Дело в том, что при тестировании компонуемых объектов и модели представления я обнаружил, что этот подход с использованием класса данных UIState гораздо проще реализовать.
Возможно, сам подход неверен, и я не прав. правильно понимаете MVI?

Подробнее здесь: https://stackoverflow.com/questions/789 ... data-class
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»