web-dev-qa-db-fra.com

Forcer Flutter à redessiner tous les widgets

Existe-t-il un moyen de forcer Flutter à redessiner tous les widgets (par exemple, après le changement de paramètres régionaux)?

12
DogeLion

Ce type de cas d'utilisation, dans lequel vous avez des données que les enfants peuvent lire mais que vous ne voulez pas explicitement transmettre aux données du constructeur avec les arguments du constructeur, appelle généralement une InheritedWidget. Flutter suivra automatiquement les widgets qui dépendent des données et reconstruira les parties de votre arbre qui ont été modifiées. Il existe un LocaleQuery widget conçu pour gérer les modifications de paramètres régionaux, et vous pouvez voir comment il est utilisé dans l'exemple d'application Stocks .

En bref, voici ce que fait Stocks:

  • Placez un rappel sur le widget racine (dans ce cas, StocksApp) pour gérer les modifications de paramètres régionaux. Ce rappel fonctionne, puis renvoie une instance personnalisée de LocaleQueryData
  • Enregistrez ce rappel en tant qu'argument onLocaleChanged du constructeur MaterialApp
  • Les widgets enfants qui ont besoin d'informations locales utilisent LocaleQuery.of(context).
  • Lorsque les paramètres régionaux changent, Flutter ne redessine que les widgets qui ont des dépendances sur les données de paramètres régionaux.

Si vous souhaitez suivre autre chose que les modifications de paramètres régionaux, vous pouvez créer votre propre classe qui étend InheritedWidget et l'inclure dans la hiérarchie à proximité de la racine de votre application. Son parent doit être une StatefulWidget avec la clé définie sur une GlobalKey accessible aux enfants. La State de la StatefulWidget doit posséder les données que vous voulez distribuer et exposer les méthodes permettant de la changer, appelant setState. Si les widgets enfants veulent modifier les données de la State, ils peuvent utiliser la clé globale pour obtenir un pointeur sur la State (key.currentState) et appeler des méthodes dessus. S'ils veulent lire les données, ils peuvent appeler la méthode statique of(context) de votre sous-classe InheritedWidget. Cela indiquera à Flutter que ces widgets doivent être reconstruits à chaque fois que votre State appelle setState.

15
Collin Jackson

Votre widget doit avoir une méthode setState (). Chaque fois que cette méthode est appelée, le widget est redessiné. 

Documentation: Widget setState ()

3
Alexi Coard

Ce qui pourrait fonctionner pour votre cas d'utilisation, c'est d'utiliser le navigateur pour recharger la page. Je le fais lors du basculement entre le mode "réel" et le mode "démo" dans mon application. Voici un exemple:

Navigator.of(context).Push(
    new MaterialPageRoute(
        builder: (BuildContext context){
          return new SplashPage();
        }
    )
);

Vous pouvez remplacer "new SplashPage ()" dans le code ci-dessus par le widget (ou l'écran) principal que vous souhaitez recharger. Ce code peut être appelé depuis n'importe quel endroit où vous avez accès à un BuildContext (qui correspond à la plupart des endroits dans l'interface utilisateur).

1
Platinumjam

J'explique comment créer un widget 'AppBuilder' personnalisé dans cet article.

https://hillelcoren.com/2018/08/15/flutter-how-to-rebuild-the-entire-app-to-change-the-theme-or-locale/

Vous pouvez utiliser le widget en enveloppant votre MaterialApp avec, par exemple:

Widget build(BuildContext context) {
  return AppBuilder(builder: (context) {
    return MaterialApp(
      ...
    );
  });
}

Vous pouvez indiquer à l'application de reconstruire en utilisant:

AppBuilder.of(context).rebuild();
0
Hillel Coren