【问题标题】:How to initialize a LiveData in a ViewModel without Transformations.map? [duplicate]如何在没有 Transformations.map 的 ViewModel 中初始化 LiveData? [复制]
【发布时间】: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&lt;MovieSearchResult&gt;repository.search(it)的类型为MovieSearchResult

所以,我们通过Transformations.map() 方法将类型MovieSearchResult 转换为LiveData&lt;MovieSearchResult&gt;。好的。

上面的搜索使用queryLiveData,即MutableLiveData&lt;String&gt;

所以这是我的问题:如果我需要实现不需要参数的搜索,我应该如何初始化一个新的LiveData 属性?如果我需要创建一个LiveData,它将访问如下所示的 Dao 方法...

@Query("SELECT * FROM Movie")
fun getAll(): LiveData<List<Movie>>

...我应该如何定义我的LiveData 属性?

例如:以下方法不会编译:

private val allMoviesResult: LiveData&lt;MovieSearchResult&gt; = repository.getAll(it)

但这就是我需要做的:输入repository.getAll(it) 并获得LiveData&lt;MovieSearchResult&gt;

【问题讨论】:

  • 那么你为什么将it 传递给不需要参数的参数?
  • 让它发挥作用!这不是最优雅的方式,但它有效。什么是最优雅的方式?嗯,这就是我在这篇文章中所寻求的。
  • 但是,如果您将参数传递给不接受参数的函数,则它不起作用,这就是我问的原因。

标签: android viewmodel transformation android-livedata


【解决方案1】:

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

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"
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    相关资源
    最近更新 更多