Welche Beziehung besteht zwischen zustandsbehafteten und zustandslosen Widgets in Flutter?

96

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 StatelessWidgeta zu haben StatefulWidgetals eines ihrer Kinder. StatelessWidgetWird 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 StatelessWidgethaben kann Statefulwidgetals seine Kinder und noch bleiben StatelessWidget.

Wie ist die Beziehung und der Unterschied zwischen zustandsbehafteten und zustandslosen Widgets in Flutter?

user462455
quelle
2
Sie können Ihr Layout aus verschiedenen Arten von Widgets zusammenstellen. Dies bedeutet jedoch nicht, dass Sie die Eigenschaften der Komposition erben, die sich auf jedes Widget auswirken. Ich meine, Sie können einen Container ohne Status haben, der ein untergeordnetes Element eines anderen Containers hat, der an einer anderen Stelle als StatefulWidget deklariert ist. Der Status des Containers wirkt sich nur auf diese eine Komponente aus. Es geht also darum, eine Komposition aus verschiedenen Arten von Widgets zu haben, die jeweils so funktionieren, wie Sie sie benötigen.
Aziza
1
Um die Dinge noch mehr durcheinander zu bringen, gibt es eine dritte Art von Widget : InheritedWidget; Welches kann StatelessWidgetUpdate machen .
Rémi Rousselet

Antworten:

101

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.

Rémi Rousselet
quelle
10
(Relativ neu im Framework). Was ist der Unterschied zwischen rebuildundrepaint
user462455
Auch aus Kommentaren im Flatter-Framework-Code sind anscheinend auch StateFulWidgets unveränderlich.
user462455
3
Das Erstellen eines Widgets ist im Grunde ein Aufruf der "Build" -Methode, gefolgt vom Erstellen / Aktualisieren der entsprechenden Renderbox. Darauf folgt der Malprozess. Dadurch werden diese Renderboxen auf dem Bildschirm gedruckt.
Rémi Rousselet
Klassen, die "StatefulWidget" erben, sind unveränderlich. Der Staat (State <YourWidget>) selbst ist jedoch veränderlich.
Rémi Rousselet
Ich stelle fest, dass mein zustandsloses Widget neu erstellt wird, aber ich frage mich, ob es darauf zurückzuführen ist, dass es auf ein zustandsbehaftetes Widget verweist.
Ian
75

StatefulWidget vs StatelessWidget.

Geben Sie hier die Bildbeschreibung ein

StatelessWidget - Ein Widget, für das kein veränderbarer Status erforderlich ist.

  • 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 statelessWidget ist nützlich, wenn der von Ihnen beschriebene Teil der Benutzeroberfläche 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 Zustands oder abhängig von einem bestimmten Systemzustand, sollten Sie die Verwendung in Betracht ziehen StatefulWidget.

class GreenFrog extends StatelessWidget {
  const GreenFrog({ Key key }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(color: const Color(0xFF2DBD3A));
  }
}

StatefulWidget - Ein Widget mit veränderlichem Status.

  • Stateful-Widgets sind nützlich, wenn sich der von Ihnen beschriebene Teil der Benutzeroberfläche dynamisch ändern kann.

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:

1) Die vom Widget verwendeten Daten können sich ändern.

2) Die Daten können beim Erstellen des Widgets nicht synchron gelesen werden. (Alle Zustände müssen zum Zeitpunkt des Aufrufs der Erstellungsmethode festgelegt sein.)

StatefulWidget-Lebenszyklus

Der Lebenszyklus besteht aus folgenden vereinfachten Schritten:

  1. createState () - Wenn Flutter angewiesen wird, ein StatefulWidget zu erstellen, wird es sofort aufgerufencreateState() .
  • Erstellt den veränderlichen Status für dieses Widget an einer bestimmten Stelle im Baum.

  • Unterklassen sollten diese Methode überschreiben, um eine neu erstellte Instanz ihrer zugeordneten Statusunterklasse zurückzugeben:

@override
_MyState createState() => _MyState();
  1. mount == true - Alle Widgets haben eine bool- this.mountedEigenschaft. Es wird wahr, wenn das buildContextzugewiesen ist. Es ist ein Fehler beim Aufrufen, setStatewenn ein Widget nicht gemountet ist. Gibt an, ob sich dieses Statusobjekt derzeit in einem Baum befindet.
  • Nach dem Erstellen eines Statusobjekts und vor dem Aufrufen initState"mountet" das Framework das Statusobjekt, indem es mit a verknüpft wird
    BuildContext. Das State-Objekt bleibt bis zum Aufruf des Frameworks gemountet. Danach
    fordert dispose()das Framework das
    State-Objekt nie mehr auf, es erneut zu erstellen.

  • Es ist ein Fehler, setState aufzurufen, es sei denn, mount ist true.

