2017-06-27 1 views
5

Je vais avoir du mal à obtenir le composant ViewModel à travailler avec Proguard. J'avais déjà d'ajouter ce qui suit pour éviter un accident dû à NoSuchMethodException: init()architecture Android Composants - ViewModel Observable & Proguard

classe -keep com .... SlideshowViewModel {*;}

Cependant, mes observateurs de l'activité ne reçoivent pas des données Cela fonctionne bien jusqu'à ce que j'active Proguard, donc je sais que Proguard est la raison, je ne sais tout simplement pas pourquoi (novice Proguardian ici). Quelle règle dois-je ajouter pour que les observables fonctionnent?

je suit dans mon ViewModel (Kotlin)

val currentItem = MediatorLiveData<MediaItem>() 

.... plus tard ...

 Timber.d("Setting next image: " + position + " out of " + mediaItemList.size) 
     currentItem.value = mediaItemList[position] 

et l'activité (Java)

viewModel.getCurrentItem().observe(this, new Observer<MediaItem>() { 
     @Override 
     public void onChanged(@Nullable final MediaItem mediaItem) { 
      Timber.d("Activity received new item"); 
     } 
    }); 

En le journal que je reçois: D/SlideshowViewModel: Réglage image suivante: 0 sur 18

Mais rien get tiré dans le onChanged Observable.

Répondre

5

Je l'ai trouvé sur: https://issuetracker.google.com/issues/62113696

Il devrait être fixé rapidement si (pas encore alpha3)

## Android architecture components: Lifecycle 
# LifecycleObserver's empty constructor is considered to be unused by proguard 
-keepclassmembers class * implements android.arch.lifecycle.LifecycleObserver { 
    <init>(...); 
} 
# ViewModel's empty constructor is considered to be unused by proguard 
-keepclassmembers class * extends android.arch.lifecycle.ViewModel { 
    <init>(...); 
} 
# keep Lifecycle State and Event enums values 
-keepclassmembers class android.arch.lifecycle.Lifecycle$State { *; } 
-keepclassmembers class android.arch.lifecycle.Lifecycle$Event { *; } 
# keep methods annotated with @OnLifecycleEvent even if they seem to be unused 
# (Mostly for LiveData.LifecycleBoundObserver.onStateChange(), but who knows) 
-keepclassmembers class * { 
    @android.arch.lifecycle.OnLifecycleEvent *; 
}