3 votes

Comment "faire" quelque chose si le ChangeNotifier notifie avec le Provider Package (similaire au BlocListener) ?

Ce que je veux

J'ai un modèle simple. Le modèle s'étend de ChangeNotifier . Si le ChangeNotifier appelle notifyListeners() Je veux "faire" quelque chose comme afficher un SnackBar ou une boîte de dialogue. Je fournis au modèle l'élément Prestataire à mon arbre à widgets.

A quoi est-il comparable ?

J'ai utilisé le flutter_bloc paquet avant. Ce paquet propose BlocListener. Avec BlocListener, je peux "faire" quelque chose lors des changements d'état. Exemple de code :

BlocListener<BlocA, BlocAState>(
  listener: (context, state) {
    // do stuff here based on BlocA's state
  },
  child: Container(),
)

Dans l'exemple ci-dessus, l'enfant ne sera pas reconstruit mais je peux toujours faire quelque chose en fonction de l'état.

Existe-t-il quelque chose de comparable au package provider ? J'ai lu dans la documentation de ce paquet que ListenableProvider donnerait plus de liberté pour faire des choses comme des "animations". Mais je ne sais pas si je peux utiliser ce Provider d'une certaine manière pour montrer un snack sur une notification.

Editar: J'ai posé la question à Remi, l'auteur de Provider, sur Twitter. En peu de caractères, il m'a répondu que je pouvais utiliser didChangeDependencies pour ce comportement.

2voto

Dan Field Points 12945

Veuillez faire attention à l'utilisation didChangeDependencies pour cela. Il n'y a que quelques circonstances où didChangeDepdnencies peut être utilisé pour cela, et https://github.com/flutter/flutter/pull/49527 rendra la chose impossible, même dans ces cas-là.

Le problème de base est que didChangeDepdnencies est parfois (ou, après #49527, toujours) appelé à un point où l'arbre est verrouillé contre les changements d'état. Avant la pull request, il n'est sûr que sur les appels qui sont :

  • Pas la première fois (qui est appelée à partir d'une portée de construction).
  • Pas le moment où un élément est désactivé et éventuellement démonté, et ne se trouve donc plus à un endroit valide de l'arbre (cet appel n'aura plus lieu du tout après la demande de retrait).

Une façon plus sûre de le faire est :

@override
void didChangeDependencies() {
  super.didChangeDependencies();
  if (Provider.of(context).whatever == someCondition) {
    SchedulerBinding.instance.addPostFrameCallback(() {
      // show modal or dialog
    });
  }
}

Ce code est plus sûr à utiliser car il est garanti de s'exécuter à un moment où l'état peut être modifié en toute sécurité dans l'arbre, plutôt que de ne fonctionner que dans certains scénarios très spécifiques sans le rappel du cadre.

Il existe probablement des solutions plus élégantes que celle-ci (comme l'ajout d'un rappel directement sur les notifyListeners pour votre ChangeNotifier, en supposant qu'il ne se déclenche que lorsque l'arbre est dans un état mutable).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X