Développement du viewModel et des Usecases
Objectifs
Créer notre viewModel pour le fragment quiz
Créer notre useCase qui récupérera les questions à afficher
Initialiser le recyclerView
Contexte :
Comme vu précédemment le rôle du viewModel est de faire appel aux useCase pour que ces dernières récupèrent les données dont on a besoin.
Fondamental :
Pour notre fragment « Quiz
» la seule tâche de notre viewModel sera de récupérer la liste de questions en base de données.
Pour cela notre ViewModel exécute une coroutines dans laquelle un useCase fait appel à questionRepository
qui nous renvoie la liste de questions.
Nous mettons une sécurité supplémentaire pour gérer la réussite ou l'échec de la requête de notre useCase qui, dans notre cas, sera une requête sur la base de données room, mais pourrait aussi être un appel à une librairie http comme retrofit pour récupérer des données sur une base de données externe.
Result :
![](../res/projet-kotlin-room-clean-ar-15.png)
La classe sealed Result
représente le statut de notre requête, elle comporte deux sous classes :
La requête peut être de type « Success
» et prendre en paramètre la valeur récupérée ; ou de type « Failure
» et comporter un « Throwable
» représentant l'erreur arrivée pendant la requête.
« T
» est un générique qui représente le type de la valeur à récupérer.
UseCase :
![](../res/projet-kotlin-room-clean-ar-16.png)
Notre useCase prend en paramètre le DAO pour pouvoir instancier notre repository, il implémente une interface « IFetchUseCase
» qui comporte une seul fonction « execute
» commune à tous nos useCase qui renvoie un objet de type « Result
».
On exécute ensuite la requête dans notre coroutines avec un try qui nous renvoie notre « Result.Sucess
» avec notre value en paramètre ou un « Result.Failure
» avec un throwable dans notre catch.
viewModel :
![](../res/projet-kotlin-room-clean-ar-17.png)
Le ViewModel fait appel à « execute
» de notre useCase, vérifie ensuite si le résultat est un succès puis envoie la « value
» de notre objet « Result
» dans une liveData qui déclenche automatiquement le refresh de notre recyclerview.