9

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ści LiveData, takie jak świadomość cyklu życia?
  • W moim rozumieniu LiveData to nowy ObservableField. Czy to jest poprawne?

Odpowiedz

6

Android Studio 3.1 (obecnie w Canary 6), aby rozwiązać ten problem, ponieważ LiveData może być stosowany jako observable field:

aktualizacji danych Oprawa:

Można teraz użyć LiveData obiekt jako obserwowalne pole w wyrażeniach wiążących dane. Klasa ViewDataBinding zawiera teraz nową metodę setLifecycle, której należy użyć do obserwowania obiektów LiveData.

Źródło: Android Studio 3.1 Canary 6 is now available