Модифицированный вызов с использованием абстракции с kotlin не вызывает onChange - PullRequest
0 голосов
/ 15 октября 2019

Я хочу абстрагировать вызов дооснащения, поэтому мне не нужно писать тот же код котельной пластины, когда мне нужен запрос.

Абстракция

open class NetworkCall<T> {
    lateinit var call: Call<T>
    var result: MutableLiveData<Resource<T>> = MutableLiveData()

    fun makeCall(call: Call<T>) {
        this.call = call
        val callBackKt = CallBackKt<T>()
        callBackKt.result.value = Resource.loading(null)
        this.call.enqueue(callBackKt)
        result = callBackKt.result
    }

    class CallBackKt<T> : Callback<T> {
        var result: MutableLiveData<Resource<T>> = MutableLiveData()

        override fun onFailure(call: Call<T>, t: Throwable) {
            result.value = Resource.error()//APIError()
            t.printStackTrace()
        }

        override fun onResponse(call: Call<T>, response: Response<T>) {
            if (response.isSuccessful) {
                result.value = Resource.success(response.body())
            }
            else {
                result.value = Resource.error()
            }
        }
    }
}

Хранилище

class DetailsRepository(val application: Application) {
    private val myListDao =
        AppDatabase.getDatabase(application)?.MyListDao()
    var movie: MutableLiveData<Resource<DetailsDTO>> = MutableLiveData()

    fun getDetails(id: Int) {
        val networkCall = NetworkCall<DetailsDTO>()
        networkCall.makeCall(Apifactory.tmdbApi.getDetails(id))
        movie = networkCall.result
    }
}

ViewModel

class DetailsViewModel(application: Application) : AndroidViewModel(application) {
    private val repository: DetailsRepository = DetailsRepository(application)
    internal var movie: LiveData<Resource<DetailsDTO>> = repository.movie

    fun insert(myListItem: MyListItem) {
        repository.insert(myListItem)
    }

    fun fetchDetails(id: Int) {
        repository.getDetails(id)
    }

}

Activity

 viewModel.movie.observe(this, Observer {
            it?.apply {
                detail_title.text = data?.title
            }
        })

В каждом методе указывается, что он вызывается в правильном порядке и что запрос работает нормально. Хотя onChange не вызывается.

fetchDetails called
getDetails called
makeCall called
onResponse successful, result.value.data = DetailsDTO(adult=false, backdrop_path=/y8lEIjYZCi2VFP4ixtHSn2klpth.jpg, ... 
...

Что будет сделано неправильно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...