MaterialAppはFlutterのルートウィジェットで、アプリケーション全体にMaterial Designを設定します。ルーティング、テーマ設定、ローカライゼーション、ナビゲーションの集中設定を提供し、Widget TreeにNavigator、Theme、MediaQueryなどのコンポーネントを自動的に追加します。Flutter APIリファレンス(2025年)によると、MaterialAppはMaterial Designを使用するFlutterアプリケーションに必須のウィジェットであり、ウィジェットツリー全体で利用可能なグローバル設定を定義します。
重要ポイント
MaterialAppはFlutterアプリケーションでMaterial Designを初期化するラッパーウィジェットです。Widget Treeのルートとなり、子ウィジェットにシステムサービス(ナビゲーション、テーマ、メディアクエリ、ローカライゼーション)へのアクセスを提供します。MaterialAppがないと、アプリケーションは標準のMaterialスタイルを持たず、Scaffold、AppBar、FloatingActionButton、BottomNavigationBarなどのウィジェットを使用できません。
MaterialAppを使用すると、Flutterは自動的にツリーのルートにいくつかの主要なウィジェットを追加します:Navigator(ナビゲーション用の画面スタック)、Theme(カラースキームとスタイル)、MediaQuery(デバイス情報)、Localizations(ローカライズされた文字列)、Directionality(テキストの方向)。これらのウィジェットはInheritedWidgetとして実装され、アプリケーションのどこからでもBuildContextを介してアクセスできます。
MaterialAppの最小構成にはhomeパラメータのみが必要です — メイン画面に表示されるウィジェットです。FlutterはWidgetsBindingメカニズムを通じて、homeが既にScaffoldでない場合、自動的にScaffoldでラップします。runApp(MaterialApp(home: MyHomePage()))でアプリケーションを起動すると、FlutterはMaterialAppをルートとするルートWidget Treeを作成します。
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: "My Application",
theme: ThemeData(
primarySwatch: Colors.blue,
fontFamily: "Roboto",
),
darkTheme: ThemeData(
brightness: Brightness.dark,
primarySwatch: Colors.blue,
),
home: const MyHomePage(),
);
}
}
この例では、MaterialAppが基本テーマ(ライトとダーク)、タイトル、メイン画面を設定しています。titleパラメータはウィンドウタイトル(デスクトップ)とアクセシビリティに使用されます。themeとdarkThemeパラメータは異なるモードでのアプリケーションの外観を定義します。
MaterialAppは30以上のパラメータを受け入れ、これらはMaterial Design設定、ルーティング、テーマ設定、ローカライゼーション、エラー動作、プラットフォーム固有の設定に分類されます。主要なパラメータを理解することで、追加コードを書かずにアプリケーションを柔軟に設定できます。
titleパラメータは、ウィンドウタイトルとアクセシビリティのためのアプリケーション名を設定します。colorはAndroidのタスクスイッチャー用のアプリケーションカラーを定義します。debugShowCheckedModeBannerはリリースビルドでデバッグモードバナーを非表示にします。showPerformanceOverlayはパフォーマンス情報のオーバーレイを有効にします。supportDarkThemeはアプリケーションがダークテーマをサポートするかどうかを示します。
MaterialAppは異なるプラットフォームでの動作を設定するパラメータを提供します:restorationScopeId(Androidでの再起動時にアプリケーション状態を保存)、scrollBehavior(異なるOSでのスクロール動作の設定)、useMaterial3(Material 3(Material You)の有効化)。Material 3は動的色、新しいコンポーネント、更新されたスタイルを追加します。
| パラメータ | 型 | 目的 |
|---|---|---|
| title | String | アプリケーションウィンドウのタイトル |
| theme | ThemeData | ライトテーマの設定 |
| darkTheme | ThemeData | ダークテーマの設定 |
| home | Widget | アプリケーションのメイン画面 |
| routes | Map<String, WidgetBuilder> | 名前付きルートのマップ |
| locale | Locale | アプリケーションの強制ロケール |
テーマ設定はMaterialAppの主要パラメータの1つです。themeパラメータはThemeDataオブジェクトを受け入れ、ライトテーマのカラーパレット、タイポグラフィ、コンポーネントの形状、アイコンを定義します。darkThemeパラメータはダークテーマの同等の設定です。Flutterはデバイスのシステム設定に基づいて自動的にテーマを切り替えます。
ThemeDataにはprimarySwatch(メインカラー)、colorScheme(拡張Material 3カラースキーム)、brightness(ライトまたはダーク)、fontFamily(デフォルトフォント)、textTheme(テキストスタイル)、cardTheme、appBarTheme、buttonThemeなど、特定のコンポーネントをカスタマイズするための多数のパラメータが含まれます。Material 3にはcolorSchemeを、Material 2にはprimarySwatchを使用します。
Material 3(Material You)はAndroid 12+でデバイスの壁紙から抽出される動的色をサポートしています。有効にするには、useMaterial3: trueを設定し、colorScheme.fromSeedまたはcolorScheme.fromImageProviderを使用します。動的色は自動的にprimary、secondary、tertiary、neutral、neutralVariantの5トーンの調和のとれたパレットを生成します。
任意のウィジェットはTheme.of(context)を介して現在のテーマにアクセスできます。Theme.ofはThemeDataオブジェクトを返し、colors、textThemeなどのパラメータを取得できます。テーマの変更(ライトモードとダークモードの切り替えなど)を購読するには、buildメソッド内でコンテキストを使用します — Flutterはテーマが変更されると自動的にウィジェットを再構築します。
Container(
color: Theme.of(context).colorScheme.primary,
child: Text(
"Themed text example",
style: Theme.of(context).textTheme.headlineMedium,
),
)
この例では、Theme.of(context)が最も近いMaterialAppから現在のテーマを取得します。背景色とテキストスタイルは自動的に現在のテーマ(ライトまたはダーク)に一致します。テーマが切り替わると、ContainerとTextは更新されたThemeDataの新しい値で再構築されます。
MaterialAppはNavigatorを統合しています — 画面間の遷移を管理するスタックベースのナビゲーターです。initialRoute、routes、onGenerateRouteパラメータはFlutterがナビゲーションを処理する方法を決定します。Navigator.pushとNavigator.pushReplacementはプログラムで画面を切り替え、Navigator.popは戻ることを可能にします。
routesパラメータはMap<String, WidgetBuilder>を受け入れます。キーはルート名(文字列)、値はその画面のウィジェットを作成する関数です。名前付きルートは静的ナビゲーションに便利です:'/'(ルートルート)は通常homeに対応し、'/settings'、'/profile'は他の画面です。Navigator.pushNamed(context, '/settings')で設定画面に移動します。
onGenerateRouteはroutesにルートが見つからない場合に呼び出される関数です。RouteSettingsを受け入れ、MaterialPageRouteを返します。このアプローチはルートがデータに依存する動的ナビゲーション(例:/user/42)に役立ちます。onGenerateRouteはルート名を解析し、パラメータを抽出して適切な画面を作成します。
ディープリンクをサポートするには、onGenerateInitialRouteとonGenerateRouteパラメータを一緒に使用します。ディープリンクを使用すると、URL(例:https://example.com/promo)を介してアプリケーションの特定の画面を開くことができます。FlutterはAndroid(intent filters経由)とiOS(universal links経由)でディープリンクを処理し、パスをonGenerateRouteに渡します。
MaterialApp(
initialRoute: "/",
routes: {
"/": (context) => const HomePage(),
"/settings": (context) => const SettingsPage(),
},
onGenerateRoute: (settings) {
if (settings.name?.startsWith("/user/") == true) {
final userId = settings.name!.split("/").last;
return MaterialPageRoute(
builder: (_) => UserPage(userId: userId),
);
}
return null;
},
)
この例では、onGenerateRouteが/user/42のような動的ルートを処理します。ルートが静的なroutesに見つからず、動的パターンにも一致しない場合、Flutterはエラーページを表示します。これはonUnknownRouteでカスタマイズできます。
MaterialAppはlocalizationsDelegatesとsupportedLocalesパラメータを通じて、組み込みのローカライゼーションサポートを提供します。LocalizationsDelegatesはローカライズされた文字列をロードし、supportedLocalesはアプリケーションがサポートする言語を決定します。Flutterはデバイスの言語を自動的に検出し、対応するローカライズされたリソースをロードします。
supportedLocalesパラメータはアプリケーションがサポートするLocaleのリストを受け入れます:[const Locale('en'), const Locale('ru'), const Locale('de')]。localizationsDelegatesはローカライズされた文字列をロードするデリゲートのリストです。Material Designには、GlobalMaterialLocalizations.delegate、GlobalWidgetsLocalizations.delegate、GlobalCupertinoLocalizations.delegateを追加します。
独自の文字列をローカライズするには、flutter_localizationsまたはintlパッケージを介して作成されたAppLocalizationsクラスを使用します。AppLocalizationsはローカライズされた文字列にアクセスするための静的メソッドを提供します:AppLocalizations.of(context)!.helloMessage。MaterialAppは自動的にLocalizationsをWidget Treeに渡し、コンテキストを介してアクセス可能にします。
Flutterは異なるプラットフォーム向けに3つのルートウィジェットを提供しています:MaterialApp(Androidとウェブ向けMaterial Design)、CupertinoApp(iOSスタイル)、WidgetsApp(スタイリングなしの基本ウィジェット)。ルートウィジェットの選択は、アプリケーション全体の外観とプラットフォーム固有のコンポーネントの利用可能性を決定します。
MaterialAppはMaterial Designのサポートによりほとんどのアプリケーションに適しており、Android、ウェブ、デスクトップで優れた外観を提供します。Material Designは豊富なコンポーネントライブラリを提供します:Scaffold、AppBar、BottomNavigationBar、Drawer、SnackBar、Dialogなど多数。MaterialAppは動的色を備えたMaterial 3もサポートしています。
CupertinoAppはAppleのヒューマンインターフェイスガイドラインに従うCupertino Designを使用します。CupertinoPageScaffold、CupertinoNavigationBar、CupertinoTabBarなどのiOSスタイルのコンポーネントを提供します。iOSアプリケーションや全てのプラットフォームでAppleスタイルに従うアプリケーションにはCupertinoAppを使用します。
WidgetsAppはスタイリングなしの基本ルートウィジェットです。Navigator、MediaQuery、Localizationsを追加しますが、テーマやMaterial/Cupertinoコンポーネントは提供しません。WidgetsAppはカスタムデザインシステム、ゲーム、またはMaterialやCupertinoが過剰な独自スタイルのアプリケーションに適しています。
| ルートウィジェット | デザインシステム | 使用するケース |
|---|---|---|
| MaterialApp | Material Design(Google) | Android、ウェブ、デスクトップ、クロスプラットフォームアプリ |
| CupertinoApp | Cupertino(Apple HIG) | iOSアプリ、全プラットフォームでAppleスタイル |
| WidgetsApp | スタイリングなし | カスタムデザイン、ゲーム、独自デザインシステム |
よくある質問
必須ではありません — iOSスタイルにはCupertinoApp、カスタムデザインにはWidgetsAppを使用できます。MaterialAppはScaffold、AppBar、FloatingActionButtonなどのMaterialウィジェットを使用する場合に必須です。
theme(ライトテーマ)とdarkTheme(ダークテーマ)パラメータを使用します。Flutterはシステム設定に基づいて自動的にテーマを切り替えます。強制的に切り替えるには、WidgetsBinding.instance.platformDispatcher.platformBrightnessを使用します。
はい、デフォルトではuseMaterial3はfalseで、MaterialAppはMaterial 2を使用します。Material 3を有効にするには、useMaterial3: trueを設定し、ColorScheme.fromSeedからcolorSchemeを使用します。
onUnknownRouteパラメータを使用します。これはRouteSettingsを受け入れ、MaterialPageRouteを返します。routesもonGenerateRouteもルートを処理しなかった場合、onUnknownRouteが呼び出されます — エラーメッセージ付きのページを返します。
homeパラメータが指定されておらず、routesもない場合、Flutterは起動時に例外をスローします。home、'/'ルートを持つroutes、またはinitialRouteのうち少なくとも1つを指定する必要があります。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。