0
votes

Le fournisseur de flutter ne répond pas aux notifications

J'ai une application qui permet aux utilisateurs d'afficher des données de jauge de rivières d'une API qui répertorie les rivières de l'ensemble des États-Unis. Les utilisateurs peuvent enregistrer des jauges comme favoris qui sont ensuite affichés dans une vue Favoris. Les favoris sont stockés dans les paramètres par défaut des utilisateurs par ID. La vue Favoris est peuplée via un modèle de vue Favoris qui est construit à l'aide des paramètres par défaut de l'utilisateur. Les favoris sont affichés dans une vue de liste et lorsque l'application est taraudée, l'application charge une vue de détails. Dans la vue Détails, l'utilisateur peut choisir de supprimer le favori. Lors de votre retour à la vue Favoris à l'aide du bouton arrière, la vue Favoris devrait refléter le changement, mais ce n'est pas le cas. J'utilise le fournisseur de flutter et ceci est ma première implémentation de celui-ci.

Je défini le fournisseur en Main puisque j'aurai besoin d'y accéder dans l'application. P>

var approveRemovalButton = FlatButton(
  child: Text('Remove',
    style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold, color: Colors.blue),
  ),
  onPressed: () {
      animationDuration = 0;
      favesVM.deleteFavorite(widget.gaugeId);
      Navigator.pop(context);
  },
);


2 commentaires

Pouvez-vous partager le code FavoritCard s'il vous plaît? J'ai besoin de vérifier comment DeleteFavorite est appelé


@ikerfah, merci! Ajout d'extraits d'où la fonction DELETE est appelée.


3 Réponses :


1
votes

Je pense que vous créez explicitement plusieurs fournies et que vous avez chargé des données dans un fournisseur et lorsque vous notifiez les modifications, le notificateur parent est notifié et les modifications ne se reflètent pas. Ne créez pas de distinct favorisviewModel comme vous devez utiliser le même objet. Vous avez déjà créé un objet dans runapp ()

Veuillez remplacer xxx

avec xxx


0 commentaires

2
votes

Votre problème que vous avez deux modèles de vue fonctionnant en même temps, permettez-moi d'expliquer comment:

en appelant FavorisviewModel ViewModel = FavorisViewModel (); // servicelocator (); Cela créera une instance à partir du modèle de vue.

et aussi en faisant ce xxx

Vous créez un autre modèle de vue

La partie délicate est donc la suivante: vous avez deux modèles de vue qui contiennent les mêmes données, Vous utilisez le modèle de vue du consommateur (pas du localisateur) pour afficher les données dans votre liste de liste, puis vous supprimez les données du localisateur, la suppression ne sera donc pas reflétée.

en tant que solution Vous pouvez envelopper votre FavoritCard par consommateur et utilisez modèle.deletefavorite ()


0 commentaires

1
votes

Mettez à jour votre Etat Code> Comme ci-dessous:

class _FavoritesView extends State<FavoritesView> {
  FavoritesViewModel viewModel; 

  @override
  void initState() {
    super.initState();
    viewModel = Provider.of<FavoritesViewModel>(context, listen: false);
    viewModel.loadFavorites();
  }

  @override
  Widget build(BuildContext context) {
    return Consumer<FavoritesViewModel>(
      builder: (context, model, child) => Scaffold(
        appBar: AppBar(
          title: Text('=Favorites='),
        ),
        body: ListView.builder(
          itemCount: model.favorites.length,
          itemBuilder: (context, index) {
            return FavoriteCard(model.favorites[index], Key(model.favorites[index]));
          },
        ),
      ),
    );
  }


0 commentaires