Как связать MutableLiveData с помощью пользовательских объектов? - PullRequest
0 голосов
/ 27 января 2019

Значение MutableLiveData не заполняется, когда я пытаюсь использовать привязку данных, чтобы сделать это.

Когда я использую MutableLiveData в первичных объектах, таких как строки, он работает нормально.Но если я пытаюсь использовать пользовательский объект, значение MutableLiveData # становится равным нулю

class MyViewModel(application: Application) : AndroidViewModel(application) {

    val data: LiveData<Model> = MutableLiveData<Model>()

    fun save() {
        // ** ERROR HERE - At this point data.value is NULL
        data.value?.let { Repository().insert(it) }
    }
}

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:custom="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable
            name="viewModel"
            type="<my_path>.ViewModel" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <EditText
            android:id="@+id/text"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="parent"
            android:text="@={viewModel.data.name}"/>
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

@Entity
data class Model(
    @PrimaryKey(autoGenerate = true) var uid: Long? = -1,
    @ColumnInfo(name = "name") var name: String? = "",
    ...
)

class RegisterActivity : AppCompatActivity() {

    private val viewModel by lazy { MyViewModel(application) }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding: ActivityRegisterBinding = DataBindingUtil.setContentView(this, R.layout.activity_register)
        binding.viewModel = viewModel
        binding.executePendingBindings()
    }
}

Получение значения MutableLiveData # вMyViewModel # сохранить для сохранения данных, значение возвращает ноль.

1 Ответ

0 голосов
/ 27 января 2019

Я не думаю, что привязка данных может работать таким образом из коробки. Некоторые альтернативы:

  • Объявите LiveData для каждого поля и используйте MediatorLiveData, чтобы подписаться на них, чтобы обновить Model экземпляр
  • Объявите несколько полей Observable для хранения данных, сбора их и создания экземпляра Model в вашем save() методе
...