Wann verwende ich setState in Flutter?

Lesezeit: 6 Minuten

Wann verwende ich setState in Flutter
Yeahia2508

Als Flatter-Neuling ist es für mich sehr verwirrend bei der Benutzung setState in Flutter Anwendung. Im folgenden Code boolean searching und Var resBody innen verwendet setState. Meine Frage ist nur warum searching und resBody innerhalb von setState? Warum nicht andere variabel?

var resBody;
bool searching =  false,api_no_limit = false;
String user = null;

Future _getUser(String text) async{
setState(() {
  searching = true;
});
user = text;
_textController.clear();
String url = "https://api.github.com/users/"+text;
  var res = await http
      .get(Uri.encodeFull(url), headers: {"Accept": 
           "application/json"});
  setState(() {
    resBody = json.decode(res.body);
  });
}

  • Es hängt davon ab, wo innerhalb oder außerhalb eines Widgets sich der Code befindet. Aus deiner Frage lässt sich das nicht ableiten.

    – Günter Zöchbauer

    11. Juli 2018 um 10:39 Uhr

  • eine gute Quelle, um sich über dieses Thema zu informieren?

    – Yeahia2508

    11. Juli 2018 um 10:40 Uhr

  • docs.flutter.io/flutter/widgets/State/setState.html, flutterbyexample.com/stateful-widget-lifecycle. Ich bin mir sicher, dass es mehrere Tutorials und YouTube-Videos gibt, aber ich habe keine Links zur Hand. ich fand youtube.com/watch?v=RS36gBEp8OI eine gute Einführung.

    – Günter Zöchbauer

    11. Juli 2018 um 10:44 Uhr


  • In einfachen Worten, wenn Sie den Wert der Variablen ändern. Es ist das grundlegendste.

    – goops17

    11. Juli 2018 um 16:04 Uhr

  • aber die Benutzervariable befindet sich nicht in setState, funktioniert aber immer noch in der App. Wie funktioniert es dann in StatefulWidget? @goops17

    – Yeahia2508

    11. Juli 2018 um 17:17 Uhr

Entsprechend der Dokumente:

Das Aufrufen von setState benachrichtigt das Framework, dass sich der interne Zustand dieses Objekts in einer Weise geändert hat, die sich auf die Benutzeroberfläche in diesem Teilbaum auswirken könnte, was dazu führt, dass das Framework einen Build für dieses State-Objekt plant.

Also wenn sich der Zustand des Widgets ändert Sie haben anrufen setState um einen Neuaufbau der Ansicht auszulösen und sofort die durch den neuen Zustand implizierten Änderungen zu sehen.

Wie auch immer, die folgenden Snippets sind gleichwertig.

erster Fall (direkt form flutter create <myproject>):

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {

    setState(() {
      // This call to setState tells the Flutter framework that something has
      // changed in this State, which causes it to rerun the build method below
      // so that the display can reflect the updated values. If we changed
      // _counter without calling setState(), then the build method would not be
      // called again, and so nothing would appear to happen.
      _counter++;
    });
  }

zweiter Fall:

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    _counter++;
    setState(() {});
  }

Was ich nicht weiß, ist der Grund, warum und ob der erste Fall die herkömmliche Art der Verwendung ist setStatewürde ich wegen der Lesbarkeit des Codes sagen.

  • Die Sache ist, dass viele Leute genau die gleiche Frage stellen, warum Der erste Ansatz ist die Konvention. Sagt der Doc “Im Allgemeinen wird empfohlen, dass die setState-Methode nur verwendet wird, um die tatsächlichen Änderungen des Zustands zu umschließen, nicht irgendwelche Berechnungen, die mit der Änderung verbunden sein könnten.” Aber was ist, wenn meine Änderung ein großes HD-Bild ist, das ich aus einer Base64-Zeichenfolge lese? Was stecke ich in die setState()wenn das Lesen und Konvertieren des Bildes vorher erfolgt ist?

    – Stapelbar

    11. Dezember 2019 um 10:46 Uhr

Wenn Sie den Zustand eines zustandsbehafteten Widgets ändern, verwenden Sie setState() um eine Neuerstellung des Widgets und seiner Nachkommen zu bewirken.
Sie brauchen nicht anzurufen setState() im Konstruktor bzw initState() des Widgets, weil build() wird sowieso danach gefahren.

Auch nicht anrufen setState() im synchronen Code nach innen build(). Sie sollten keine Wiederholung von veranlassen müssen build() von innen build().

  • Ich bin mir ziemlich sicher, dass seine Frage lautet: “Warum berechnen wir nicht alles im SetState-Callback?”

    – Rémi Rousselet

    11. Juli 2018 um 10:50 Uhr

