Kotlin点击按钮更新ViewModel中debtCategory并存入Room时数值不更新问题
问题原因与解决方案
核心问题1:点击事件执行顺序错误
你在MainActivity的点击逻辑中,先执行了页面跳转,再更新debtCategory的值:
binding.addLender.setOnClickListener { newDebtorActivity() // 先跳转EditActivity mDebtViewModel!!.updateLender() // 跳转后才赋值 }
此时EditActivity初始化时拿到的还是未赋值的空值,自然不会生效。
核心问题2:跨Activity的ViewModel实例不共享
默认情况下ViewModelProvider(this, factory).get()生成的ViewModel是和当前Activity绑定的,MainActivity和EditActivity拿到的是两个完全独立的ViewModel实例,你在MainActivity修改的值,EditActivity根本无法读取。
核心问题3:debtCategory不是可观察类型
你将debtCategory定义为普通String类型,既没有加@Bindable注解也没有用LiveData包裹,即使赋值成功,DataBinding也无法感知到值的变化。
修复步骤
步骤1:调整点击逻辑,通过Intent传递分类参数
直接在跳转时把分类值传给EditActivity,绕开跨Activity共享ViewModel的问题,更简单稳妥:
// 修改addLender点击逻辑 binding.addLender.setOnClickListener { val intent = Intent(this, EditActivity::class.java) intent.putExtra("DEBT_CATEGORY", "Lender") startActivity(intent) binding.addBorrower.visibility = View.INVISIBLE binding.addLender.visibility = View.INVISIBLE } // 修改addBorrower点击逻辑 binding.addBorrower.setOnClickListener { val intent = Intent(this, EditActivity::class.java) intent.putExtra("DEBT_CATEGORY", "Borrower") startActivity(intent) binding.addBorrower.visibility = View.INVISIBLE binding.addLender.visibility = View.INVISIBLE }
步骤2:EditActivity中接收参数赋值给ViewModel
在EditActivity的onCreate方法中读取传入的参数,给ViewModel的debtCategory赋值:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 其他初始化逻辑不变 val category = intent.getStringExtra("DEBT_CATEGORY") ?: "" mDebtViewModel.debtCategory = category }
步骤3:优化ViewModel的debtCategory定义(可选但推荐)
把debtCategory改成LiveData类型,适配你现有的DataBinding逻辑,同时删掉没用的Observable接口实现:
// 删掉原来的implements Observable,以及两个空的回调方法 class DebtViewModel(private val debtManagementRepository: DebtManagementRepository) : ViewModel() { // 把普通String改成MutableLiveData val debtCategory = MutableLiveData<String>() // 修改更新方法 fun updateLender(){ debtCategory.value = "Lender" } fun updateBorrower(){ debtCategory.value = "Borrower" } // saveUpdate方法里取值时改为 val dtCategory: String = debtCategory.value ?: "" }
补充验证
你可以在saveUpdate方法中加一行Log打印dtCategory的值,就能直接确认赋值是否生效。
内容的提问来源于stack exchange,提问作者Charles
相关产品推荐
相关产品推荐

