如何在没有Transformations.map的ViewModel中初始化LiveData? [重复]

问题描述 投票:0回答:1

在我的Android项目中,我有一个ViewModel类,该类在Movie资料库中执行搜索:

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>>
)

repository.search(it)MoviesViewModel方法访问返回以下方法的Dao模型:

@Query("SELECT * FROM Movie WHERE title LIKE '%' || :search || '%'")
fun getMoviesByName(search: String?): LiveData<List<Movie>>

MoviesViewModel中,变量moviesResult的类型为LiveData<MovieSearchResult>repository.search(it)的类型为MovieSearchResult

因此,我们正在通过方法MovieSearchResult将类型LiveData<MovieSearchResult>转换为Transformations.map()。好的。

上面的搜索使用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>

android viewmodel transformation android-livedata
1个回答
0
投票

我不确定它是否会工作或是否有更好的解决方案,但是也许您可以尝试这样的事情:

class MoviesViewModel(private val repository: TmdbRepository) : ViewModel() {

    private val queryInput = MutableLiveData<String>()
    private val moviesResult: LiveData<MovieSearchResult> = Transformations.switchMap(queryInput) { query ->
        if (query == "ALL") {
            repository.all()
        } else { 
            repository.search(query)
        }
    }

    // I am also not sure about handle a List<Movie> as a PagedList<Movie> 
    val movies: LiveData<PagedList<Movie>> = Transformations.switchMap(moviesResult) { it.data }

    fun searchMovies(queryString: String) {
        queryInput.value = queryString
    }

    fun getAllMovies() {
        queryLiveData.value = "ALL"
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.