使用数据绑定和 Kotlin 观察 Android 中的 class 参数

Observing class parameters in Android using databinding and Kotlin

我有模型

data class RegisterPostDataWithPwdCheck(
    var phone_number: String?,
    var name: String?,
    var password: String?,
    var secondPassword: String?)

还有一个 ViewModel

class SignUpViewModel(application: Application) : BaseViewModel(application){
        val registerPostData = MutableLiveData<RegisterPostDataWithPwdCheck>...
        fun checkPassword(){}...}

我也有一个包含这段代码的视图

viewModel.registerPostData.observe(viewLifecycleOwner, Observer {
    viewModel.checkPassword()
    })

在 XML 中有两个感兴趣的字段

<EditText
android:id="@+id/edittext_sign_up_password"
android:text="@={view_model.registerPostData.password}" />
<EditText
android:id="@+id/edittext_sign_up_second_pw"
android:text="@={view_model.registerPostData.secondPassword}" />

目前我所理解的是 .observe 只有在整个 RegisterPostDataWithPwdCheck 对象发生变化时才会被调用,而我不希望这样。我希望它在任何参数更改时触发,以便我可以调用 fun checkPassword(){} 以查看这两个字段是否匹配。这可能吗?

使用@mahdi-shahbazi 评论,我已经设法在 Kotlin 中解决了这个问题。我的模型现在是:

data class RegisterPostDataWithPwdCheck(
@SerializedName(value = "phone_number")
private var phoneNumber: String?,
private var name: String?,
private var password: String?,
private var secondPassword: String?
) : BaseObservable() {

@Bindable
fun getPhoneNumber(): String? {
    return phoneNumber
}

fun setPhoneNumber(value: String) {
    if (value != phoneNumber) {
        phoneNumber = value
        notifyPropertyChanged(BR.phoneNumber)
    }
}

@Bindable
fun getName(): String? {
    return name
}

fun setName(value: String?) {
    if (value != name) {
        name = value
        notifyPropertyChanged(BR.name)
    }
}

@Bindable
fun getPassword(): String? {
    return password
}

fun setPassword(value: String?) {
    if (value != password) {
        password = value
        notifyPropertyChanged(BR.password)
    }
}

@Bindable
fun getSecondPassword(): String? {
    return secondPassword
}

fun setSecondPassword(value: String?) {
    if (value != secondPassword) {
        secondPassword = value
        notifyPropertyChanged(BR.secondPassword)
    }
}
}

并创建自定义 LiveData class:

class PropertyAwareMutableLiveData<T : BaseObservable> : MutableLiveData<T>() 
{

private val callback = object : Observable.OnPropertyChangedCallback() {
    override fun onPropertyChanged(sender: Observable?, propertyId: Int) {
        value = value
    }
}

override fun setValue(value: T?) {
    super.setValue(value)
    value?.addOnPropertyChangedCallback(callback)
}
}

我仍然不知道是否有一种方法可以使这个非常缓慢和无聊的@Binding 过程自动化,并且还会强制进行一些更改(将参数变为私有)。