Was ist der Unterschied zwischen didChangeDependencies und initState?

8

Ich bin neu im Flattern und wenn ich meinen Kontext in InitState aufrufen möchte, wird ein Fehler ausgegeben: Das ist ungefähr, BuildContext.inheritFromWidgetOfExactType aber dann verwende ich didChangeDependencies und es funktioniert korrekt.

jetzt habe ich 2 frage:

1-warum können wir unseren Kontext nicht in initState aufrufen, aber es gibt kein Problem für didChangeDependencies? (weil, wie ich im offiziellen Dokument gelesen habe This method is also called immediately after [initState], beide vor der Erstellungsmethode aufgerufen werden.)

2-warum haben wir Zugriff auf Kontext außerhalb der Build-Methode (weil wir dort haben build(BuildContext context)und unseren Kontext verwenden können, aber in didChangeDependencies haben wir nichts Vergleichbares didChangeDependencies(BuildContext context), von wo aus wir den Kontext aufrufen können, um ihn zu verwenden)?

mohammad
quelle

Antworten:

9

Der Kontext eines Zustands steht uns ab dem Moment zur Verfügung, in dem der Staat seine Abhängigkeiten lädt.

Zum Zeitpunkt des Aufrufs von build steht uns der Kontext zur Verfügung und wird als Argument übergeben.

Wenn Sie fortfahren, wird initstate aufgerufen, bevor der Status seine Abhängigkeiten lädt. Aus diesem Grund ist kein Kontext verfügbar, und Sie erhalten eine Fehlermeldung, wenn Sie den Kontext in initstate verwenden. DidChangeDependencies wird jedoch nur wenige Momente nach dem Laden der Abhängigkeiten aufgerufen, und der Kontext ist zu diesem Zeitpunkt verfügbar, sodass Sie hier den Kontext verwenden können.

Beide werden jedoch aufgerufen, bevor der Build aufgerufen wird. Der einzige Unterschied besteht darin, dass einer aufgerufen wird, bevor der Status seine Abhängigkeiten lädt, und der andere einige Momente, nachdem der Status seine Abhängigkeiten geladen hat.

Sanjay Singh
quelle
1
  1. Laut initStateDokumentation

Sie können BuildContext.inheritFromWidgetOfExactTypediese Methode nicht verwenden . Allerdings didChangeDependencieswird genannt nach dieser Methode sofort und BuildContext.inheritFromWidgetOfExactTypekann dort verwendet werden.

Sie müssen also die Verwendung BuildContext.inheritFromWidgetOfExactTypein didChangeDependencies.

  1. Jedes Widget hat sein eigenes context. Aus diesem Grund haben Sie Zugriff auf den Kontext außerhalb der Erstellungsmethode.

In Bezug auf build(BuildContext context), buildübernimmt Verfahren contextaus dem übergeordneten Widgets. Dies bedeutet, dass dieser Parameter BuildContext contextnicht der Kontext des aktuellen Widgets ist, sondern der Kontext des übergeordneten Widgets.

Marat
quelle
Danke, ich verstehe die zweite Antwort, aber nicht die erste, ich kenne dieses Verhalten, aber was ist der Grund?
Mohammed
didChangeDependencies wird unmittelbar nach initState aufgerufen, ok, aber warum können wir BuildContext.inheritFromWidgetOfExactType in initState nicht verwenden? (Ich bin aus
gutem
-2

Die Antwort ist hier

Diese Methode sollte nicht von Widget-Konstruktoren oder von State.initState-Methoden aufgerufen werden, da diese Methoden nicht erneut aufgerufen würden, wenn sich der geerbte Wert ändern würde. Um sicherzustellen, dass sich das Widget selbst korrekt aktualisiert, wenn sich der geerbte Wert ändert, rufen Sie dies (direkt oder indirekt) nur über Erstellungsmethoden, Layout- und Paint-Rückrufe oder über State.didChangeDependencies auf.

Marat
quelle