【发布时间】:2020-04-14 08:59:09
【问题描述】:
我在 MVVM 架构中有一个 Kotlin 项目。 API 是在 Laravel 后端构建的。除非错误响应未更新 UI,否则一切正常。是不是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)
}
还有 SignupActivity.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)
})
}
我想将特定错误打印到相应的文本视图,即 nameError、emailError... 等。但是 nameError、emailError... 没有更新,当我使用 LiveData.PostValue(value) 时,应用程序崩溃了。请帮帮我。
【问题讨论】:
标签: android kotlin error-handling android-livedata mutablelivedata