bool get mounted => _element != null;
  1. initState () - Dies ist die erste Methode, die beim Erstellen des Widgets aufgerufen wird (natürlich nach dem Klassenkonstruktor).

initStatewird einmal und nur einmal aufgerufen. Es muss anrufensuper.initState().

  • Initialisieren Sie Daten, die auf dem spezifischen BuildContext für die erstellte Instanz des Widgets basieren.

  • Initialisieren Sie Eigenschaften, die auf diesen übergeordneten Widgets im Baum basieren.

  • Abonnieren Sie Streams ChangeNotifiersoder andere Objekte, die die Daten in diesem Widget ändern könnten.

@override
initState() {
  super.initState();
  // Add listeners to this class
  cartItemStream.listen((data) {
    _updateWidget(data);
  });
}
  1. didChangeDependencies () - Wird aufgerufen, wenn sich eine Abhängigkeit dieses Statusobjekts ändert.
  • Diese Methode wird auch unmittelbar danach aufgerufen initState. Es ist sicher, BuildContext.inheritFromWidgetOfExactTypevon dieser Methode aufzurufen .

  • Unterklassen überschreiben diese Methode selten, da das Framework Build immer nach Abhängigkeitsänderungen aufruft. Einige Unterklassen überschreiben diese Methode, da sie teure Arbeit (z. B. Netzwerkabrufe) ausführen müssen, wenn sich ihre Abhängigkeiten ändern, und diese Arbeit für jeden Build zu teuer wäre.

@protected
@mustCallSuper
void didChangeDependencies() { }
  1. build () - Beschreibt den Teil der Benutzeroberfläche, der vom Widget dargestellt wird.

Das Framework ruft diese Methode in verschiedenen Situationen auf:

  • Nach dem Anruf initState.
  • Nach dem Anruf didUpdateWidget.
  • Nach einem Anruf bei setState.
  • Nach einer Abhängigkeit dieses Status ändert sich das Objekt (z. B. ein InheritedWidget, auf das durch die vorherigen Build-Änderungen verwiesen wurde).
  • Nach dem Aufruf deaktivieren und dann das Statusobjekt an einer anderen Stelle wieder in den Baum einfügen.
  • Das Framework ersetzt den Teilbaum unter diesem Widget durch das von dieser Methode zurückgegebene Widget, indem entweder der vorhandene Teilbaum aktualisiert oder der Teilbaum entfernt und ein neuer Teilbaum aufgeblasen wird, je nachdem, ob das von dieser Methode zurückgegebene Widget den Stamm des vorhandenen Teilbaums aktualisieren kann , wie durch Anruf bestimmt Widget.canUpdate.

  • In der Regel geben Implementierungen eine neu erstellte Konstellation von Widgets zurück, die mit Informationen aus dem Konstruktor dieses Widgets, dem angegebenen BuildContext und dem internen Status dieses Statusobjekts konfiguriert sind .

@override
  Widget build(BuildContext context, MyButtonState state) {
    ... () { print("color: $color"); } ...
  }
  1. didUpdateWidget () - Wird aufgerufen, wenn sich die Widget-Konfiguration ändert.
  • Wenn das übergeordnete Widget neu erstellt wird und anfordert, dass dieser Speicherort in der Baumstruktur aktualisiert wird, um ein neues Widget mit demselben Laufzeittyp und demselben Widget.key anzuzeigen, aktualisiert das Framework die Widget-Eigenschaft dieses Statusobjekts, um auf das neue Widget zu verweisen, und ruft dies dann auf Methode mit dem vorherigen Widget als Argument.

  • Überschreiben Sie diese Methode, um zu reagieren, wenn sich das Widget ändert (z. B. um implizite Animationen zu starten).

  • Das Framework ruft Build nach dem Aufruf von didUpdateWidget immer auf. Dies bedeutet, dass alle Aufrufe von setState in didUpdateWidget redundant sind.

@mustCallSuper
@protected
void didUpdateWidget(covariant T oldWidget) { }
  1. setState () - Wenn Sie den internen Status eines Statusobjekts ändern, nehmen Sie die Änderung an einer Funktion vor, an die Sie übergeben setState:
  • Durch Aufrufen von setState wird das Framework benachrichtigt, dass sich der interne Status dieses Objekts so geändert hat, dass sich dies auf die Benutzeroberfläche in diesem Teilbaum auswirken kann. Dadurch plant das Framework einen Build für
    dieses Statusobjekt.

  • Wenn Sie den Status nur direkt ändern , ohne setState aufzurufen, plant das Framework möglicherweise keinen Build und die Benutzeroberfläche für diesen Teilbaum wird möglicherweise nicht aktualisiert, um den neuen Status widerzuspiegeln.

