Utilisation de LiveData avec liaison de données
avec la stabilisation des composants de L'Architecture Android j'ai commencé à mettre à jour tous mesViewModel
s à la nouvelle implémentation deViewModel
. Dans ma compréhension, l'utilisation de LiveData
est recommandé de tenir l' Model
classe car il gère mieux le cycle de vie.
j'aime Data Binding
parce qu'il rend le code plus clair du côté de Java/Kotlin et qu'il n'est pas nécessaire de "regarder" les changements de valeur pour mettre à jour L'interface utilisateur. Mais la mise en page à l'aide de Data Binding
les données de watch ne changent que si le Model
(ou le ViewModel) s'étend BaseObservable
et LiveData
n'est pas. Je comprends l'un des principaux objectifs de LiveData
doit être observée et les mises à jour de l'INTERFACE utilisateur par programme, mais pour de simples mises à jour, Data Binding
est très utile.
Ce problème a déjà été signalé ( GitHub et Stack Overflow) et d'abord a été dit que la version 1.0 l'aurait Et maintenant est dit que cette fonctionnalité est en développement.
afin d'utiliser les deux LiveData
et Data Binding
, j'ai créé une implémentation très simple de la classe qui s'étend 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
}
}
Donc en gros, mon ObservableMutableLiveData
est une copie de ObservableField
en utilisant LiveData
pour stocker le modèle et avec cette implémentation, la mise en page se met à jour après chaque mise à jour du modèle.
Les questions sont:
- Est-ce une mauvaise mise en œuvre de
LiveData
? Est-ce que cet emballage "casse" le fonctionnalités deLiveData
, comme être conscient du cycle de vie? - Dans ma compréhension,
LiveData
est laObservableField
. Est-ce correct?
2 réponses
L'Android Studio 3.1 (actuellement en version Canary 6) corrigera ce problème, puisque LiveData
peut être utilisé comme observable field
:
Mises à jour de Liaison de Données:
vous pouvez maintenant utiliser un objet LiveData comme champ observable dans les expressions de liaison de données. La classe ViewDataBinding inclut maintenant une nouvelle méthode setLifecycle que vous devez utiliser pour observer les objets LiveData.
Source: Android Studio 3.1 Canary 6 est maintenant disponible
pour ceux qui sont tombés sur cette question à la recherche d'un exemple comme je l'ai fait, en voici un:
Dans la mise en page élément avec ce genre:
<layout>
<data>
<variable
name="myString"
type="android.arch.lifecycle.MutableLiveData<String>"/>
</data>
...
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text='@{myString}'
...
/>
...
</layout>
dans votre jeu de code c'est la valeur et le propriétaire du cycle de vie:
MutableLiveData<String> myString = new MutableLiveData<>();
...
binding.setLifecycleOwner(this);
binding.setMyString(myString);
voilà :)
Notez que la valeur par défaut de LiveData
null
donc assigner des valeurs initiales pour vous assurer d'obtenir l'effet désiré ou à utiliser appliquer la possibilité de valeur null.