フラッターで、私たちはしばしば、このようなコードを使用し
// 新しいページ開く Navigator.of(コンテキスト).push // 引き出しのオープン足場 Scaffold.of(コンテキスト)を.openDrawer // DISPLAY1スタイルのテキストのテーマ取得 Theme.of(コンテキスト)を.textTheme.display1
さて、最後に(文脈)の、これはそれが何であるかです。私たちは、例えば、新しいナビゲーターページを開くためにここにいます。
静的のNavigatorState( BuildContextコンテキスト、{ BOOL rootNavigator = falseに、 BOOLのnullok = falseに、 }){ // クリティカルコード------------------------- V ---------------- 最終 NavigatorStateナビゲータ= rootNavigator context.rootAncestorStateOfType(?CONST TypeMatcher <NavigatorState> ()) :context.ancestorStateOfType(CONST TypeMatcher <NavigatorState> ()
); / / クリティカルコード^ ---------------------------------------- アサート((){ IF(ナビゲーター== nullを&&!nullOk){ スローFlutterError( 「ナビゲータが含まれていないコンテキストで要求ナビゲータの動作を\ N」 「ナビゲータからのルートをプッシュまたはポップするために使用されるコンテキストは」のでなければならない ナビゲータの子孫である「ウィジェットウィジェット「。 ); } を返す 真。 }())。 リターン・ナビゲータ; }
私たちは、アップcontext.rootAncestorStateOfTypeにより要素ツリーをトラバースキーコードのセクションを参照してください、そして、最も近いマッチNavigatorStateを見つけることができます。それは実際にコンポーネント間のデータパッケージを取得するコンテキストです。
操作の私達のナビゲーターは、完了することが分かっNavigatorStateを通じてプッシュすることです。
その、BuildContextコンポーネントオブジェクト間で取得するには多くの方法がありますだけでなく、
ancestorInheritedElementForWidgetOfExactType(タイプたtargetType)→InheritedElement ancestorRenderObjectOfType(TypeMatcherマッチャ)→RenderObject ancestorStateOfType(TypeMatcherマッチャ)→状態 ancestorWidgetOfExactType(タイプたtargetType)→ウィジェット findRenderObject()→RenderObject inheritFromElement(InheritedElement祖先、{オブジェクト態様})→InheritedWidget inheritFromWidgetOfExactType(タイプTargetTypeが、 InheritedWidget→{オブジェクト態様}) (状態→TypeMatcherマッチャ)rootAncestorStateOfType →visitAncestorElements(BOOLビジター(element要素))ボイド →visitChildElements(ElementVisitor訪問者)ボイド
initStateステージ状態におけるクロス成分データを取ることができない、ということに注意してください、これらの方法は唯一didChangeDependencies後に使用することができます。
問題を想起し
、我々は今、Navigatorは、この問題が含まれていない現在のコンテキストの前の出会いを見てすることは行うことは非常に単純ではありません。
クラス MyAppには、拡張StatelessWidget { @Overrideの ウィジェットビルド(BuildContextコンテキスト){ 返すMaterialApp( 足場(:家庭 体:センター( 子:FlatButton( onPressed:(){ Navigator.of(コンテキスト).push( MaterialPageRoute(ビルダー:(コンテキスト) => SecondPage())); }、 子供:テキスト( '跳转' )) ) ) )。 } }
私たちは、この文脈でのビルド機能でNavigator.of(コンテキスト)を使用すると、実際のMyAppでElementオブジェクトのうち、このウィジェット、および祖先ノード(MyAppの先祖ノード)がMaterialApp存在しないとき見上げるの方法を作成しています、それが提供する何のナビゲーターはありません。
私たちは別のウィジェットに足場パーツ分割を置くときに、我々は、ビルド機能でBuildContext FIRSTPAGEへのアクセスをFIRSTPAGE、その後、見上げると、MaterialAppを発見し、それが提供するナビゲーターを見つけたので、彼は幸せなページにジャンプすることができA。