【发布时间】:2020-05-27 11:41:14
【问题描述】:
在我的 Android 项目中,我有一个在电影存储库中执行搜索的 ViewModel 类:
class MoviesViewModel(private val repository: TmdbRepository) : ViewModel() {
private val queryLiveData = MutableLiveData<String>()
private val moviesResult: LiveData<MovieSearchResult> = Transformations.map(queryLiveData) {
repository.search(it) // The return type of this method is MovieSearchResult
}
val movies: LiveData<PagedList<Movie>> = Transformations.switchMap(moviesResult) { it.data }
/**
* Search movies based on a query string.
*/
fun searchMovies(queryString: String) {
Log.i(AppConfiguration.TAG, "SearchMoviesViewModel.searchMovies().")
queryLiveData.postValue(queryString)
}
}
这是MovieSearchResult类的代码:
data class MovieSearchResult(
val data: LiveData<List<Movie>>
)
MoviesViewModel的方法repository.search(it)访问一个Dao模型,返回如下方法:
@Query("SELECT * FROM Movie WHERE title LIKE '%' || :search || '%'")
fun getMoviesByName(search: String?): LiveData<List<Movie>>
在MoviesViewModel中,变量moviesResult的类型为LiveData<MovieSearchResult>,repository.search(it)的类型为MovieSearchResult。
所以,我们通过Transformations.map() 方法将类型MovieSearchResult 转换为LiveData<MovieSearchResult>。好的。
上面的搜索使用queryLiveData,即MutableLiveData<String>。
所以这是我的问题:如果我需要实现不需要参数的搜索,我应该如何初始化一个新的LiveData 属性?如果我需要创建一个LiveData,它将访问如下所示的 Dao 方法...
@Query("SELECT * FROM Movie")
fun getAll(): LiveData<List<Movie>>
...我应该如何定义我的LiveData 属性?
例如:以下方法不会编译:
private val allMoviesResult: LiveData<MovieSearchResult> = repository.getAll(it)
但这就是我需要做的:输入repository.getAll(it) 并获得LiveData<MovieSearchResult>。
【问题讨论】:
-
那么你为什么将
it传递给不需要参数的参数? -
让它发挥作用!这不是最优雅的方式,但它有效。什么是最优雅的方式?嗯,这就是我在这篇文章中所寻求的。
-
但是,如果您将参数传递给不接受参数的函数,则它不起作用,这就是我问的原因。
标签: android viewmodel transformation android-livedata