of
メソッドはInheritedWidget
にアクセスするための慣習的な方法であり、多くの場面でInheritedWidget
を検索する目印や手がかりとして使われます。
以下のTheme、MediaQueryなどは、内部にInheritedWidgetに相当する機能を持っており、ofメソッドを利用してそのInheritedWidgetに格納されているデータにアクセスしています。
- Theme.of(context)
現在のテーマデータを取得します。 - MediaQuery.of(context)
メディアのクエリデータ(例:画面のサイズや向きなど)を取得します。 - Navigator.of(context)
ナビゲーションのスタックを操作するためのNavigator
を取得します。 - Scaffold.of(context)
現在のScaffold
ウィジェットにアクセスします。
これらのメソッドは、指定されたBuildContext
を起点にウィジェットツリーを遡り、該当するInheritedWidget
やその他の親ウィジェットにアクセスします。このof
メソッドを見ると、多くの場合で上位のウィジェットツリーから何らかの情報や機能を取得しようとしています。
Theme.of(context)
の場合、Theme
自体がInheritedWidget
を直接継承しているわけではありませんが、内部でInheritedTheme
というInheritedWidget
に相当する機能を使用して、テーマデータを子ウィジェットに渡します。
Theme
ウィジェットは、アプリケーションのテーマデータを保持し、子ウィジェットにそのテーマデータを提供する役割を持っています。実際には、Theme
ウィジェットの内部でInheritedTheme
という別のウィジェット(これがInheritedWidget
を継承しています)を使用して、テーマデータを子ウィジェットに渡す仕組みとなっています。
Theme.of(context)
を使用すると、このInheritedTheme
をウィジェットツリーで探し、テーマデータを取得します。これにより、アプリケーション全体で一貫したデザインや外観を実現することができます。
つまり、Theme.of(context)
は、暗黙的にInheritedTheme
(またはそれを継承する特定のInheritedWidget
)を背後で使用してテーマデータを取得しています。
MediaQuery
は、デバイスのメディアクエリ情報(画面サイズ、向き、明るさなど)を取得するためのウィジェットです。この情報は、レスポンシブなデザインを実装する際に非常に役立ちます。
MediaQuery.of(context)
を使用すると、現在のBuildContext
に関連する最も近いMediaQuery
データを取得することができます。これは、BuildContext
を起点として、ウィジェットツリーを遡りながら、最も近いMediaQuery
ウィジェットを探し、そのMediaQuery
ウィジェットが保持しているメディアクエリ情報を返します。
多くの場合、MaterialApp
やWidgetsApp
ウィジェットの中にMediaQuery
ウィジェットが自動的に組み込まれているため、ウィジェットツリーのどこからでもMediaQuery.of(context)
を使用してメディアクエリ情報にアクセスすることができます。
Navigator.of(context)
も同様の仕組みで動作します。具体的には、Navigator
はアプリケーションのルートナビゲーションスタックを管理するためのウィジェットであり、それ自体がInheritedWidget
を直接継承しているわけではありません。しかし、内部的にNavigator
はInheritedWidget
のメカニズムを利用して、子ウィジェットツリーにナビゲーションスタックへのアクセスを提供します。
Navigator.of(context)
を呼び出すと、現在のBuildContext
を起点にウィジェットツリーを遡りながら最も近いNavigator
ウィジェットを探します。そして、そのNavigator
ウィジェットが保持しているナビゲーションスタックにアクセスすることができます。
Flutterアプリのほとんどでは、MaterialApp
やCupertinoApp
の中にNavigator
ウィジェットが組み込まれており、これによって画面遷移や戻る動作などのナビゲーション操作が可能になります。Navigator.of(context)
を使用してこのナビゲーション機能にアクセスすることが一般的です。
Scaffold
はMaterial Designの基本的なビジュアルレイアウト構造を提供するウィジェットです。これにはアプリケーションバー、ドロワー、フローティングアクションボタン、ボトムシート、スナックバーなどの多くの基本的なUIコンポーネントが含まれます。
Scaffold.of(context)
は、指定されたBuildContext
に最も近いScaffold
ウィジェットを探して返します。これにより、子ウィジェットからScaffold
の機能、例えばスナックバーの表示など、を利用することができます。
実際の使い方としては、たとえばあるFlatButton
のonPressed
コールバック内でスナックバーを表示する場面などで使われます。このように、あるイベントが発生したときに、親のScaffold
に対して何らかの操作を行いたい場合に、Scaffold.of(context)
を利用してアクセスすることが一般的です。
DefaultTextStyle
はInheritedWidget
を利用しています。
DefaultTextStyle
は、Text
ウィジェットにデフォルトのスタイル(文字の色、フォント、サイズなど)を提供するウィジェットです。このウィジェットをツリーの任意の位置に配置することで、その下の子ウィジェットにデフォルトのテキストスタイルを提供することができます。
内部的に、DefaultTextStyle
はInheritedWidget
の仕組みを利用しています。これにより、子ウィジェットツリーのどこからでもそのデフォルトスタイルに効率的にアクセスすることができます。
具体的には、以下のようにしてDefaultTextStyle
の現在のスタイルを取得することができます。
TextStyle? style = DefaultTextStyle.of(context).style;
このように、DefaultTextStyle
を使うことで、複数のText
ウィジェットに一貫したスタイルを適用することが簡単になります。