Passer le context d'une activité avec un ViewModel

Bonjour à tous,
J’essaie d’adapter l’application TVShow avec l’architecture ViewModel proposé dans le dernier cours. C’est donc mon ViewModel qui est chargé d’appeler le ShowManager qui lui va devoir lancer une requête via le provider et Volley.
Volley nécessite de lui passer le context lors de l’initialisation de la request queue :

private var requestQueue: RequestQueue = Volley.newRequestQueue(context)

J’ai donc remanié mon ViewModel pour qu’il puisse passer le context de mon Activité récupérée depuis le fragment. Mais j’obtiens une erreur de compilation qui me dit que mon ViewModel ne peut accepter aucun paramètre …

J’ai donc tenté de récupérer le context de l’application au moment de l’initialisation de ma request :

private var requestQueue: RequestQueue = Volley.newRequestQueue(MyApp()) et j’obtiens l’erreur suivante :
java.lang.NullPointerException: Attempt to invoke virtual method ‹ java.io.File android.content.Context.getCacheDir() › on a null object reference

J’ai l’impression que le context de l’application ne lui plait pas.
Quelqu’un a une idée pour résoudre mon problème ?

J’ai finalement trouvé un autre moyen en faisant hériter ma classe de AndroidViewModel qui nécessite le paramètre application :

class DiscoverViewModel (application: Application) :AndroidViewModel(application), TVShowsManager.Client {
private val showsManager: TVShowsManager = TVShowsManager(application)

Mon application remarche mais j’aimerais savoir si côté architecture cette manière est la plus propre ?

En règle générale, il vaut mieux utiliser le contexte à l’endroit où il est disponible plutôt que de le faire passer à un objet qui s’en servira plus tard.

Dans le cas de TVShows, je créerais le ShowsManager directement dans le Fragment, puis je le ferai passer au ViewModel. Tu peux créer le ViewModel avec des propriétés vides (de type ShowManager? par exemple) et juste après sa création lui envoyer le ShowsManager créé.

Correction effectuée :slight_smile: Tout fonctionne à merveille :slight_smile: Thank’s !!

1 J'aime