setState(() { _myState = newValue });
  1. disable () - Deaktivieren wird aufgerufen, wenn State aus dem Baum entfernt wird. Es kann jedoch erneut eingefügt werden, bevor der aktuelle Frame-Wechsel abgeschlossen ist. Diese Methode existiert im Wesentlichen, weil Statusobjekte von einem Punkt in einem Baum zu einem anderen verschoben werden können.
  • Das Framework ruft diese Methode immer dann auf, wenn es dieses Statusobjekt aus dem Baum entfernt. In einigen Fällen fügt das Framework das Statusobjekt erneut in einen anderen Teil des Baums ein (z. B. wenn der Teilbaum, der dieses Statusobjekt enthält, von einer Stelle im Baum an eine andere übertragen wird). In diesem Fall stellt das Framework sicher, dass es build aufruft, um dem State-Objekt die Möglichkeit zu geben, sich an seine neue Position im Baum anzupassen. Wenn das Framework diesen Teilbaum erneut einfügt, erfolgt dies vor dem Ende des Animationsrahmens, in dem der Teilbaum aus dem Baum entfernt wurde. Aus diesem Grund können Statusobjekte die Freigabe der meisten Ressourcen verschieben, bis das Framework ihre Entsorgungsmethode aufruft.

Dies wird selten verwendet.

@protected
@mustCallSuper
void deactivate() { }
  1. dispose () - Wird aufgerufen, wenn dieses Objekt dauerhaft aus dem Baum entfernt wird.
  • Das Framework ruft diese Methode auf, wenn dieses Statusobjekt nie wieder erstellt wird. Nach den Framework-Aufrufen dispose()wird das Statusobjekt als nicht bereitgestellt betrachtet und die bereitgestellte Eigenschaft ist falsch. Es ist ein Fehler, an dieser Stelle setState aufzurufen. Diese Phase des Lebenszyklus ist endständig: Es gibt keine Möglichkeit, ein entsorgtes Statusobjekt erneut bereitzustellen.

  • Unterklassen sollten diese Methode überschreiben, um alle von diesem Objekt beibehaltenen Ressourcen freizugeben (z. B. aktive Animationen zu stoppen).

@protected
@mustCallSuper
void dispose() {
  assert(_debugLifecycleState == _StateLifecycle.ready);
  assert(() { _debugLifecycleState = _StateLifecycle.defunct; return true; }());
}

Geben Sie hier die Bildbeschreibung ein

Weitere Informationen finden Sie hier hier , hier

Farhana
quelle
24

Aus der Dokumentation auf flutter.io :

... Das Wichtigste dabei ist, dass sich sowohl zustandslose als auch Stateful-Widgets im Kern gleich verhalten. Sie erstellen jeden Frame neu. Der Unterschied besteht darin, dass das StatefulWidget über ein State-Objekt verfügt, das Statusdaten über Frames hinweg speichert und wiederherstellt.

Wenn Sie Zweifel haben, denken Sie immer an diese Regel: Wenn sich ein Widget ändert (der Benutzer interagiert beispielsweise damit), ist es statusbehaftet. Wenn ein Kind jedoch auf Änderungen reagiert, kann das enthaltende übergeordnete Element weiterhin ein Widget ohne Status sein, wenn das übergeordnete Element nicht auf Änderungen reagiert.

Saeed Jassani
quelle
14

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

Ulearn
quelle
10

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.

Krunal
quelle
8

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.

Entwickeln
quelle
Selbst nachdem Statelesswir neue Daten von außerhalb an das Widget übergeben haben, können wir sie auch zur Laufzeit ändern, sie werden jedoch nicht als StatefulWidget bezeichnet (im Gegensatz zu Ihrer letzten Zeile).
CopsOnRoad
Können Sie bitte erklären, wie ein zustandsloses Widget "aktualisiert werden kann, wenn sich externe Daten ändern"? (Mit "externen Daten sind Daten, die durch den Konstruktor geleitet werden".) Wird der Konstruktor nicht nur einmal aufgerufen? Wie ändern sich die Daten, die durch den Konstruktor geleitet wurden?
user1596274
6

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.

J0hj0h
quelle
6

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.

Daniel Carrera
quelle
Dies beantwortet nicht die spezifische Frage des Fragestellers.
Jesaja,
Dies ist eine großartige Analogie!
William Terrill
4

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 StatefulWidgetund die andere ist der State Implementation Handler, dh State<YourWidget>. Wenn ich also sage, können sie erneut ausgeführt werdenbuild() Methode basierend auf ausgelösten Ereignissen immer wieder .

Das folgende Diagramm hilft.

Geben Sie hier die Bildbeschreibung ein

Rohit Mandiwal
quelle
4

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!

Winnie Nyambura
quelle
0

Haftungsausschluss: - hat letzte Woche angefangen, an Flattern zu arbeiten :)

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.

Avinash
quelle
0

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.

mewadaarvind
quelle
-1

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.

vivek s
quelle