Warum ruft mein initState () keine Funktion auf, die sharedprefs verwendet, bevor das Widget erstellt wird?

Salat

In meiner Flatter-App versuche ich, einen einmaligen / ersten Bildschirm zu erstellen, in dem ein Tutorial angezeigt wird, wenn die App zum ersten Mal heruntergeladen wird. Ich habe mich für Shared Preferences entschieden, um die Daten zu speichern. Aber wenn ich die App starte , erhalte ich die Meldung " Fehlgeschlagen": Der boolesche Ausdruck darf nicht null sein : Dies liegt daran , dass die Variable _seen in meinem Code nicht initialisiert wurde. Als ich weiter nachschaute, stellte ich fest, dass mein Code die Variable nach ihrer Verwendung initialisiert ein Widget erstellen. Gibt es überhaupt eine Möglichkeit, dies zu beheben?

Mein Code

void main() => runApp(Start());

class Start extends StatefulWidget 
{
  @override
  App createState() => new App();
}

class App extends State<Start>
{
  bool _seen;

  @override
  void initState() 
  {
    print(1);
    _checkFirstTime();
    super.initState();
  }

  _checkFirstTime() async 
  {
    print(1.1);
    SharedPreferences prefs = await SharedPreferences.getInstance();  
    _seen = (prefs.getBool('seen') ?? false);
    print(1.2);
  }  

  _updateFirstTime() async
  {
    SharedPreferences prefs = await SharedPreferences.getInstance();  
    _seen = true;
    prefs.setBool('seen', true);
  }

  Widget build(BuildContext context) 
  {
    print(2);
    bool seen = _seen;  
    if (_seen == false) {_updateFirstTime();}
    print(2.1);
    return MaterialApp( 
      debugShowCheckedModeBanner: false,
      home: seen ? HomeScreen() : SignUpScreen(),
    );
  } 
}
shawnblais

Das eigentliche Problem hierbei ist, dass die SharedPreferences-API asynchron ist, sodass die build () -Methode erwartungsgemäß ausgelöst wird, bevor die Einstellungen geladen werden.

Es geht:

1. initState
2. _checkFirstTime (starts)
3. build 
4. _checkFirstTime (completes)

Es gibt viele Möglichkeiten, wie Sie das Problem beheben können. Sie können auf false initialisieren, einen FutureBuilder verwenden, ein _isInitComplete-Flag verwenden usw.

Eine einfache Lösung könnte darin bestehen, dies oben in Ihrem Build hinzuzufügen:

if(_seen == null) return Container();

Jetzt wird eine leere Ansicht für die 4 ms oder was auch immer angezeigt wird, bis die Einstellungen abgeschlossen sind. Dies entspricht funktional der Verwendung eines FutureBuilder. Vergessen Sie nicht, setState()am Ende anzurufen _checkFirstTime, um eine Aktualisierung auszulösen.

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

Warum ruft Unity object Destructor auf, bevor das Objekt erstellt wurde?

Warum wird die Rückgabe ausgeführt, bevor das Element erstellt wird und das console.log auf die richtige ID wartet und diese anzeigt?

Warum ruft mein kivy-Programm die Funktion nicht von einer anderen Klasse auf?

element.onclick ruft keine Funktion auf, wenn auf das Element geklickt wird

Flatter Stateful Widget, das auf mehreren Bildschirmen verwendet wird und neu erstellt wird

Warum wird mein Widget neu erstellt, wenn ich die Tastatur verwende?

Warum wird das Widget neu erstellt, wenn ich im zustandslosen Widget auf textField tippe?

Warum ruft die Funktion keinen Wert auf?

Warum ruft jest keine Funktion auf, die sich im useEffect-Hook befindet?

Warum wird die Funktion CreateWebHostBuilder () erstellt?

WPF: warum mein Combobox SelectionChanged-Ereignis ausgelöst wird, bevor mein Diagrammsteuerelement erstellt wurde

Wie übergebe ich ein Argument an ein zustandsbehaftetes Widget, wenn mein Widget die Zeichenfolgen-ID verwendet, auf die verwiesen wird?

