Bonjour à tous et merci à @mbritto pour la qualité du contenu que tu proposes.
Contexte
J’ai suivi le cours sur l’architecture et la navigation pour Flutter et j’ai voulu mettre en pratique les concepts abordés dans mon app.
Rapidement, j’ai compris que j’allais devoir mettre en cache mes données récupérées du backend pour éviter les appels inutiles à l’API.
Pour cela j’ai créé une classe Repository
qui hérite de ChangeNotifier
et qui contient les données en cache, dans le but que mes viewModels puissent écouter les changements sur le cache et être notifiés lorsqu’une donnée fraîche arrive (pour ensuite mettre à jour les vues correspondantes).
Problème
Pour faire cela, j’appelle la méthode monRepository.addListener(maFonctionPourUpdateLaVue)
dans le constructeur de mon viewModel, et pour libérer les ressources une fois que la page est détruite j’ai overridé la fonction dispose()
de mon viewModel dans laquelle j’ai mis monRepository.removeListener(maFonctionPourUpdateLaVue)
.
Le souci c’est que je me suis aperçu que la fonction dispose()
n’est en fait jamais appelée, car visiblement ce n’est le cas que pour les classes héritant de StatefullWidgets. Cela semble vouloir dire que lorsqu’on fait _monViewModel = null;
dans le RouterDelegate
pour supprimer la vue (lorsqu’on revient en arrière par exemple), les ressources du viewModel ne sont pas libérées, est-ce que c’est correct ?
Solution envisagée
Pour résoudre ce problème j’envisage d’appeler manuellement la fonction .dispose()
de chaque viewModel dans mon RouterDelegate
avant chaque _monViewModel = null;
.
Cela me paraît un peu rébarbatif et si j’en oublie j’ai un risque de fuite mémoire. Connaissez-vous une meilleure solution ?
Merci d’avance pour votre aide