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 de LiveData, comme être conscient du cycle de vie?
  • Dans ma compréhension, LiveData est la ObservableField. Est-ce correct?
15
demandé sur Igor Escodro 2017-12-09 12:34:21

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

10
répondu Igor Escodro 2017-12-21 18:12:56

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&lt;String&gt;"/>
    </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 LiveDatanull donc assigner des valeurs initiales pour vous assurer d'obtenir l'effet désiré ou à utiliser appliquer la possibilité de valeur null.

6
répondu Sir Codesalot 2018-05-27 08:24:53