Schaut man sich die Umsetzung an setState:

  void setState(VoidCallback fn) {
    assert(fn != null);
    assert(...);
    final dynamic result = fn() as dynamic;
    assert(...);
    _element.markNeedsBuild();
  }

Sie sehen, dass die einzigen Dinge, die es tut, sind: ein paar Dinge zu behaupten, die Ihnen helfen, eine falsche Verwendung zu debuggen, den Callback auszuführen und das Element zu markieren, damit es neu erstellt wird.

Technisch gesehen spielt es also keine Rolle, ob Sie einige Variablen innerhalb oder außerhalb des setState-Callbacks ändern, solange setState wird genannt.

Für die Lesbarkeit gibt es jedoch einen großen Unterschied. Das Neuerstellen von Widgets wirkt sich auf die Leistung der App aus, daher sollten Sie dies so wenig wie möglich tun. Alle und nur diese Änderungen an Variablen vornehmen, die eine Neuerstellung des Widgets innerhalb der erfordern setState Der Rückruf macht den Menschen (einschließlich Ihrem zukünftigen Ich) genau klar, warum ein Wiederaufbau erforderlich ist.

1647850991 229 Wann verwende ich setState in Flutter
Yogesh Bhanushali

Wenn Sie den Wert ändern müssen, wird ein beliebiges Widget auf dem Bildschirm angezeigt. In der App gab es zum Beispiel eine Aufgabe. Nach Abschluss dessen sollten die Punkte dem „Wallet“ hinzugefügt werden. Aber das Problem ist, dass wir die App aktualisieren müssen, um Punkte auf der “Brieftasche” zu sehen. Um dies zu lösen, verwenden wir Setstate() auf Button Onpressed()

Zum Beispiel:

RaisedButton(
 
 onpressed(){
    
   setstate(){
      
     points+10;

   }
 }

)

Jedes Mal, wenn die Schaltfläche gedrückt wird, wird das Widget mit dem neuen Wert aktualisiert, der von der „Wallet“-Variable zurückgegeben wird, ohne dass die gesamte App neu gestartet werden muss.

1647850992 850 Wann verwende ich setState in Flutter
Paresh Mangukiya

Entsprechend der Dokumentationen:

Generell wird empfohlen, die setState -Methode nur verwendet werden, um die tatsächlichen Änderungen des Zustands zu umschließen, keine Berechnungen, die mit der Änderung verbunden sein könnten. Hier zum Beispiel ein Wert, der von der verwendet wird
build Funktion wird inkrementiert, und dann wird die Änderung auf die Festplatte geschrieben, aber nur das Inkrement wird in die eingeschlossen setState:

Future<void> _incrementCounter() async {
  setState(() {
    _counter++;
  });
  Directory directory = await getApplicationDocumentsDirectory();
  final String dirName = directory.path;
  await File('$dir/counter.txt').writeAsString('$_counter');
}

  • hmm, aber ist das Inkrement von _counter++ keine Berechnung selbst?

    – Marc_L

    29. Dezember 2020 um 10:48 Uhr

Wann verwende ich setState in Flutter
iDecode

Wann immer Sie einen Widget-Baum aktualisieren möchten (im Allgemeinen mit einigen neuen Daten), rufen Sie an setState. Es kann nur in verwendet werden State Klasse. Hier ist die einfache Implementierung:

class _MyPageState extends State<MyPage> {
  int _count = 0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: RaisedButton(
          onPressed: () => setState(() => _count++),
          child: Text('Count = $_count'),
        ),
      ),
    );
  }
}

  • hmm, aber ist das Inkrement von _counter++ keine Berechnung selbst?

    – Marc_L

    29. Dezember 2020 um 10:48 Uhr

1647850994 426 Wann verwende ich setState in Flutter
Manas Mischra

setState() wird nur mit statefulWidget Insides Flattern verwendet. setState() Sagen Sie dem Flattern, dass er die Seite neu erstellen soll, wenn etwas darin definiert ist setState() Änderungen.

NICHT: setState() ist eine Callback-Funktion.

Text(questions[questionIndex])

Hier möchte ich den Text entsprechend dem angegebenen Fragen-Array ändern und bei jedem Klick auf die Schaltfläche den Index um 1 erhöhen.

void answerQuesion() {
    setState(() {
      questionIndex = questionIndex + 1;
    });
    print(questionIndex);
  }

Also muss ich dieses Indexinkrement in die einfügen setState()sodass Flatter die Seite nach jeder Änderung von questionIndex neu erstellt.

1005220cookie-checkWann verwende ich setState in Flutter?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy