Android货币转换器API返回CurrencyResponse无法仅提取conversion_result问题
问题解决方法
你当前拿到异常格式返回值的核心原因是:Kotlin 数据类的默认toString()方法会输出「类名+所有属性键值对」的格式,你在代码中直接对CurrencyResponse对象调用了toString(),才会得到CurrencyResponse(conversion_result=1)这种结果。
修复步骤
1. 核心修改:调整ViewModel取值逻辑
修改CurrencyViewModel.kt中getConversionRate方法的赋值逻辑,不要调用整个对象的toString(),直接取conversion_result属性的值即可:
fun getConversionRate(baseCurrency: String, toCurrency: String, amount: Double?) { viewModelScope.launch { val response = repository.getConversionRate(baseCurrency, toCurrency, amount) // 直接取属性值,不要调用toString() _conversionResult.value = response.conversion_result } }
可选优化建议
1. 调整属性类型适配接口返回
接口返回的conversion_result是数值类型,你现在定义为String容易出现解析异常,建议修改CurrencyResponse.kt的属性类型为Double,Moshi会自动完成解析:
data class CurrencyResponse( @Json(name="conversion_result") val conversion_result: Double )
修改后如果需要统一保留小数位展示,可以在ViewModel中格式化后再赋值:
_conversionResult.value = "%.2f".format(response.conversion_result)
2. 优化观察者注册逻辑
你当前把conversionResult的观察者放在了按钮点击事件中,每次点击都会重复注册同一个观察者,建议把观察者注册逻辑移到onViewCreated方法全局只注册一次:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // ... 原有其他逻辑不变 // 全局注册观察者,不要放在点击事件里 viewModel.conversionResult.observe(viewLifecycleOwner) { binding.resultText.text = it } binding.button.setOnClickListener { val stringInTextField = binding.amountText.text.toString() val amount = stringInTextField.toDoubleOrNull() if(amount==null) { binding.resultText.text = " " // 加return避免空值发起无效请求 return@setOnClickListener } viewModel.getConversionRate(firstCurrency, secondCurrency, amount) } }
内容的提问来源于stack exchange,提问作者Ahmadddd4
相关产品推荐
相关产品推荐

