代码之家  ›  专栏  ›  技术社区  ›  WISHY

没有收到mutableLivedata android的回调?

  •  0
  • WISHY  · 技术社区  · 6 年前

    在我的viewmodel中,有两个api调用返回相同的对象。然而,我创建了两个不同的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 对象,但是API被调用了,但是我从来没有在我的片段中得到这个对象的回调。

    这里怎么了?

    0 回复  |  直到 6 年前
        1
  •  1
  •   Peyman    6 年前

    问题是 pdfLink 在viewModel中始终为空。

    你已经宣布 var pdfLink: MutableLiveData<ApiResponse>? = null 但还没有初始化。既然你是空的 ?

    试试这个:

    init {
        progressDialog = SingleLiveEvent<Boolean>()
        apiResponse = MutableLiveData<ApiResponse>()
        pdfLink = MutableLiveData<ApiResponse>() // Add this line inside init
        this.networkCall = networkCall
    }
    
        2
  •  0
  •   WISHY    6 年前

    一个愚蠢的错误忘记初始化它

    pdfLink = MutableLiveData<ApiResponse>()