Construire une Future<List> à l'initialisation du State. (Provider ?)

Bonjour à tous,

Je bloque sur une étape de mon application et j’aurais besoin de votre aide.

Objectif : J’aimerais avoir une Future<List> lors de mon initState.

Problème : initState ne peut pas retourner un type Future et je ne peux pas utiliser un FutureBuilder() car je veux pouvoir sélectionner toute ou partie de ma liste avec des CheckBox. (avec le setState pour sélectionner ma CheckBox, mon build, et par conséquent, ma liste, se rechargerait à chaque fois que je coche une ligne. C’est pas ce qu’on veut pour l’optimisation :slight_smile: ).

J’ai vue que la meilleure solution serait d’utiliser un Provider. Mais j’ai du mal à le mettre en place…

Avez vous peut-être des solutions plus simple qu’un Provider ? Ou pouvez vous m’aider à comprendre les Provider ^^

Merci d’avance pour votre aide ! :grin:

Hello @AntoLhn,
Pour ma part, je ne gère plus de Future dans mes vues. C’est censé être ton Viewmodel qui récupère la data et ta vue ne fait que récupérer une List récupéré e depuis ton webservice.

Oui mais ca change rien au problème, nan ?

Car dans tout les cas, tu dois construire ta Future<List> à l’initalisation de ton State. Ca déplace juste le problème.

A moins que je me trompe ?! Aurais-tu un example dans ce cas, que je comprenne ta méthode.

Sur ma vue, j’ai une classe abstraite qui me sert d’interface avec mon viewmodel et je définis un getter pour récupérer ma liste.

abstract class IDiscoverViewModel extends ChangeNotifier {
  List<Fungus>? get fungusList;
}

class DiscoverView extends StatelessWidget {
  final IDiscoverViewModel _viewModel;
  const DiscoverView(this._viewModel, {Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Découvrir les champignons"),
      ),
      body: SafeArea(
        child: AnimatedBuilder(
            animation: _viewModel,
            builder: (context, child) {
              final fungusList = _viewModel.fungusList;

Sur mon viewmodel, j’ai encore une interface vers le router et mon getter qui est défini :

abstract class DiscoverRouter {
  fungusDetail({required int fungusId});
}

class DiscoverViewModel extends IDiscoverViewModel {
  final DiscoverRouter _router;
  final List<Fungus> _fungusList;

  DiscoverViewModel(this._router, this._fungusList);

  @override
  List<Fungus> get fungusList => _fungusList;

}

et dans mon router, au lancement de l’app, je déclenche l’appel à mon webservice :

@override
  Future<void> setNewRoutePath(NavigationPath configuration) async {
    final fungusId = configuration.fungusId;
    if (fungusId != null) {
      final fungus = await _fungusManager.getFungusDetail(fungusId: fungusId);
      if (fungus != null) {
        _fungus = fungus;
      }
    } else {
// Récupération de la liste
      _fungusList = await _fungusManager.getFungusDiscover();
    }
  }

Je ne sais pas si tu as visionné le cours sur le router / navigation 2.0 mais tu auras tous les détails pour gérer cette classe particulière.

3 « J'aime »

Ah d’accord je vois. Vraiment propres comme ça effectivement ! Je vais sûrement faire de cette manière.

Merci pour ton aide et ta solution ! :pray:t3:

C’est beau à voir :star_struck: Tu as parfaitement saisi la logique d’organisation @Tazooou ! Je ne sais pas pour toi, mais depuis que j’organise mon projet comme ça, tout me paraît simple à mettre en place

1 « J'aime »