Po ustabilizowaniu składników architektury Android zacząłem aktualizować wszystkie moje podstawowe ViewModel
s do nowej implementacji ViewModel
. Rozumiem, że zaleca się używanie klasy LiveData
do przechowywania klasy Model
, ponieważ lepiej radzi sobie z cyklem życia.Korzystanie z LiveData z powiązaniem danych
Lubię używać Data Binding
, ponieważ powoduje to, że kod jest jaśniejszy po stronie Java/Kotlin i nie jest konieczne "oglądanie" zmian wartości w celu aktualizacji interfejsu użytkownika. Jednak układ przy użyciu Data Binding
obserwuje tylko zmiany danych, jeśli nie ma Model
(lub ViewModel) BaseObservable
i LiveData
. Rozumiem, że jednym z głównych celów LiveData
jest obserwowanie i aktualizowanie interfejsu użytkownika programowo, ale w przypadku prostych aktualizacji bardzo przydatne jest narzędzie Data Binding
.
Ten problem został już zgłoszony (GitHub i Stack Overflow) i po raz pierwszy powiedziano, że wersja 1.0 go posiada, a teraz mówi się, że ta funkcja jest w fazie rozwoju.
Aby korzystać zarówno LiveData
i Data Binding
, stworzyłem bardzo prostą implementację klasy, która rozciąga BaseObservable
:
import android.arch.lifecycle.LiveData
import android.arch.lifecycle.MutableLiveData
import android.databinding.BaseObservable
class ObservableMutableLiveData<T>() : BaseObservable() {
private var data: MutableLiveData<T> = MutableLiveData()
constructor(data: T) : this() {
this.data.value = data
}
public fun set(value: T) {
if (value != data.value) {
data.value = value
notifyChange()
}
}
public fun get(): T? {
return data.value
}
public fun getObservable(): LiveData<T> {
return data
}
}
Więc w zasadzie mój ObservableMutableLiveData
jest kopią ObservableField
użyciu LiveData
przechowywać modelu iz tego implementacja, aktualizacje układu po każdej aktualizacji modelu.
Pytania są:
- Czy to jest złe wdrożenie
LiveData
? Czy to opakowanie "łamie" funkcjonalnościLiveData
, takie jak świadomość cyklu życia? - W moim rozumieniu
LiveData
to nowyObservableField
. Czy to jest poprawne?