※本サイトは docs.flutter.dev / Large screen devices のリファレンスブログです。
このページでは、大画面での動作を改善するためにアプリを最適化するためのガイダンスを提供しています。 FlutterはAndroidと同様に、大画面をAndroidが動作するタブレット、フォルダブル、ChromeOSデバイスと定義しています。 また、Flutterは大画面のデバイスをウェブ、デスクトップ、iPadと定義しています。
大画面の需要は増加の一途をたどっています。 2024年1月現在、2億7,000万台以上のアクティブな大画面および折りたたみ式デバイスがAndroidで動作し、1,490万人以上のiPadユーザーがいます。 アプリが大画面をサポートすると、他のメリットも得られます。 画面いっぱいにアプリを最適化することです。 例えば、次のようなことが可能です。 アプリのユーザーエンゲージメント指標を向上させます。 Playストアでのアプリの視認性を高めます。 最近のPlayストアのアップデートでは、デバイスタイプ別の評価が表示され、アプリが大画面をサポートしていない場合も表示されます。 あなたのアプリがiPadOSの提出ガイドラインを満たし、App Storeで受け入れられるようにします。
1.GridView利用によるレイアウト
ListViewで作成したアプリを、小画面(スマフォ等)では普通に複数のリスト(写真等)表示されていても、大画面(横長のタブレット等)では(複数リスト中のたった1つの)写真が画面幅いっぱいに表示されてしまうことがあります。
この様な動作を防止する為には、ListViewをGridViewに移行しておくことが有効です。
(1)GridView
GridViewはListViewウィジェットに似ていますが、直線的に並べられたウィジェットのリストだけを扱うのではなく、2次元の配列でウィジェットを並べることができます。 GridViewにもListViewに似たコンストラクタがあります。 ListViewのデフォルトコンストラクタはGridView.countに対応し、ListView.builderはGridView.builderに似ています。
GridViewには、よりカスタムなレイアウトのための追加コンストラクタがいくつかあります。
例えば、元のアプリで ListView.builder を使用していた場合、それを GridView.builder に置き換える。 アイテム数が多いアプリの場合、このビルダーコンストラクタを使用して、実際に表示されるアイテムウィジェットだけをビルドすることをお勧めします。 コンストラクタのパラメータのほとんどは、2つのウィジェット間で同じなので、簡単に交換できます。
Flutterには、強力なgridDelegateがあらかじめ用意されています。
・ SliverGridDelegateWithFixedCrossAxisCount
   グリッドに特定の列数を割り当てることができます。
・ SliverGridDelegateWithMaxCrossAxisExtent
   項目の最大幅を定義できます。
これらのクラスのグリッド・デリゲートは、カラム数を直接設定したり、デバイスがタブレットかどうかに基づいてカラム数をハードコードしたりするようなことはしないでください。 列数はウィンドウのサイズに基づくべきで、物理的なデバイスのサイズに基づくべきではありません。
物理的なデバイスサイズではなくアプリのウィンドウサイズを取得するためにMediaQueryを使いましょう。
(2)その他
これらの状況にアプローチするもう1つの方法は、BoxConstraintsのmaxWidthプロパティを使用することです。 
これには次のような方法があります。
・ GridViewをConstrainedBoxで囲み、最大幅を設定したBoxConstraintsを与えます。
・ 背景色の設定など他の機能が必要な場合は、ConstrainedBoxの代わりにContainerを使用します。
最大幅の値の選択については、『Applying layout guide』のMaterial3が推奨する値を参照して下さい。
2.Foldables(折りたたみ式の画面)
折りたたみ式の画面の場合、MediaQueryを使用しても、表示がおかしくなる場合があります。
(画面を開いた時に、中央にレターボックス状態で表示される(周りが真っ黒、等)。)
これを解決するには、2つの方法があります。
・ すべてのオリエンテーションをサポートする。(全部のデバイスを調査する、ということ)
・ 物理的なディスプレイの寸法を使用する。(Display API を使用してサイズを調査する、ということ)
Flutter 3.13で導入されたDisplay APIを使えば、物理デバイスのサイズ、ピクセル比、リフレッシュレートを取得できます。
ui.FlutterView? _view;
@override
void didChangeDependencies() {
  super.didChangeDependencies();
  _view = View.maybeOf(context);
}
void didChangeMetrics() {
  final ui.Display? display = _view?.display;
}上記を利用して、気になるデバイスについて調査することが薦められています。
3.Adaptive input(適応入力)
より多くのスクリーンをサポートすることは、入力コントロールを拡大することでもあります。
Material3では、大型デバイスのサポートレベルを、3つに分けています。
・ Tier3(ベーシック) – 大画面に(一応)対応している
   マウスとスタイラス入力のサポートが含まれます。
