Я показываю список фильмов из API TMDB. У меня есть поток, наблюдающий за моими данными в любое время, и я показываю их с помощью LazyRow.
Мои фильмы доступны для кликов, и при этом необходимо обновить одно поле из MovieUI. Это работает в первый раз, но не в следующий раз. Мои данные обновляются в моей БД, как и должно быть. Если я перезагружу приложение, отобразятся правильные данные.
Единственный метод, который я нашел, чтобы заставить его работать, — это использовать movie.hashCode(), но в этом случае моя анимация не работает. больше. Если я использую movie.id (который сопоставлен с сущностью «Комната» как первичный ключ), он не работает, но анимация работает.
Что я делаю не так?
Модель просмотра
Код: Выделить всё
val viewState: StateFlow by lazy {
observeMoviesUseCase()
.mapLatest { movies ->
when {
movies.isNullOrEmpty() -> {
MovieUiStateResult.Empty
}
else -> {
Log.d("HMM", "List fetched in ViewModel is: $movies")
MovieUiStateResult.Fetched(list = movies.toListMovieUI())
}
}
}
.flowOn(Dispatchers.Main)
.stateIn(
viewModelScope,
SharingStarted.WhileSubscribed(5000),
MovieUiStateResult.Loading,
)
}
Код: Выделить всё
@Entity(tableName = "movies")
data class MovieEntity(
@PrimaryKey(autoGenerate = false) val id: Int,
@ColumnInfo(name = "title") val title: String,
@ColumnInfo(name = "poster_path") val remotePosterPath: String,
@ColumnInfo(name = "local_poster_path") val localPosterPath: String = "",
@ColumnInfo(name = "favourite") val favourite: Boolean = false,
@ColumnInfo(name = "already_seen") val seen: Boolean = false,
)
Код: Выделить всё
@Immutable
data class MovieUi(
val id: Int,
val coverUrl: String,
val isFavorite: Boolean
)
Код: Выделить всё
@Composable
fun MovieScreen(
modifier: Modifier = Modifier,
movies: List,
onCardEvent: (CardEvent) -> Unit,
) {
val listState = rememberLazyListState()
val movieListState = remember { MovieListState(listState) }
LazyRow(
modifier = modifier,
verticalAlignment = Alignment.CenterVertically,
state = listState,
) {
items(movies) { currentMovie ->
key(currentMovie.id) { // Not recomposing except if I use currentMovie.hashCode()
MovieContent(
listOfMovies = movies,
currentMovie = currentMovie,
onCardEvent = onCardEvent,
state = movieListState
)
}
}
}
}
Источник: https://stackoverflow.com/questions/781 ... ot-item-id
Мобильная версия