You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 08:06:04