・ Tier2(優良) – (ざっくりと)大画面向けに最適化されている   
・ Tier1(最高) – (個別に)大画面(毎にデバイスを意識、調査して)差別化されている
4.Navigation
ナビゲーションは、サイズの異なるさまざまなデバイスで作業する際に、ユニークな課題を引き起こす可能性があります。 
一般的に、利用可能な画面スペースに応じて、BottomNavigationBarとNavigationRailを切り替えるべきです。
より詳しい情報(とそれに対応するサンプルコード)は、Developing Flutter apps for Large screens 参照。
5.参考(UIデザイン(大画面ギャラリー))
「UIデザイン(大画面ギャラリー)」には大画面における最適化されたUIデザインがギャラリーとして提供されています。(このURLは本来Android開発者向けサイトなのですが、docs.flutter.devでは、大画面レイアウトの部分を切り取って参考にする、という形式で紹介されています。)
(1)ソーシャルメディア
(2)メディア
(3)仕事効率化
(4)ショッピング
(5)読書
(6)想像力
(7)ゲーム
6.(参考)マテリアルデザイン3
ご周知の「マテリアルデザイン3」ですが、ここでも参照先として紹介されています(・・・ので、以下、レジュメになります。)
6-1.HOME
(1)News & launches
(2)Design system updates
- Content design(→2.4_\Foundations)
- Carousel(→\2.6_Componets)
- Material Theme Builder
- How the color system works(→\2.5_Styles_1_Color)
- Using Material icons(→\2.5_Styles_3_Icons)
(3)Resources
- Material blog
- Material Design 3 for Compose version 1.3
 (Carousel, Progress Indicator, Predictive back, Color Token, ・・・)
 
- Material Design 3 for Compose version 1.3
- △Figma design kit
- Get started(→\2.2_\Get started)
- Develop(→\2.3_\Develop)
6-2.Get started
6-3.Develop
- Flutter
- Material 3 from design to deployment
- Design Rationale
- Design Handoff
- Layout Translation
- Navigation Patterns
- Theme Customization
- Motion and Transitions
 
- Developer Rationale
- Custom Components
- Declarative Design
- Platform Adaptation
- Mocking Data
- Animations
 
- New Material 3 Widgets
- Navigation Bar
- Navigation Rail
- Cards
- Buttons
- Floating Action Buttons
- Text Fields
- ・・・
 
- Building the Basil Theme
- Material 3
- Theme Extensions
- Google Fonts
- Material Color Utilities
- Widget Themes
 
 
- Design Rationale
- □Material 3 GitHub issue
- Build an animated responsive layout(NavigationBar, NavigationRail, 遷移アニメーション)
- Opt-in with useMaterial3 flag
- Flutter.dev
- Take your Flutter app from boring to beautiful
- 5 Steps to prepare your app for large screens(大画面に移行する手順)
- Material Motion in Flutter and Android
- Material 3 Canonical layouts
- Material Flutter widget catalog
- Sample app: Wonderous
 
- Material 3 from design to deployment
- Web
- Android
6-4.Foundations
- Accessibility
- Content design
- □Customizing Material(Figmaによるダイナミックカラー利用)
- (研修)アプリでダイナミックカラーを可視化する
- (資料)Visualizing dynamic color in your app with Material Design
- (資料)Figmaコミュニティ内コンテンツ検索
- デザイントークン(設定値ではなく UI 内の要素のカラーロールをデザイナーが割り当てることができる)
- (資料)Material Theme Builder Figma プラグイン
- デザインライブラリ
- UIキット
- Material3 Design Kit
- Material Design Icons
 Google Fonts チームが管理する公式のマテリアル デザイン アイコン ステッカーシートです。マテリアル デザイン アイコンは 5 つのスタイルで利用できます。アイコンは、マテリアル デザイン ガイドラインのコア デザイン原則とメトリクスに基づいて作成されています。アイコンは誰でも無料で使用できます。Apache ライセンス バージョン 2.0 で利用できます。このファイルには、2000 を超えるマテリアル デザイン アイコンが、塗りつぶし、アウトライン、シャープ、丸み、ツートンの 5 つのバリエーションのコンポーネントとして構築されています。アイコンには fonts.google.com/iconsから直接アクセスできます。
 
