【发布时间】:2021-09-17 10:22:14
【问题描述】:
我有一个显示电影列表的应用。有多种类型(动作、喜剧、趋势等),还有搜索功能。
我使用 switchmap 将搜索结果存储在一个变量中。我正在使用 try 和 catch 来了解要显示的内容。
但是,我在 try and catch 中使用搜索结果变量时遇到了问题,特别是错误“无法分配给 'value': setter is public in 'getMovies'”
下面是视图模型。
感谢任何帮助。
MoviesListViewModel.kt
package com.example.moviesapp.ui
import androidx.lifecycle.*
import com.example.moviesapp.data.MoviesResults
import com.example.moviesapp.data.remote.MoviesRepository
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch
import javax.inject.Inject
const val DEFAULT_QUERY = " "
//Enum class for network state
enum class MovieApiStatus { LOADING, ERROR, DONE }
@HiltViewModel
class MoviesListViewModel @Inject constructor(
private val repository: MoviesRepository,
) : ViewModel() {
private var currentQuery = MutableLiveData(DEFAULT_QUERY)
private val _moviesAction = MutableLiveData<List<MoviesResults.Movies>>()
val moviesAction: LiveData<List<MoviesResults.Movies>> = _moviesAction
private val _moviesComedy = MutableLiveData<List<MoviesResults.Movies>>()
val moviesComedy: LiveData<List<MoviesResults.Movies>> = _moviesComedy
private val _moviesHorror = MutableLiveData<List<MoviesResults.Movies>>()
val moviesHorror: LiveData<List<MoviesResults.Movies>> = _moviesHorror
private val _moviesRomance = MutableLiveData<List<MoviesResults.Movies>>()
val moviesRomance: LiveData<List<MoviesResults.Movies>> = _moviesRomance
private val _moviesScifi = MutableLiveData<List<MoviesResults.Movies>>()
val moviesScifi: LiveData<List<MoviesResults.Movies>> = _moviesScifi
private val _moviesTrending = MutableLiveData<List<MoviesResults.Movies>>()
val moviesTrending: LiveData<List<MoviesResults.Movies>> = _moviesTrending
private val _networkState = MutableLiveData<MovieApiStatus>()
val networkState: LiveData<MovieApiStatus> = _networkState
init {
getMovies()
}
var movies = currentQuery.switchMap { queryString ->
liveData {
emit(repository.getSearchResults(queryString))
}
}
fun searchMovies(query: String) {
currentQuery.value = query
}
private fun getMovies() {
viewModelScope.launch {
_networkState.value = MovieApiStatus.LOADING
try {
_networkState.value = MovieApiStatus.DONE
_moviesAction.value = repository.getActionMovies()
_moviesComedy.value = repository.getComedyMovies()
_moviesHorror.value = repository.getHorrorMovies()
_moviesRomance.value = repository.getRomanceMovies()
_moviesScifi.value = repository.getScifiMovies()
_moviesTrending.value = repository.getTrendingMovies()
} catch (e: Exception) {
_networkState.value = MovieApiStatus.ERROR
_moviesAction.value = listOf()
_moviesComedy.value = listOf()
_moviesHorror.value = listOf()
_moviesScifi.value = listOf()
_moviesRomance.value = listOf()
_moviesTrending.value = listOf()
movies.value = listOf()
}
}
}
class MoviesListViewModelFactory @Inject constructor(private val repository: MoviesRepository) :
ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(MoviesListViewModel::class.java)) {
@Suppress("UNCHECKED_CAST")
return MoviesListViewModel(repository) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}
}
【问题讨论】:
标签: android kotlin android-livedata