Generi c введите MutableLiveData в kotlin - PullRequest
1 голос
/ 03 августа 2020

У меня val _user: MutableLiveData<Resource<List<ApiUser>>> = MutableLiveData() в модели просмотра, но я хочу опубликовать исключение 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)
    }

// ViewModel

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

1 Ответ

1 голос
/ 03 августа 2020

Проблема в том, что вы пытаетесь назначить e, который имеет тип Throwable, аргументу типа List<ApiUser>.

Вместо

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

вам нужно для этого:

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

или

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

где errorMessage - e.message или что-то подобное.

...