- ワイヤーフレーム
- すべてのデザインライブラリ
 
- UIキット
- デザインテンプレート
- デスクトップアプリとWebサイト
- モバイルアプリ
- ポートフォリオテンプレート
- 履歴書テンプレート
- すべてのデザインテンプレート
 
- アセット
- イラスト
- アイコン
- シェイプとカラー
- すべてのアセット
 
- プラグイン
- 編集とエフェクト
- ファイル編成
- 開発
- ウィジェット
- インポートとエクスポート
- プロトタイピングとアニメーション
- すべてのプラグイン
 
- ホワイトボーディング
- ブレインストーミング
- ダイアグラム作成
- 娯楽とゲーム
- チームミーティング
- 戦略策定
- すべてのホワイトボーディング
 
- プレゼンテーション
- スタートアップのピッチ
- プロダクトロードマップ
- すべてのプレゼンテーション
 
 
- デザインライブラリ
 
 
- (研修)アプリでダイナミックカラーを可視化する
- Design tokens
- Overview
 ※VSCode拡張機能「Adobe Xd」:現在メンテナンス中(既存ユーザのみ使用可能)
 現在はAdobe XDとVS Codeの統合機能を使うことは難しい状況です。AdobeはXDのサポートを続けるものの、将来的にはFigmaなど他のデザインツールへの移行が推奨されるケースも多いです。AdobeがFigmaの買収を試みたことからも、Adobe自身がこの分野での戦略を見直している可能性があります。
- How to read tokens
- □How to use tokens
- 詳細な手順あり
 
 
- Overview
- Interaction states
- Gestures
- Inputs
- Context menus (右クリックで表示されるメニュー )
 
- Selection
- 選択インジケータ)
 Cards, Checkboxes, Chips, Data tables, Icon buttons, List items, Menu items, Pickers, Radio buttons, Segmented buttons, Sliders, Switch
- コンポーネント)
 Navigation bar, Navigation drawer, Navigation rail, Tabs
- タッチ選択)
 長押し、2指選択、選択ショートカット(アバターのタップ、等)
- より幅広い選択肢)
 ・長押しとドラッグの併用で項目を一括選択可能
 
- 選択インジケータ)
- States
 
- Layout
- Layout basics
- Overview
- Spacing
- Grouping
- Explicit grouping
- Implicit grouping
 
- Margins
- Spacers
- Padding
 
- Grouping
- Parts of layout
- Hardware considerations
 
- Applying layout
- Canonical Layouts
 
- Layout basics
- Material A-Z
- Banner
- Button
- Bottom app bar
- Bottom sheet
- Card
- Checkbox
- Chip
- Color: Baseline scheme
- Color: Dynamic color
- Color: Extended color
- Color: Key color
- Color: Scheme
- Color: Source color
- Color: Tonal palette
- Color: Tone
- Color: User-generated schemes
- Contrast
- Customization
- Dark theme
- Data table
- Date picker
- Design attribute
- Design guidelines
- Design specs
- Design System Package ( DSP )
- Design tokens
- Design tokens: Context
- Design tokens: Role
- Design tokens: Types
- Design tokens: Value
- Dialog
- Divider
- Element
- Extended FAB
- Floating action button ( FAB )
- HCT
- Image list
- Libraries
- List
- Material Components
- Material Design
- Material Theming
- Menu
- Mode
- Navigation bar
- Navigation drawer
- Navigation rail
- Progress indicator
- Radio button
- Role
- Side sheet
- Slider
- Snackbar
- Style
- Switch
- Tab
- Text field
- Theme
- Time pickker
- Tooltip
- Top app bar
 
6-5.Styles
- Color
- Color system
- Overview
- How the system works( Material動的カラー機能の利用 )
- 色ソースの設定: 
 シードカラーの設定
- 静的または調和された色の追加:
 シードカラーから生成された調和の取れた色がUI要素に追加される
- どの要素にどの「番号」を割り当てるかを変更する:
 各UI要素にどの色(番号)を適用するかを変更できる
 
- 色ソースの設定: 
 
- Color roles
- What are color roles ?
- General concepts
- Primary
- Secondary
- Tertiary
- Error
- Surface
- Outline
- Add-on color roles
 
- Color schemes
- Choosing a scheme
- Static color
- Dynamic color
 
- Static
- Dynamic
- Choosing a source(ソースの選択)
- ユーザが生成した色
 (ユーザー生成カラーは、 Android ユーザーの個人的な壁紙から取得されます。壁紙はデジタル分析され、単一の色がソースカラーとして選択され、トーンが選択され、各カラーロールに割り当てられます。)
