Un widget avec état est défini comme tout widget qui change son état au cours de sa durée de vie. Mais c'est une pratique très courante pour un StatelessWidget
d'avoir un StatefulWidget
comme l'un de ses enfants. Ne StatelessWidget
devient- il pas stateful s'il a StatefulWidget
comme l'un de ses enfants?
J'ai essayé de consulter la documentation dans le cadre du code de StatelessWidget
, mais je StatelessWidget
n'ai pas pu comprendre comment un peut avoir Statefulwidget
pour enfants et rester StatelessWidget
.
Quelle est la relation et la différence entre les widgets avec état et sans état dans Flutter?
dart
flutter
statefulwidget
statelesswidget
utilisateur462455
la source
la source
InheritedWidget
; Ce qui peut faire laStatelessWidget
mise à jour.Réponses:
Un StatelessWidget ne sera jamais reconstruit par lui-même (mais peut à partir d'événements externes). Un StatefulWidget peut. Telle est la règle d'or.
MAIS tout type de widget peut être repeint à tout moment.
Stateless signifie seulement que toutes ses propriétés sont immuables et que la seule façon de les modifier est de créer une nouvelle instance de ce widget. Cela ne verrouille pas par exemple l'arborescence des widgets.
Mais vous ne devriez pas vous soucier du type de vos enfants. Cela n'a aucun impact sur vous.
la source
rebuild
etrepaint
StateFulWidget
s sont également immuables.StatefulWidget contre StatelessWidget.
StatelessWidget - Un widget qui ne nécessite pas d'état mutable.
class GreenFrog extends StatelessWidget { const GreenFrog({ Key key }) : super(key: key); @override Widget build(BuildContext context) { return Container(color: const Color(0xFF2DBD3A)); } }
StatefulWidget - Un widget dont l'état est modifiable.
Lorsque Flutter construit un
StatefulWidget
, il crée un objet State. Cet objet est l'endroit où tout l'état mutable de ce widget est conservé.Le concept d'État est défini par deux choses:
Cycle de vie StatefulWidget
Le cycle de vie comprend les étapes simplifiées suivantes:
createState()
.@override _MyState createState() => _MyState();
this.mounted
propriété booléenne . Cela devient vrai lorsque lebuildContext
est attribué. C'est une erreur d'appelersetState
lorsqu'un widget est démonté. Si cet objet State est actuellement dans une arborescence.bool get mounted => _element != null;
initState
est appelée une et une seule fois. Il doit appelersuper.initState().
@override initState() { super.initState(); // Add listeners to this class cartItemStream.listen((data) { _updateWidget(data); }); }
@protected @mustCallSuper void didChangeDependencies() { }
Le framework appelle cette méthode dans un certain nombre de situations différentes:
initState
.didUpdateWidget
.setState
.@override Widget build(BuildContext context, MyButtonState state) { ... () { print("color: $color"); } ... }
@mustCallSuper @protected void didUpdateWidget(covariant T oldWidget) { }
setState
:Ceci est rarement utilisé.
@protected @mustCallSuper void deactivate() { }
@protected @mustCallSuper void dispose() { assert(_debugLifecycleState == _StateLifecycle.ready); assert(() { _debugLifecycleState = _StateLifecycle.defunct; return true; }()); }
Pour plus d'informations, cliquez ici , ici
la source
À partir de la documentation sur flutter.io :
la source
Comme mentionné dans les documents Flutter
À quoi ça sert?
Certains widgets sont avec état et certains sont sans état. Si un widget change - l'utilisateur interagit avec lui, par exemple - il est avec état. L'état d'un widget se compose de valeurs qui peuvent changer, comme la valeur actuelle d'un curseur ou si une case est cochée. L'état d'un widget est stocké dans un objet State, séparant l'état du widget de son apparence. Lorsque l'état du widget change, l'objet d'état appelle setState (), indiquant au framework de redessiner le widget.
Un widget sans état n'a aucun état interne à gérer. Icon, IconButton et Text sont des exemples de widgets sans état, qui sous-classe StatelessWidget.
Un widget avec état est dynamique. L'utilisateur peut interagir avec un widget avec état (en tapant dans un formulaire ou en déplaçant un curseur, par exemple), ou il change avec le temps (peut-être qu'un flux de données entraîne la mise à jour de l'interface utilisateur). Checkbox, Radio, Slider, InkWell, Form et TextField sont des exemples de widgets avec état, qui sous-classe StatefulWidget.
https://flutter.io/tutorials/interactive/#stateful-stateless
la source
L'état est une information qui (1) peut être lue de manière synchrone lorsque le widget est construit et (2) peut changer pendant la durée de vie du widget. Il est de la responsabilité de l'implémenteur du widget de s'assurer que l'État est rapidement notifié lorsqu'un tel état change, en utilisant State.setState.
StatefulWidget :
Un widget avec état est un widget qui décrit une partie de l'interface utilisateur en créant une constellation d'autres widgets qui décrivent l'interface utilisateur plus concrètement. Le processus de construction se poursuit de manière récursive jusqu'à ce que la description de l'interface utilisateur soit entièrement concrète (par exemple, se compose entièrement de RenderObjectWidgets, qui décrivent des RenderObjects concrets).
Les widgets avec état sont utiles lorsque la partie de l'interface utilisateur que vous décrivez peut changer dynamiquement, par exemple en raison d'un état interne piloté par l'horloge ou en fonction d'un état du système. Pour les compositions qui dépendent uniquement des informations de configuration de l'objet lui-même et du BuildContext dans lequel le widget est gonflé, envisagez d'utiliser StatelessWidget.
Les instances StatefulWidget elles-mêmes sont immuables et stockent leur état mutable soit dans des objets State séparés créés par la méthode createState, soit dans des objets auxquels cet State souscrit, par exemple des objets Stream ou ChangeNotifier, auxquels les références sont stockées dans les champs finaux du StatefulWidget lui-même.
StatelessWidget :
Un widget sans état est un widget qui décrit une partie de l'interface utilisateur en créant une constellation d'autres widgets qui décrivent l'interface utilisateur plus concrètement. Le processus de construction se poursuit de manière récursive jusqu'à ce que la description de l'interface utilisateur soit entièrement concrète (par exemple, se compose entièrement de RenderObjectWidgets, qui décrivent des RenderObjects concrets).
Les widgets sans état sont utiles lorsque la partie de l'interface utilisateur que vous décrivez ne dépend de rien d'autre que des informations de configuration dans l'objet lui-même et du BuildContext dans lequel le widget est gonflé. Pour les compositions qui peuvent changer dynamiquement, par exemple en raison d'un état d'horloge interne, ou en fonction d'un état du système, envisagez d'utiliser StatefulWidget.
la source
Les widgets sans état sont des widgets statiques. Il vous suffit de passer quelques propriétés avant d'initialiser les widgets sans état. Ils ne dépendent d'aucun changement de données ni d'aucun changement de comportement. Par exemple. Text, Icon, RaisedButton sont des widgets sans état.
Les widgets avec état sont des widgets dynamiques, ils peuvent être mis à jour pendant l'exécution en fonction de l'action de l'utilisateur ou de la modification des données. Si un widget peut changer son état pendant l'exécution, il sera un widget avec état.
Modifier 15/11/2018
Les widgets sans état peuvent être rendus si les données d'entrée / externes ont été modifiées (les données externes étant des données transmises via le constructeur). Étant donné que les widgets sans état n'ont pas d'état, ils seront rendus une fois et ne seront pas mis à jour eux-mêmes, mais ne seront mis à jour que lorsque les données externes changeront.
Alors que les widgets avec état ont un état interne et peuvent être rendus si les données d'entrée changent ou si l'état du widget change.
Les widgets sans état et avec état ont un cycle de vie différent.
la source
Stateless
widget, nous pouvons également les modifier au moment de l'exécution, mais cela ne s'appelle pasStateful
widget (contrairement à votre dernière ligne).Je peux penser à une analogie très simple. Vous avez un meuble avec des livres, des décorations et une télévision. Le mobilier est apatride, il ne fait rien ne bouge pas. Sur le téléviseur, de l'autre côté, vous pouvez l'allumer, l'éteindre, changer de chaîne, lire un film s'il y a un DVD attaché, etc. Le téléviseur a un état interne qui affecte la façon dont il se comporte. Dans les meubles, vous n'avez aucun état. La présence du téléviseur dans le meuble n'y ajoute pas un état. J'espère que cela t'aides.
la source
Réponse à la question Stack Overflow - état vs apatridie .
Dans Flutter, la différence est que les widgets sans état peuvent être définis uniquement par tous les arguments du constructeur. Si vous créez deux widgets sans état en utilisant les mêmes arguments, ils seront identiques.
Un widget avec état, cependant, n'est pas nécessairement le même qu'un autre construit avec les mêmes arguments de constructeur. Cela pourrait être dans un état différent.
En fait, un widget avec état est lui-même immuable (sans état), mais Flutter gère un objet d' état séparé et l'associe au widget, comme expliqué dans la documentation StatefulWidget . Cela signifie que lorsque Flutter reconstruit un widget avec état, il vérifiera s'il doit réutiliser un objet d'état précédent et, si vous le souhaitez, attachera cet objet d'état au widget.
Le widget parent est sans état car il ne se soucie pas de l'état de son enfant. L'enfant avec état lui-même (ou techniquement Flutter) prendra soin de son propre état.
À un niveau élevé, je conviens que cela rend le widget parent avec état, car deux parents peuvent contenir deux enfants avec des états différents et donc être techniquement différents eux-mêmes. Mais du point de vue de Flutter, il construit le widget parent sans se soucier de l'état et ce n'est que lors de la construction que l'enfant considérera son état complet.
la source
Que sont les widgets avec état et sans état?
TL; DR: Un widget qui vous permet d'actualiser l'écran est un widget avec état. Un widget qui ne l'est pas est sans état.
Plus en détail, un widget dynamique dont le contenu peut changer doit être un widget avec état. Un widget sans état ne peut changer de contenu que lorsque les paramètres sont modifiés et doit donc être effectué au-dessus du point de son emplacement dans la hiérarchie des widgets. Un écran ou un widget contenant du contenu statique doit être un widget sans état, mais pour modifier le contenu, il doit être avec état.
J'ai trouvé ce contenu relatif sur une histoire médiatique intéressante. Vous êtes les bienvenus!
la source
Stateless : l'état du widget crée UNE SEULE FOIS, puis il peut mettre à jour les valeurs mais pas l'état explicitement. Cela ressort également clairement de leur structure. C'est pourquoi il n'a qu'une seule classe qui s'étend avec
StatelessWidget
. Donc, si je dis, ils ne peuvent plus jamais réexécuter labuild()
méthode.Avec état : les widgets peuvent mettre à jour leur état (localement) et leurs valeurs plusieurs fois lors du déclenchement d'un événement . C'est la raison pour laquelle la mise en œuvre est également différente. En cela, nous avons 2 classes, l'une est
StatefulWidget
et l'autre est son gestionnaire d'implémentation d'état, c'est-à-direState<YourWidget>
. Donc, si je dis, ils peuvent réexécuter labuild()
méthode encore et encore en fonction des événements déclenchés.Le diagramme ci-dessous vous aidera.
la source
Lorsque vous écrivez une application, vous créez généralement de nouveaux widgets qui sont des sous-classes de StatelessWidget ou StatefulWidget
Voici quelques différences entre
StatelessWidget
etStatefulWidget
widgets:Widget sans état:
Text
,Icon
,RaisedButton
sont Apatrides Widgets.Widget sans état:
Checkbox
,Radio Button
,Slider
sont Stateful Widgetsla source
Le widget sans état et avec état a son propre cycle de vie pour créer et mettre à jour l'interface utilisateur. Cependant, vous pouvez utiliser stateless ou statefull pour rendre l'interface utilisateur, mais pratiquement statefull est plus pratique lorsque l'interface utilisateur est totalement ou partiellement dépendante des données externes (comme - rendre une liste à l'aide de l'api) tout en utilisant un widget sans état pour rendre une interface utilisateur statique comme n'importe quel écran d'entrée est une bonne pratique.
la source
En termes simples:
Comme nous le savons, chaque widget est une vue dans le flottement. Qui a ses propres classes. Lorsque nous utilisons ces classes, nous en créons un objet. Nous donnons des valeurs à leurs différentes variables / propriétés. Ex. Nous créons un widget de texte afin de pouvoir lui donner une chaîne, une couleur, une taille de police, une famille de polices. Donc en donnant ceci, nous définissons ses propriétés lors de sa création. Jusqu'à présent, les widgets sans état ou avec état sont les mêmes mais,
Lorsque nous voulons changer / mettre à jour ses propriétés (disons String ou Color) encore et encore par la suite, alors il devrait être un widget avec état.
Et lorsque nous ne voulons pas modifier ses propriétés après avoir défini la première fois, il s'agit d'un widget sans état.
cela signifie que nous nous soucions des données que le widget contient / contrôle / affiche.
Donc Stateless est moins de données et Stateful est plein de données.
Maintenant, si vous définissez une classe qui est sans état, cela signifie que cette classe ne se soucie pas / contient des variables ou dit des données dans sa propre classe, c'est-à-dire au niveau de la classe, mais elle pourrait avoir un autre widget / classe en elle qui se soucie des données, c'est-à-dire qu'elle est avec état . Cela n'a donc aucun impact l'un sur l'autre.
Veuillez me corriger si je me trompe ici.
la source
Que sont les widgets avec état et sans état?
Widget sans état: les widgets sans état sont créés uniquement lorsqu'il s'agit de modifications parentes.
Widgets avec état: les widgets d'état complets contiennent l'état du widget et peuvent être reconstruits lorsque l'état change.
la source