Ein statusbehaftetes Widget ist definiert als jedes Widget, das seinen Status innerhalb seiner Lebensdauer ändert. Aber es ist eine sehr gängige Praxis für eine StatelessWidget
a zu haben StatefulWidget
als eines ihrer Kinder. StatelessWidget
Wird nicht zustandsbehaftet, wenn es hatStatefulWidget
als eines seiner Kinder hat?
Ich habe versucht , Blick in die Dokumentation als Teil des Codes StatelessWidget
, aber kann nicht herausfinden , wie eine StatelessWidget
haben kann Statefulwidget
als seine Kinder und noch bleiben StatelessWidget
.
Wie ist die Beziehung und der Unterschied zwischen zustandsbehafteten und zustandslosen Widgets in Flutter?
dart
flutter
statefulwidget
statelesswidget
user462455
quelle
quelle
InheritedWidget
; Welches kannStatelessWidget
Update machen .Antworten:
Ein StatelessWidget wird nie wieder aufzubauen selbst (kann aber von externen Ereignissen eintreten). Ein StatefulWidget kann. Das ist die goldene Regel.
ABER jede Art von Widget kann jederzeit neu gestrichen werden.
Statuslos bedeutet nur, dass alle Eigenschaften unveränderlich sind und dass die einzige Möglichkeit, sie zu ändern, darin besteht, eine neue Instanz dieses Widgets zu erstellen. Der Widget-Baum wird beispielsweise nicht gesperrt.
Aber Sie sollten sich nicht darum kümmern, was für ein Typ Ihre Kinder sind. Es hat keine Auswirkungen auf Sie.
quelle
rebuild
undrepaint
StateFulWidget
s unveränderlich.StatefulWidget vs StatelessWidget.
StatelessWidget - Ein Widget, für das kein veränderbarer Status erforderlich ist.
StatefulWidget - Ein Widget mit veränderlichem Status.
Wenn Flutter a baut
StatefulWidget
, wird ein erstellt. In diesem Objekt befindet sich der gesamte veränderbare Status für dieses Widget.Der Begriff des Staates wird durch zwei Dinge definiert:
StatefulWidget-Lebenszyklus
Der Lebenszyklus besteht aus folgenden vereinfachten Schritten:
createState()
.this.mounted
Eigenschaft. Es wird wahr, wenn dasbuildContext
zugewiesen ist. Es ist ein Fehler beim Aufrufen,setState
wenn ein Widget nicht gemountet ist. Gibt an, ob sich dieses Statusobjekt derzeit in einem Baum befindet.initState
wird einmal und nur einmal aufgerufen. Es muss anrufensuper.initState().
Das Framework ruft diese Methode in verschiedenen Situationen auf:
initState
.didUpdateWidget
.setState
.setState
:Dies wird selten verwendet.
Weitere Informationen finden Sie hier hier , hier
quelle
Aus der Dokumentation auf flutter.io :
quelle
Wie in Flatterdokumenten erwähnt
Was ist der Punkt?
Einige Widgets sind zustandsbehaftet, andere zustandslos. Wenn sich ein Widget ändert - der Benutzer interagiert beispielsweise mit ihm -, ist es statusbehaftet. Der Status eines Widgets besteht aus Werten, die sich ändern können, z. B. der aktuelle Wert eines Schiebereglers oder ob ein Kontrollkästchen aktiviert ist. Der Status eines Widgets wird in einem Statusobjekt gespeichert, wodurch der Status des Widgets von seinem Erscheinungsbild getrennt wird. Wenn sich der Status des Widgets ändert, ruft das Statusobjekt setState () auf und weist das Framework an, das Widget neu zu zeichnen.
Ein zustandsloses Widget muss nicht intern verwaltet werden. Icon, IconButton und Text sind Beispiele für zustandslose Widgets, die in die Unterklasse StatelessWidget unterteilt sind.
Ein zustandsbehaftetes Widget ist dynamisch. Der Benutzer kann mit einem zustandsbehafteten Widget interagieren (z. B. durch Eingabe in ein Formular oder Verschieben eines Schiebereglers) oder es ändert sich im Laufe der Zeit (möglicherweise wird die Benutzeroberfläche durch einen Datenfeed aktualisiert). Checkbox, Radio, Slider, InkWell, Form und TextField sind Beispiele für Stateful-Widgets, die StatefulWidget unterordnen.
https://flutter.io/tutorials/interactive/#stateful-stateless
quelle
Der Status ist eine Information, die (1) beim Erstellen des Widgets synchron gelesen werden kann und (2) sich während der Lebensdauer des Widgets ändern kann. Es liegt in der Verantwortung des Widget-Implementierers, mithilfe von State.setState sicherzustellen, dass der Status umgehend benachrichtigt wird, wenn sich dieser Status ändert.
StatefulWidget :
Ein zustandsbehaftetes Widget ist ein Widget, das einen Teil der Benutzeroberfläche beschreibt, indem eine Konstellation anderer Widgets erstellt wird, die die Benutzeroberfläche konkreter beschreiben. Der Erstellungsprozess wird rekursiv fortgesetzt, bis die Beschreibung der Benutzeroberfläche vollständig konkret ist (z. B. vollständig aus RenderObjectWidgets besteht, die konkrete RenderObjects beschreiben).
Stateful Widget ist nützlich, wenn sich der von Ihnen beschriebene Teil der Benutzeroberfläche dynamisch ändern kann, z. B. aufgrund eines internen taktgesteuerten Status oder abhängig von einem bestimmten Systemstatus. Bei Kompositionen, die nur von den Konfigurationsinformationen im Objekt selbst und dem BuildContext abhängen, in dem das Widget aufgeblasen ist, sollten Sie StatelessWidget verwenden.
StatefulWidget-Instanzen selbst sind unveränderlich und speichern ihren veränderlichen Status entweder in separaten Statusobjekten, die von der createState-Methode erstellt werden, oder in Objekten, die dieser Status abonniert, z. B. Stream- oder ChangeNotifier-Objekte, auf die in endgültigen Feldern im StatefulWidget Verweise gespeichert werden selbst.
StatelessWidget :
Ein zustandsloses Widget ist ein Widget, das einen Teil der Benutzeroberfläche beschreibt, indem eine Konstellation anderer Widgets erstellt wird, die die Benutzeroberfläche konkreter beschreiben. Der Erstellungsprozess wird rekursiv fortgesetzt, bis die Beschreibung der Benutzeroberfläche vollständig konkret ist (z. B. vollständig aus RenderObjectWidgets besteht, die konkrete RenderObjects beschreiben).
Das zustandslose Widget ist nützlich, wenn der Teil der Benutzeroberfläche, den Sie beschreiben, nur von den Konfigurationsinformationen im Objekt selbst und dem BuildContext abhängt, in dem das Widget aufgeblasen ist. Bei Kompositionen, die sich dynamisch ändern können, z. B. aufgrund eines internen taktgesteuerten Status oder abhängig von einem bestimmten Systemstatus, sollten Sie StatefulWidget verwenden.
quelle
Statuslose Widgets sind statische Widgets. Sie müssen nur einige Eigenschaften übergeben, bevor Sie zustandslose Widgets initialisieren. Sie hängen nicht von Datenänderungen oder Verhaltensänderungen ab. Beispielsweise. Text, Symbol, RaisedButton sind zustandslose Widgets.
Stateful Widgets sind dynamische Widgets. Sie können zur Laufzeit basierend auf Benutzeraktionen oder Datenänderungen aktualisiert werden. Wenn ein Widget zur Laufzeit seinen Status ändern kann, handelt es sich um ein Stateful-Widget.
Bearbeiten 15/11/2018
Statuslose Widgets können erneut gerendert werden, wenn sich die Eingabe- / externen Daten geändert haben (externe Daten sind Daten, die durch den Konstruktor übertragen werden). Da zustandslose Widgets keinen Status haben, werden sie einmal gerendert und nicht selbst aktualisiert, sondern nur, wenn sich externe Daten ändern.
Wohingegen Stateful Widgets einen internen Status haben und erneut werden können, wenn sich die Eingabedaten ändern oder wenn sich der Status des ändert.
Sowohl zustandslose als auch zustandsbehaftete Widgets haben einen unterschiedlichen Lebenszyklus.
quelle
Stateless
wir neue Daten von außerhalb an das Widget übergeben haben, können wir sie auch zur Laufzeit ändern, sie werden jedoch nicht alsStateful
Widget bezeichnet (im Gegensatz zu Ihrer letzten Zeile).StackOverflow-Frage zu Statefulness vs Stateelessness .
In Flutter besteht der Unterschied darin, dass zustandslose Widgets nur durch alle Konstruktorargumente definiert werden können. Wenn Sie zwei zustandslose Widgets mit denselben Argumenten erstellen, sind diese identisch.
Ein Stateful-Widget ist jedoch nicht unbedingt dasselbe wie ein anderes, das mit denselben Konstruktorargumenten erstellt wurde. Es könnte in einem anderen Zustand sein.
Tatsächlich ist ein Stateful- Widget selbst unveränderlich (zustandslos), aber Flutter verwaltet ein separates State- Objekt und ordnet dieses dem Widget zu, wie im StatefulWidget-Dokument erläutert . Dies bedeutet, dass Flutter beim Neuerstellen eines statusbehafteten Widgets prüft, ob ein vorheriges Statusobjekt wiederverwendet werden soll, und dieses Statusobjekt bei Bedarf an das Widget anfügt.
Das übergeordnete Widget ist zustandslos, da es sich nicht um den Status seines Kindes kümmert. Das staatsbürgerliche Kind selbst (oder technisch gesehen Flattern) kümmert sich um seinen eigenen Zustand.
Auf hoher Ebene stimme ich zu, dass dies das übergeordnete Widget zustandsbehaftet macht, da zwei Elternteile möglicherweise zwei Kinder mit unterschiedlichen Zuständen enthalten und daher selbst technisch unterschiedlich sind. Aus der Sicht von Flutter wird jedoch das übergeordnete Widget erstellt, ohne sich um den Status zu kümmern, und nur beim Erstellen des Kindes wird dessen Status berücksichtigt.
quelle
Ich kann mir eine sehr einfache Analogie vorstellen. Sie haben ein Möbelstück mit Büchern, Dekorationen und einem Fernseher. Die Möbel sind staatenlos, es bewegt sich nichts nicht. Auf der anderen Seite des Fernsehgeräts können Sie es ein- und ausschalten, den Kanal wechseln, einen Film abspielen, wenn eine DVD angeschlossen ist usw. Das Fernsehgerät verfügt über einen internen Status, der sich auf das Verhalten auswirkt. In den Möbeln hast du keinen Zustand. Das Vorhandensein des Fernsehers in den Möbeln fügt ihm keinen Zustand hinzu. Hoffe das hilft.
quelle
Statuslos : Der Widget-Status wird NUR EINMAL erstellt, dann können Werte aktualisiert, der Status jedoch nicht explizit angegeben werden. Dies ergibt sich auch aus der Struktur. Deshalb gibt es nur eine Klasse, die sich mit erstreckt
StatelessWidget
. Wenn ich also sage, können sie nie wieder ausgeführt werdenbuild()
Methode .Stateful : Widgets können ihren STATE (lokal) und ihre Werte bei einem ausgelösten Ereignis mehrmals aktualisieren . Das ist der Grund, die Implementierung ist auch anders. In diesem Fall haben wir zwei Klassen, eine ist
StatefulWidget
und die andere ist der State Implementation Handler, dhState<YourWidget>
. Wenn ich also sage, können sie erneut ausgeführt werdenbuild()
Methode basierend auf ausgelösten Ereignissen immer wieder .Das folgende Diagramm hilft.
quelle
Was sind Stateful- und Stateless-Widgets?
TL; DR: Ein Widget, mit dem Sie den Bildschirm aktualisieren können, ist ein Stateful-Widget. Ein Widget, das dies nicht tut, ist zustandslos.
Im Einzelnen sollte ein dynamisches Widget mit Inhalten, die sich ändern können, ein Stateful-Widget sein. Ein zustandsloses Widget kann den Inhalt nur ändern, wenn die Parameter geändert werden, und muss daher über dem Punkt seiner Position in der Widget-Hierarchie erfolgen. Ein Bildschirm oder Widget mit statischem Inhalt sollte ein zustandsloses Widget sein. Um den Inhalt zu ändern, muss er jedoch statusbehaftet sein.
Ich fand diesen relativen Inhalt in einer interessanten mittleren Geschichte. Bitte!
quelle
Das zustandslose und zustandsbehaftete Widget verfügt über einen eigenen Lebenszyklus zum Erstellen und Aktualisieren der Benutzeroberfläche. Sie können jedoch entweder zustandslos oder statusbehaftet verwenden, um die Benutzeroberfläche zu rendern. Praktisch zustandslos sind jedoch praktischer, wenn die Benutzeroberfläche ganz oder teilweise von den externen Daten abhängig ist (z. B. Rendern einer Liste mit API), während Sie mit dem Widget statefull statische Benutzeroberfläche wie bei jedem Eingabebildschirm rendern eine gute Praxis.
quelle
Was sind Stateful- und Stateless-Widgets?
Statusloses Widget: Statusloses Widget wird nur erstellt, wenn es sich um übergeordnete Änderungen handelt.
Stateful Widgets: State Full Widgets enthalten den Status des Widgets und können neu erstellt werden, wenn sich der Status ändert.
quelle
In einfachen Worten:
Wie wir wissen, ist jedes Widget eine Ansicht im Flattern. Welches hat seine eigenen Klassen. Wenn wir diese Klassen verwenden, erstellen wir ein Objekt davon. Wir geben ihren verschiedenen Variablen / Eigenschaften Werte. Ex. Wir erstellen ein Text-Widget, damit wir ihm Zeichenfolge, Farbe, Schriftgröße und Schriftfamilie geben können. Indem wir dies angeben, definieren wir seine Eigenschaften, während wir es erstellen. Bis zu diesem Punkt sind zustandslose oder zustandsbehaftete Widgets identisch, jedoch
Wenn wir danach seine Eigenschaften (sagen wir String oder Farbe) immer wieder ändern / aktualisieren möchten, sollte es ein Stateful-Widget sein.
Und wenn wir seine Eigenschaften nach dem ersten Definieren nicht ändern möchten, handelt es sich um ein zustandsloses Widget.
Das heißt, wir kümmern uns um Daten, die das Widget enthält / kontrolliert / anzeigt.
Stateless ist also datenlos und Stateful ist datenreich.
Wenn Sie nun eine Klasse definieren, die zustandslos ist, bedeutet dies, dass diese Klasse sich nicht um Variablen kümmert oder Daten in ihrer eigenen Klasse, dh Klassenebene, sagt, aber sie könnte ein anderes Widget / eine andere Klasse enthalten, die sich um Daten kümmert, dh Stateful ist . Es hat also keine Auswirkungen aufeinander.
Bitte korrigieren Sie mich, wenn ich hier falsch liege.
quelle