我有一个用Jetpack Compose构建的电影应用程序.有部分我正在播放用户 Select 的最受欢迎的电影.优点应该完美地出现在用户界面中,但当我从用户界面中删除项目时,用户界面不会立即重组以反映更改.该怎么办呢?
这是我的UI
@Composable
fun FavScreen(
movieViewModel: MovieViewModel
) {
remember { mutableStateOf(movieViewModel.getFavMovies()) }
val shouldShowDialog = remember { mutableStateOf(false) }
val uiStates = movieViewModel.favs.collectAsState()
Column {
Row {
Text(
text = "Fav Movies",
fontSize = 25.sp,
fontFamily = FontFamily(Font(R.font.nsb)),
modifier = Modifier.padding(20.dp).weight(1f)
)
IconButton(onClick = {
shouldShowDialog.value = true
}) {
Icon(Icons.Filled.Delete, contentDescription = "")
}
}
when(val currentState = uiStates.value){
is MovieViewModel.UiStates.LOADING -> {
Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
CircularProgressIndicator()
}
}
is MovieViewModel.UiStates.FAVS -> {
val data = currentState.data
if(data.isEmpty()){
Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
Text(
text = "No Fav Movies",
fontSize = 25.sp,
fontFamily = FontFamily(Font(R.font.nsb)),
modifier = Modifier.padding(20.dp))
}
}
else {
LazyColumn(){
items(data){ fav ->
Row(modifier = Modifier
.padding(20.dp)
.fillMaxWidth()
.clip(RoundedCornerShape(16.dp))
.background(color = Color.DarkGray)) {
AsyncImage(
model = Utils.IMAGE_URL + fav.imageUrl,
contentDescription = "",
contentScale = ContentScale.Crop,
filterQuality = FilterQuality.High,
modifier = Modifier
.width(150.dp)
.height(150.dp))
Column(modifier = Modifier.padding(20.dp)) {
Text(
text = fav.title!!,
fontSize = 20.sp,
fontFamily = FontFamily(Font(R.font.nsb)))
Text(
text = fav.rating.toString() + "/10 IMDB",
fontSize = 15.sp,
fontFamily = FontFamily(Font(R.font.nsb)))
Text(
text = "Movie ID : #" + fav.movieID,
fontSize = 15.sp,
fontFamily = FontFamily(Font(R.font.nsb)))
}
}
}
}
}
}
is MovieViewModel.UiStates.ERROR -> {
Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center){
Text(
text = "No Fav Movies",
fontSize = 25.sp,
fontFamily = FontFamily(Font(R.font.nsb)),
modifier = Modifier.padding(20.dp))
}
}
else -> {}
}
}
if (shouldShowDialog.value){
AlertDialog(
onDismissRequest = { shouldShowDialog.value = false },
confirmButton = {
TextButton(onClick = {
movieViewModel.deleteMovies()
shouldShowDialog.value = false
}) {
Text(text = "Proceed", fontFamily = FontFamily(Font(R.font.nsm)))
}
},
dismissButton = {
TextButton(onClick = {
shouldShowDialog.value = false
}) {
Text(text = "Cancel", fontFamily = FontFamily(Font(R.font.nsm)))
}
},
shape = RoundedCornerShape(16.dp),
text = { Text(text = "Favs Deletion",fontFamily = FontFamily(Font(R.font.nsb)))},
title = { Text(text = "Do you want to delete all fav movies ?", fontFamily = FontFamily(Font(R.font.nsb)))}
)
}
}
这是我的取景模型
@HiltViewModel
class MovieViewModel @Inject constructor(
private val movieRepoImpl: MovieRepoImpl
) : ViewModel() {
private val _favs : MutableStateFlow<UiStates> = MutableStateFlow(UiStates.INITIAL)
val favs get() = _favs.asStateFlow()
// MOVIE DAO
fun getFavMovies() = viewModelScope.launch {
try {
_favs.value = UiStates.LOADING
movieRepoImpl.getFavs().collectLatest {
_favs.value = UiStates.FAVS(it)
}
} catch (ex : Exception){
_favs.value = UiStates.ERROR(ex.localizedMessage!!)
}
}
fun insertMovie(favModel: FavModel) = viewModelScope.launch {
movieRepoImpl.insertFav(favModel)
}
fun deleteMovies() = viewModelScope.launch {
movieRepoImpl.deleteAllMovies()
}
sealed class UiStates {
object LOADING : UiStates()
data class FAVS(val data : MutableList<FavModel>) : UiStates()
data class ERROR(val error : String) : UiStates()
object INITIAL : UiStates()
}
}