我对Transformations.map的绑定似乎不起作用

问题描述 投票:0回答:1

[尝试将按钮的enabled属性绑定到Transformations.map。我不知道为什么它不起作用。我相信我正在做与本Google代码实验室完全相同的事情:https://codelabs.developers.google.com/codelabs/kotlin-android-training-quality-and-states/index.html?index=..%2F..android-kotlin-fundamentals#4

这是我得到的:

    private val loginFormState = MutableLiveData<LoginFormState>()

    private var _username = ""
    var username
        get() = _username
        set(value) {
            if(value == _username) return
            _username = value
            validateFormState()
        }

    private var _password = ""
    var password
        get() = _password
        set(value) {
            if(value == _password) return
            _password = value
            validateFormState()
        }

    init {
        _busy.value = false
    }

    val loginButtonEnabled: LiveData<Boolean> = Transformations.map(loginFormState) { it.isDataValid }

    private fun validateFormState() {
        val formState = LoginFormState()
        formState.isUsernameValid = username.isNotEmpty()
        formState.isPasswordValid = password.isNotEmpty()
        loginFormState.value = formState
    }
...
...
        <Button
            android:enabled="@{loginViewModel.loginButtonEnabled}"
            android:id="@+id/login_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="start"
            android:layout_marginStart="48dp"
            android:layout_marginTop="16dp"
            android:layout_marginEnd="48dp"
            android:layout_marginBottom="64dp"
            android:onClick="@{() -> loginViewModel.onLogin()}"
            android:text="@string/action_sign_in"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/password"
            app:layout_constraintVertical_bias="0.2" />
...

非常感谢您的帮助!

android kotlin android-databinding android-livedata
1个回答
1
投票

所以我才弄清楚。我不知道为什么会这样,因为其他绑定在此之前就可以工作了,但是可以通过设置:

binding.lifecycleOwner = this

它开始工作。我最初没有设置它是因为我在一个Activity中工作,而不是在Fragment中工作。如果有人知道为什么这使它起作用,将不胜感激!

© www.soinside.com 2019 - 2024. All rights reserved.