ChangeNotifier, FutureBuilder, Animated Builder et listBuilder, fonctionnement aléatoire!

Bonjour,

Ayant pourtant bien revu le cours à ce sujet, je bloque depuis ce matin sur une question : dans une structure viewmodel (avec usecase) j’ajoute un item, mais ma liste n’est rafraîchie qu’une seule fois. Si j’ajoute un second item, rien ne se passe, un 3ème et j’ai 2 item d’un coup… Forcément, il y a quelque dans la logique des notifyListeners(); qui m’échappe…

Ainsi dans ma view :

Column(
              children: [
                SizedBox(
                  height: 500,
                  width: 400,
                  child: FutureBuilder<List<GameRoomModel>>(
                    initialData: [],
                    future: widget.viewModel.getAllRoom(),
                    builder: (context, snapshot) {
                      if (snapshot.hasError) {
                        return const Center(
                          child: Text("An error has occured"),
                        );
                      } else {
                        final data = snapshot.data;
                        Text(widget.viewModel.errorMessageList);
                        return AnimatedBuilder(
                            animation: widget.viewModel,
                            builder: (context, child) {
                              return Padding(
                                padding: const EdgeInsets.all(5),
                                child: ListView.builder(
                                    itemCount: data!.length,
                                    itemBuilder: (context, index) {
                                      return LineGameRoom(
                                        index: index,
                                        listGameroom: data,
                                        deleteRoom:
                                            widget.viewModel.deletingGameRoom,
                                        id: data.elementAt(index).id.toString(),
                                      );
                                    }),
                              );
                            });
                      }
                    },
                  ),
                ),
              ],
            ),

et dans mon viewModel :

@override
  newGameRoom(String ip, String numero) async {
    _active = false;
    print("state : ${_active.toString()}");
    int numeroInt = int.parse(numero);
    await _useCaseGameRoom.addNewGameRoom(ip, numeroInt);
    _active = true;
    print("state2 : ${_active.toString()}");
    notifyListeners();
  }


 @override
  Future<List<GameRoomModel>> getAllRoom() async {
    List<GameRoomModel> myList = await _useCaseGameRoom.getAllGameRoom();
    if (myList.isNotEmpty == true) {
      print("Affichage de la liste");
    } else {
      print("Une erreur est survenue");
    }
  }

Le problème est qu’en regardant les logs, l’affichage de la liste d’effectue avant la création du nouvel item, donc ce dernier l’apparait pas. Le problème est que mon notifyListeners(); est bien envoyé après et dans une fonction async.

Encore plus étrange, j’obtiens la même réaction sans aucun notifyListeners(); :roll_eyes:

Hello,

J’ai parcouru rapidement ton code mais tu essaies de mettre a jour ton Futur via le NotifyListener ?

Embrique ton futur dans un AnimatedBuilder, ça devrait mieux fonctionner

Effectivement, je l’ai précédemment fait, mais cela créait une boucle infinie… mais je l’ai replacé avant le Future, supprimé le notifyListeners(); de la fonction qui affiche la liste, et ajouté un bool qui gère les états = maintenant cela fonctionne.

Merci !