【问题标题】:Observing class parameters in Android using databinding and Kotlin使用数据绑定和 Kotlin 在 Android 中观察类参数
【发布时间】:2020-06-01 04:04:07
【问题描述】:

我有模特

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}" />

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

【问题讨论】:

标签: android kotlin mvvm observable android-databinding


【解决方案1】:

使用@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 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 过程,并且还会强制进行一些更改(将参数转换为私有)。

【讨论】:

    猜你喜欢
    • 2016-06-19
    • 2015-09-05
    • 1970-01-01
    • 2017-10-17
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多