【问题标题】:Generic type in MutableLiveData in kotlinkotlin 中 MutableLiveData 中的泛型类型
【发布时间】:2020-08-03 13:35:16
【问题描述】:

我有一个 val _user: MutableLiveData<Resource<List<ApiUser>>> = MutableLiveData()in viewmodel 但我想 postValue errorException

  // A generic class that contains data and status about loading this data.
    sealed class Resource<T>(
        val data: T? = null,
        val message: String? = null
    ) {
        class Success<T>(data: T) : Resource<T>(data)
        class Loading<T>(data: T? = null) : Resource<T>(data)
        class Error<T>(message: String, data: T? = null) : Resource<T>(data, message)
    }

//视图模型

class HomeViewModel : ViewModel() {
    
        val _user: MutableLiveData<Resource<List<ApiUser>>> = MutableLiveData()
        var job: CompletableJob? = null
        fun f() {
            job = Job()
            _user.postValue(Resource.Loading(null))
            CoroutineScope(IO+job!!).launch {
                try {
                    _user.postValue(Resource.Success(RetrofitBuilder.apiService.getUsers()))
                } catch (e: Throwable) {
                    _user.postValue(Resource.Error("",e))
                }
            }
        }
     fun cancelJob() {
            job?.cancel()
        }
    
    }

//片段

fun subScribeUI() {
        viewModel!!._user.observe(viewLifecycleOwner, Observer {
            it?.let {
               when(it.status) {
                   Status.LOADING -> {
                       Timber.d("LOADING")
                   }
                   Status.SUCCESS -> {
                       Timber.d("SUCCESS")
                   }
                   Status.ERROR -> {
                       Timber.d("ERROR")
                   }
               }
            }
        })
    }

       override fun onDestroyView() {
        super.onDestroyView()
viewModel?.cancelJob()
    }

【问题讨论】:

  • 为什么要创建一个新范围?您已经拥有viewModelScope
  • 因为 getUsers() 是挂起函数所以
  • 那不是答案,viewModelScope也是协程作用域
  • @EpicPandaForce 你的意思是我应该使用 viewModelScope.launch {} 而不是 CoroutineScope(IO+job!!).launch {}?
  • 我相信这确实是他的意思。使用它,您也不需要取消onDestroy()(或其他任何地方)中的作业,因为viewModelScope 已经绑定到viewModels 生命周期。

标签: android kotlin generics android-livedata mutablelivedata


【解决方案1】:

问题是您试图将e 类型为Throwable 分配给List&lt;ApiUser&gt; 类型的参数。

代替

_user.postValue(Resource.Error("", e))

你需要这样做:

_user.postValue(Resource.Error(errorMessage, emptyList())

_user.postValue(Resource.Error(errorMessage, null)

其中errorMessagee.message 或类似的东西。

【讨论】:

  • 感谢您的回答,但在 UI 中我如何知道错误的原因?如果是超时或其他网络问题。
  • Resource添加另一个参数,使其成为Resource&lt;T, U&gt;。这样,您也可以传入Throwable(或其他任何内容)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多