Не получается обратный вызов для mutableLivedata android?

В моей модели представления у меня есть 2 вызова API, которые возвращают один и тот же объект. Однако я создал 2 разных объекта MutableLiveData, но не могу наблюдать за вторым объектом.

Это мой код во фрагменте

private fun initObservables() {
    holidayViewModel.progressDialog?.observe(this, Observer {
        if (it!!) customeProgressDialog?.show() else customeProgressDialog?.dismiss()
    })
    holidayViewModel.apiResponse?.observe(
        viewLifecycleOwner,
        androidx.lifecycle.Observer { response ->
            if (response.dataList != null) {
                response.dataList!!.removeAt(0)
                if (requireArguments().getString("file_type")
                        .equals(NetworkConstant.FILE_TYPE_LOH, ignoreCase = true)
                ) {
                    val data = Data()
                    data.CountryId = "0"
                    data.CountryName = "Main organisation"
                    response.dataList!!.add(0, data)
                }
                val holidayAdapter = CountryAdapter(response.dataList)
                binding.holiday.adapter = holidayAdapter
                holidayAdapter.notifyDataSetChanged()
                holidayAdapter.setListener(this)
            }
        })

    holidayViewModel.pdfLink?.observe(
        viewLifecycleOwner,
        androidx.lifecycle.Observer { response ->
            utils.openPdf(response.dataList!!.get(0)?.filePath)
        })
}

Это класс модели представления

class HolidayViewModel(networkCall: NetworkCall) : ViewModel() {
var progressDialog: SingleLiveEvent<Boolean>? = null
var apiResponse: MutableLiveData<ApiResponse>? = null
var pdfLink: MutableLiveData<ApiResponse>? = null
var networkCall: NetworkCall;

init {
    progressDialog = SingleLiveEvent<Boolean>()
    apiResponse = MutableLiveData<ApiResponse>()
    this.networkCall = networkCall
}

fun countries(username: String?, userId: String?) {
    progressDialog?.value = true
    val apiPost = ApiPost()
    apiPost.userName = username
    apiPost.UserId = userId
    networkCall.getCountries(apiPost).enqueue(object : Callback<ApiResponse?> {
        override fun onResponse(
            call: Call<ApiResponse?>,
            response: Response<ApiResponse?>
        ) {
            progressDialog?.value = false
            apiResponse?.value = response.body()
        }

        override fun onFailure(
            call: Call<ApiResponse?>,
            t: Throwable
        ) {
            progressDialog?.value = false
        }
    })
}


fun fetchPdf(
    username: String?,
    password: String?,
    userId: String?,
    countryId: String?,
    fileType: String?
) {
    progressDialog?.value = true
    val apiPost = ApiPost()
    apiPost.userName = username
    apiPost.password = password
    apiPost.UserId = userId
    apiPost.CountryId = countryId
    apiPost.FileType = fileType
    networkCall.getPDF(apiPost).enqueue(object : Callback<ApiResponse?> {
        override fun onResponse(
            call: Call<ApiResponse?>,
            response: Response<ApiResponse?>
        ) {
            progressDialog?.value = false
            pdfLink?.value = response.body()
        }

        override fun onFailure(
            call: Call<ApiResponse?>,
            t: Throwable
        ) {
            progressDialog?.value = false
        }
    })
   }


 }

Я пытаюсь наблюдать pdfLink object , однако вызывается API, но я никогда не получаю обратный вызов в своем фрагменте для этого объекта.

Что здесь не так?


person WISHY    schedule 08.06.2020    source источник
comment
pdfLink никогда не инициализируется (всегда нуль)?   -  person Javatar    schedule 08.06.2020


Ответы (2)


Проблема в том, что pdfLink всегда имеет значение null в viewModel.

Вы объявили var pdfLink: MutableLiveData<ApiResponse>? = null, но еще не инициализировали. И поскольку вы проверяете его с помощью ?, он никогда не генерирует исключение.

Попробуй это:

init {
    progressDialog = SingleLiveEvent<Boolean>()
    apiResponse = MutableLiveData<ApiResponse>()
    pdfLink = MutableLiveData<ApiResponse>() // Add this line inside init
    this.networkCall = networkCall
}
person Peyman    schedule 08.06.2020

Глупая ошибка забыть инициализировать его

pdfLink = MutableLiveData<ApiResponse>()
person WISHY    schedule 08.06.2020