【问题标题】:Try and catch with Livedata尝试使用 Livedata 进行捕捉
【发布时间】: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


    【解决方案1】:

    movies 的类型为LiveData&lt;T&gt;,因为您使用的是Transformations.switchMaphere 文档)。您可以使用 MediatorLiveData 从两个不同的来源发射

    【讨论】:

    • 那么电影的类型应该是 mediatorlivedata?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 2010-11-23
    • 2013-08-04
    • 2014-12-27
    • 1970-01-01
    相关资源
    最近更新 更多