didChangeDependenciesとinitStateの違いは何ですか?


10

私はひらひらしていて、InitStateでコンテキストを呼び出したいときにエラーがスローされます。これは問題です BuildContext.inheritFromWidgetOfExactType が、didChangeDependenciesを使用すると、正しく機能します。

今私は2つの質問があります:

1-initStateでコンテキストを呼び出せませんが、didChangeDependenciesには問題がないのはなぜですか?(私が公式のドキュメントThis method is also called immediately after [initState]で読んだように、ビルドメソッドの前に両方が呼び出されるためです。)

2-ビルドメソッドの外でコンテキストにアクセスできる理由(build(BuildContext context)コンテキストがあり、コンテキストを使用できるが、didChangeDependenciesにはのようなものがないdidChangeDependencies(BuildContext context)ため、コンテキストを呼び出して使用できるため)?

回答:


10

状態の依存関係が読み込まれた瞬間から、状態のコンテキストを利用できます。

buildが呼び出された時点で、コンテキストは利用可能であり、引数として渡されます。

次に進むと、状態がその依存関係をロードする前にinitstateが呼び出されます。そのため、コンテキストが利用できず、initstateでコンテキストを使用すると、エラーが発生します。ただし、didChangeDependenciesは、状態がその依存関係をロードした直後に呼び出され、コンテキストはこの時点で使用できるため、ここでコンテキストを使用できます。

ただし、ビルドが呼び出される前に両方とも呼び出されます。唯一の違いは、1つは状態が依存関係をロードする前に呼び出され、もう1つは状態が依存関係をロードした直後に呼び出されることです。


簡単な質問@SanjaySingh initStateは1回だけ呼び出されますが、didChangeDependenciesはどうなりますか?私がそれを使用するとき、私は連続ループに自分自身を見つけたので!回答ありがとうございます!
abrsh

@abrshちょっと見て、initstateは、最初にデータを初期化するときに一度だけ呼び出されます。initstateを何度も呼び出してデータを更新することはできません。コンテキストがないため、更新するデータ(つまり、再度初期化する)がわからないためです。したがって、この問題を削除するために、コンテキストがあり、どのデータを更新するかがわかっている依存関係を変更しました。したがって、はい、何度もdidchangedependenciesを呼び出してデータを更新/初期化できます
Sanjay Singh

1
  1. initStateドキュメントによると

BuildContext.inheritFromWidgetOfExactTypeこの方法からは使用できません。ただし、didChangeDependenciesこのメソッドの直後に呼び出さBuildContext.inheritFromWidgetOfExactTypeれ、そこで使用できます。

あなたが使用する必要がありますので、BuildContext.inheritFromWidgetOfExactTypeの中でdidChangeDependencies

  1. すべてのウィジェットには独自のウィジェットがありcontextます。そのため、ビルドメソッドの外部のコンテキストにアクセスできます。

に関してはbuild(BuildContext context)buildメソッドはcontext親ウィジェットから受け入れます。つまり、このパラメーターBuildContext contextは現在のウィジェットのコンテキストではなく、その親のコンテキストです。


ありがとう、私は2番目の答えを理解していますが、最初の答えはわかりません。この動作は知っていますが、理由は何ですか
モハマド

didChangeDependenciesはinitStateの直後に呼び出されますが、なぜinitStateでBuildContext.inheritFromWidgetOfExactTypeを使用できないのですか?(私は行動ではなく理由で熱心です)
モハマド

-2

答えはこちら

継承された値が変更された場合、これらのメソッドは再度呼び出されないため、このメソッドはウィジェットコンストラクターまたはState.initStateメソッドから呼び出さないでください。継承された値が変更されたときにウィジェットが正しく更新されるようにするには、ビルドメソッド、レイアウトおよびペイントコールバック、またはState.didChangeDependenciesからのみ(直接的または間接的に)これを呼び出します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.