Наблюдение параметров класса в Android с использованием привязки данных и Kotlin - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть модель

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(){}, чтобы проверить, совпадают ли эти два поля. Это возможно?

1 Ответ

0 голосов
/ 17 февраля 2020

Используя комментарий @ 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, который ужасно медленный и скучный, а также вызывает некоторые изменения (превращение параметров в частное).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...