- コンテンツベースの色
- 複数のカラーソース
 
- ユーザが生成した色
- User-generated source( ユーザ生成ソース )
- ユーザー生成カラーは、 Android ユーザーの個人的な壁紙から取得されます。壁紙はデジタル分析され、単一の色がソースカラーとして選択され、トーンが選択され、各カラーロールに割り当てられます。
- Material Theme Builder公式サイト
 
- Content-based source( コンテンツベースのソース )
 
- Choosing a source(ソースの選択)
 
- Choosing a scheme
- Advanced
- Overview
 デフォルトで提供されていない場所や方法で色を適用できます。- 複数のカラースキームを組み合わせる
 ベースライン スキームと動的なコンテンツ ベースのスキームとを組み合わせるなど、同じアプリ エクスペリエンスで複数のカラー スキームを使用できます。
- UI要素に色をマップまたは再マップする
 コンポーネントのデフォルトの色マッピングを変更したり、独自のカスタムコンポーネントに色を適用したりできます。
 
- 複数のカラースキームを組み合わせる
- Apply colors
- Define new colors
- Adjust existing colors
 
- Overview
- Color resources
 
- Color system
- Elevation
- Icons
- Motion
- Shape
- Typography
6-6.Components
- Overview
- App bars
- Bottom app bar
- Top app bar
 
- Badges
- Buttons
- All buttons
- Choosing buttons
- 高強調
- Extended FAB
- FAB
- Filled button
 
- 中強調
- Filled tonal button
- Elevated button
- Outlined button
 
- 低強調
- Text button
- Segmented button
- Icon button
 
 
- 高強調
- Herarchy
- Primary action button
- Other buttons
 
- Placement
 
- Choosing buttons
- Common buttons
- Overview/Specs/Guidelines/
- Accessibility
 各成分のウェイト)R(赤): 0.2126、G(緑): 0.7152、B(青): 0.0722
 Luminance=0.2126×R+0.7152×G+0.0722×B
 
- FAB
- Extended FAB
- Icon buttons
- Segmented buttons
 
- All buttons
- Cards
- Overview/Specs/
- Guidelines
- mozaic grid、staggered grid
 
- /Accessibility
 
- Carousel
- Checkbox
- Chips
- Date pickers
- Dialogs
- Divider
- Lists
- Menus
- Navigation ※同じ画面上で以下を同時に使用してはいけない
- Navigation bar(コンパクトなウィンドウ サイズ)
- Navigation rail(中サイズおよび拡張ウィンドウ サイズ)
- Navigation drawer(拡張、大、特大ウィンドウ サイズ)
- Overview/Specs/Guidelines/Accessibility
 1. 標準(拡大、大、特大のウィンドウ サイズ)
 ・常に表示時:
 宛先を頻繁に切り替える場合に最適
 ・メニュー アイコンをタップして開閉時:
 画面のコンテンツに重点を置く場合に最適
 2. モーダル(中サイズおよびコンパクト サイズ)
 ※スクリムにより他のコンテンツをブロック可能
 
- Overview/Specs/Guidelines/Accessibility
 
- Progress indicators
 確定/不確定インジケータ
 円形/直線
- Radio button
- Search
- Overview/Specs/Guidelines/Accessibility(※近日公開予定、とのこと)
 
- Sheets
- Bottom sheets (コンパクト・中サイズ)
- Overview/Specs/Guidelines/Accessibility
 1. コンパクト・中サイズ
 2. 標準・モーダル
 3. 二次的な目的地でなければならない( メインは不可 )
 4. メインコンテンツ操作の為にBottom sheets は閉じることが可能
 5. ドラッグハンドルによるタッチターゲット確保
 
- Overview/Specs/Guidelines/Accessibility
- Side sheets
 
- Bottom sheets (コンパクト・中サイズ)
- Sliders
- Overview/Specs/Guidelines/Accessibility
 1. 連続・離散・中央・範囲選択
 
- Overview/Specs/Guidelines/Accessibility
- Snackbar
- Overview/Specs/Guidelines/Accessibility
 1. フォーカスを奪ってはいけない
 2. 自動消去後は元のフォーカスに戻す
 3. 処理後なら次のフォーカスに移す
 
- Overview/Specs/Guidelines/Accessibility
- Switch
- Tabs
- Text fields
- Time pickers
- Tooltips
- Overview/Specs/Guidelines/Accessibility(※近日公開予定、とのこと)