Verweis auf die Zieldatei. Warum / Wie wird dies erstellt und verwendet?

Warum wird Typvariable verwendet; ruft nicht den Standardctor auf?

Warum ruft mein Controller eine andere API auf, wenn es keine Übereinstimmungs-API für die Anfrage gibt?

Warum ruft mein Listenelement Funktionen auf, die es nicht sollte?

Warten auf das Laden mehrerer iFrames, bevor die Funktion ausgeführt wird

Funktion wartet nicht auf das Ende der Bedingung, bevor die Schleife fortgesetzt wird

Warum muss ich zweimal auf die Schaltfläche klicken, bevor das Ereignis ausgelöst wird?

Warum ruft h: link value die Bean-Methode auf, wenn das Steuerelement nicht gerendert wird?

Warum wird mein Code mehrmals ausgeführt, bevor ich Daten in die Tabelle eingebe? Wie erstelle ich eine Aktionsschaltfläche, mit der eine Tabelle in der Benutzeroberfläche erstellt wird?

Warum werden die Zeitfunktion und print () ausgeführt, bevor das Etikett im Tkinter-Fenster erstellt wird?

Warum ruft ngClass die Funktion auf unbestimmte Zeit auf?

Konstruktor ruft eine Funktion auf, die den aktuellen Klassentyp verwendet

Warum ruft eine externe Funktion, die ein Klassenobjekt als Parameter verwendet, einen Bewegungskonstruktor auf, wenn sie dasselbe Objekt zurückgibt?

Die onClick-Funktion ruft keine Methode auf

Die Direktive anglejs ruft keine Controller-Funktion auf

onkeypress ruft keine Funktion auf

React ruft keine Funktion auf

TOP Liste

  1. 1

    So legen Sie mit dem Interface Builder unterschiedliche führende Speicherplätze für unterschiedliche Geräte fest

  2. 2

    Fügen Sie eine weitere Schaltfläche zu gwt Suggest Box hinzu

  3. 3

    Wie konvertiere ich einen Vektor von Bytes (u8) in eine Zeichenfolge?

  4. 4

    Wie kann ich in SCSS mehrere Klassen zu einer einzigen kombinieren?

  5. 5

    Wie konvertiert man einen Datenrahmen im langen Format in eine Liste mit einem geeigneten Format?

  6. 6

    Speichern Sie ein MPAndroidChart-Diagramm in einem Bild, ohne es in einer Aktivität anzuzeigen

  7. 7

    Gruppieren Sie Datenrahmenspalten nach ihrem Datum (die Spaltentitel enthalten) und fassen Sie die Instanzen von Einsen und Nullen in R . zusammen

  8. 8

    Tomcat - Leiten Sie den alten Kontextstamm zum neuen Kontextstamm um

  9. 9

    Eclipse Oxygen - Projekte verschwinden

  10. 10

    Wie wählt man Unterschiede mit drei Tabellen aus?

  11. 11

    Tic Tac Toe-Spiel im React-Reset-Button funktioniert nicht

  12. 12

    So berechnen Sie die Verfügbarkeit von Anwendungen (SLA)

  13. 13

    ElasticSearch BulkShardRequest ist aufgrund von org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor fehlgeschlagen

  14. 14

    Wie kann ich den Kaskadenmodus global einstellen?

  15. 15

    Python: Spalten mit demselben Namen zusammenführen, wobei der Mindestwert beibehalten wird

  16. 16

    So erhalten Sie eine gleichmäßige Höhe für alle Eingabefelder

  17. 17

    Wie erstelle ich einen neuen übergeordneten Knoten außerhalb der .ref (/ path) in der Firebase-Echtzeitdatenbank mithilfe von Cloud-Funktionen (Typescript)?

  18. 18

    Was ist schneller: SUM über NULL oder über 0?

  19. 19

    Wie kann ich eine verschachtelte Schleife mit lapply in R ersetzen?

  20. 20

    Kann ich ein Tkinter-Canvas erstellen, das mehrere Zeilen in einem Text-Widget umfasst?

  21. 21

    Ärgerliches Problem mit yaml, das ich nicht lösen kann

heißlabel

Archiv