[学習](コンテキスト)方法のいくつかの重要な概念のフラッタ

フラッターで、私たちはしばしば、このようなコードを使用し

// 新しいページ開く
  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。

 

おすすめ

転載: www.cnblogs.com/lxlx1798/p/11102011.html