Hello les développeurs !
J’ai développé une app Flutter l’année dernière, puis je l’ai laissé de coté et j’ai perdu quelques notions depuis.
J’aimerai donc reprendre les choses en main et repartir sur de bonnes bases.
L’app que j’ai développé utilise déjà l’architecture MVVM avec le package « stacked » (stacked | Flutter Package), mais j’aimerai m’en libérer. J’ai donc regardé la formation PurpleGiraffe avec ViewModel qui m’a tout de suite parlé… Sauf pour un point.
Lorsqu’on navigue d’un écran vers un autre, je souhaite charger des infos complémentaires pour le nouvel écran.
Je ne souhaite pas le faire dans le routeur, car je ne souhaite pas bloquer la navigation. J’afficherai un chargement sur le nouvel écran pour les infos manquantes.
Hors MVVM, j’ai l’habitude de faire ça dans un initState
dans un StatefullWidget
.
En MVVM avec Stacked, j’avais la propriété onModelReady
pour appeler ma méthode init
dans mon ViewModel.
Mais ici, je ne sais pas trop comment faire
Voilà ce que j’ai tenté, qui fonctionne, sans savoir si c’est la bonne façon de faire (je vous ai dit j’ai perdu quelques notions !)
class HomeScreenViewModel extends ChangeNotifier {
bool _isLoading = true;
bool get isLoading => _isLoading;
HomeScreenViewModel() {
init();
}
init() async {
await Future.delayed(const Duration(seconds: 2));
_isLoading = false;
notifyListeners();
}
}
import 'package:flutter/material.dart';
import 'home_screen_viewmodel.dart';
class HomeScreen extends StatelessWidget {
final HomeScreenViewModel _viewModel;
const HomeScreen(this._viewModel, {super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Home'),
),
body: AnimatedBuilder(
animation: _viewModel,
builder: (context, child) {
return Center(
child: _viewModel.isLoading
? const CircularProgressIndicator()
: Text('Home Screen');
}),
);
}
}
L’autre solution qui me semble plus propre mais moins lisible est de passer par FutureBuilder
.
Sinon, il reste simplement à le convertir en StatefullWidget et le faire dans le initState.
Qu’en pensez-vous ?
Merci d’avance !