首页 > 解决方案 > Kotlin 没有从绑定的 viewModel 中获取数据

问题描述

我正在尝试获取用户在自动完成视图中输入的数据,但我没有在 viewModel 中收到它。

有xml文件,

<layout xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

<data>

    <variable
        name="connectionViewModel"
        type="com.example.soccerinfo.connection.ConnectionViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <AutoCompleteTextView
        android:id="@+id/mail"
        style="@style/textStyle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/enter_your_mail"
        android:inputType="textEmailAddress"
        android:text="@{connectionViewModel._connectionMailId}"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.23000002" />

    <Button
        android:id="@+id/connectionButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/sign_in"
        android:onClick="@{() -> connectionViewModel.onConnection()}"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/mail" />

</androidx.constraintlayout.widget.ConstraintLayout>

</layout>

有viewModel,在insertUpdate 函数中我试图显示connectionMailId。当我想显示日志时,connectionMailId 显示一个空字符串

class ConnectionViewModel(
    val database: ConnectionDataBaseDao,
    private val app : Application) :  AndroidViewModel(app){

    private val _eventConnectionMade = MutableLiveData<Boolean>()
    val eventConnectionMade : LiveData<Boolean>
        get() = _eventConnectionMade

    val _mails : MutableLiveData<List<Connection>> = MutableLiveData()

    var _connectionMailId = String()


    init {

        viewModelScope.launch(Dispatchers.IO) {
            _mails.postValue(database.getAllConnections())
        }
        _connectionMailId = ""

    }


    fun insertUpdateConnection(mail: String){

        viewModelScope.launch(Dispatchers.IO){

        Timber.i("Email binding : $_connectionMailId")

        var connection = Connection(mail)
        if (requireNotNull(_mails.value?.any { connection -> connection.mailId.equals(mail) })){
            update(connection)
        }else{
            insert(connection)
        }
    }

    }

我希望你能帮助非常感谢。

标签: kotlindata-bindingbindingviewmodelautocompletetextview

解决方案


尝试制作_connectionMailId类型的实时数据String

var _connectionMailId = MutableLiveData<String>()

另外,使用两种方式数据绑定:

android:text="@={connectionViewModel._connectionMailId}"

推荐阅读