Kotlin Обновление значения MutableLiveData - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть Kotlin проект в MVVM Architecture. API встроен в Laravel Backend. Все работает нормально, если Ошибка ответа не обновляет пользовательский интерфейс. Является ли это проблемой LiveData или нет, я не могу понять.

SignUpRepository.kt

val failureResponse = MutableLiveData<JSONObject>()

fun signUp(name: String, email: String, password: String){

        val retrofit = Retrofit.Builder().baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create()).build()

        val service = retrofit.create(UserAPIService::class.java)

        service.createUser(name, email, password).enqueue(object : Callback<String>{
            override fun onFailure(call: Call<String>, t: Throwable) {
                Log.d(TAG, "Failure: ${t.localizedMessage}")
            }

            override fun onResponse(call: Call<String>, response: Response<String>) {
                if(response.isSuccessful()){
                    Log.d(TAG, "Success: ${response.body()}")
                } else {
                    var jsonObject: JSONObject? = null
                    try {
                        jsonObject = JSONObject(response.errorBody()!!.string())
                        if(failureResponse.value == null) {
                            failureResponse.value = jsonObject
                        } else {
                            failureResponse.postValue(jsonObject)
                        }
                    } catch (e: JSONException) {
                        e.printStackTrace()
                    }
                }
            }
        })
    }

SignUpViewModel.kt

val failureResponse: LiveData<JSONObject>

init {
        this.signUpResponse = repo.signUpResponse
        this.failureResponse = repo.failureResponse
    }

fun signUp(name: String, email: String, password: String){
        repo.signUp(name, email, password)
    }

И RegistrationActivity. kt

btnSignup.setOnClickListener {
            val username = txt_create_username.text.toString()
            val email = txt_create_email.text.toString()
            val password = txt_created_password.text.toString()

            signUpViewModel.stateChange()
            signUpViewModel.signUp(username, email, password)

signUpViewModel.failureResponse.observe(this, Observer {
        nameError.text = (it.getJSONArray("name")).getString(0)
        emailError.text = (it.getJSONArray("email")).getString(0)
        passwordError.text = (it.getJSONArray("password")).getString(0)
     })
}

Я хочу напечатать указанную ошибку c для соответствующего текстового представления, т.е. nameError, emailError ... et c. Но nameError, emailError ... не обновляются, и когда я использовал LiveData.PostValue(value), приложение вылетает. Пожалуйста, помогите мне.

1 Ответ

0 голосов
/ 14 апреля 2020

Потому что вы ничего здесь не настраиваете.

override fun onResponse(call: Call<String>, response: Response<String>) {
                if(response.isSuccessful()){
                    Log.d(TAG, "Success: ${response.body()}")
                } else {
                    var jsonObject: JSONObject? = null
                    try {


                    jsonObject = JSONObject(response.errorBody()!!.string())
                      failureResponse.value = jsonObject 
                    } catch (e: JSONException) {
                        e.printStackTrace()
                    }
                }
            }
...