Flutterアプリケーション開発概論

MaterialAppとScaffoldでアプリの土台を作る

この節で学ぶこと

前回の 4-2 では、Flutterの画面は Widget という部品を組み合わせて作られていることを学びました。

今回の 4-3 では、Flutterアプリの土台になる MaterialAppScaffold を学びます。

TikTok風アプリを作るときも、いきなり動画やボタンを置くのではなく、まずアプリ全体の土台を作ります。

この節では、次のような黒背景の全画面アプリを作ります。

まだ動画は再生しません。

まだいいねボタンも作りません。

まずは、Flutterアプリがどのような構造で起動し、どのWidgetが画面の土台になるのかを理解します。

この節で大切なのは、次の一文です。

MaterialAppはアプリ全体の設定、Scaffoldは1画面の土台を作るWidgetである。

まずFlutterアプリの基本構造を見る

Flutterアプリは、基本的に次の流れで起動します。

main
↓
runApp
↓
MaterialApp
↓
home
↓
Scaffold
↓
body

これだけ見ると少し難しく感じるかもしれません。

しかし、1つずつ分けるとシンプルです。

部分役割
mainプログラムのスタート地点
runAppFlutterアプリを起動する
MaterialAppアプリ全体の基本設定
home最初に表示する画面
Scaffold1画面の土台
body画面の中身

TikTok風アプリも、この基本構造の上に作っていきます。

新しい言葉:mainとは何か

main は、Dartプログラムのスタート地点です。

Flutterアプリでも、最初に実行されるのは main です。

void main() {
  runApp(const TikTokLikeVideoApp());
}

このコードは、次のように読めます。

アプリが始まったら、
TikTokLikeVideoAppを画面に表示してください。

main は、アプリの入口です。

どんなFlutterアプリでも、基本的にはここから始まります。

新しい言葉:runAppとは何か

runApp は、Flutterアプリを起動するための関数です。

runApp(const TikTokLikeVideoApp());

これは、次の意味です。

TikTokLikeVideoAppというWidgetを、アプリとして動かしてください。

Flutterでは、アプリ全体もWidgetです。

そのため、runApp に一番外側のWidgetを渡します。

今回の場合は、TikTokLikeVideoApp を渡しています。

runApp
└─ TikTokLikeVideoApp

新しい言葉:MaterialAppとは何か

MaterialApp は、Flutterアプリ全体の基本設定をするWidgetです。

MaterialApp(
  debugShowCheckedModeBanner: false,
  home: ShortVideoHomePage(),
)

MaterialApp では、次のような設定ができます。

設定意味
debugShowCheckedModeBanner右上のDEBUG表示を出すかどうか
home最初に表示する画面
themeアプリ全体の色やデザイン
titleアプリ名
routes画面遷移の設定

今回は、まず次の2つだけ理解すれば大丈夫です。

debugShowCheckedModeBanner: false,
home: ShortVideoHomePage(),

debugShowCheckedModeBannerとは何か

DartPadや開発中のFlutterアプリでは、画面右上に DEBUG という帯が出ることがあります。

それを消すために、次の設定を使います。

debugShowCheckedModeBanner: false,

初心者向けには、次のように覚えておけば大丈夫です。

debugShowCheckedModeBanner: false
↓
右上のDEBUG表示を消す設定

TikTok風アプリでは、画面をアプリらしく見せたいので、この設定を入れておきます。

homeとは何か

home は、アプリを開いたときに最初に表示する画面です。

home: ShortVideoHomePage(),

これは、次の意味です。

アプリを起動したら、
ShortVideoHomePageを最初に表示する。

今回のアプリでは、ShortVideoHomePage がTikTok風動画一覧のメイン画面になります。

MaterialApp
└─ home: ShortVideoHomePage

新しい言葉:Scaffoldとは何か

Scaffold は、1画面の土台を作るWidgetです。

Scaffold(
  backgroundColor: Colors.black,
  body: Center(
    child: Text('TikTok風アプリの土台'),
  ),
)

Scaffold は、画面の基本的な構造を作るために使います。

たとえば、次のような場所を作れます。

Scaffoldの場所役割
appBar上部のバー
body画面の中心部分
bottomNavigationBar下部ナビゲーション
floatingActionButton浮いているボタン
backgroundColor画面背景色

今回のTikTok風アプリでは、一般的な上部バーは使いません。

動画を全画面に表示したいため、主に body を使います。

bodyとは何か

body は、Scaffoldの中で、画面の中心部分を表します。

Scaffold(
  body: Center(
    child: Text('TikTok風アプリの土台'),
  ),
)

これは、次のような構造です。

Scaffold
└─ body
   └─ Center
      └─ Text

TikTok風アプリでは、この body の中に、動画背景、右側ボタン、下部テキストなどを置いていきます。

Scaffold
└─ body
   └─ TikTok風の画面全体

TikTok風アプリではなぜ黒背景にするのか

今回のアプリでは、Scaffoldの背景を黒にします。

backgroundColor: Colors.black,

理由は、TikTok風のショート動画UIでは、動画が主役だからです。

背景が白いと、動画や白い文字が見づらくなります。

黒背景にすると、動画・白文字・アイコンが目立ちやすくなります。

黒背景
↓
動画が目立つ
白文字が読みやすい
アプリっぽく見える

もちろん、実際のTikTok画面は動画が背景全体に広がります。

しかし、動画を置く前の段階では、まず黒背景の土台を作っておくと分かりやすいです。

この節で作る最小アプリ

ここから実際にコードを書きます。

DartPadに次のコードを貼り付けてください。

import 'package:flutter/material.dart';

void main() {
  runApp(const TikTokLikeVideoApp());
}

class TikTokLikeVideoApp extends StatelessWidget {
  const TikTokLikeVideoApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      debugShowCheckedModeBanner: false,
      home: ShortVideoHomePage(),
    );
  }
}

class ShortVideoHomePage extends StatelessWidget {
  const ShortVideoHomePage({super.key});

  @override
  Widget build(BuildContext context) {
    return const Scaffold(
      backgroundColor: Colors.black,
      body: Center(
        child: Text(
          'TikTok風アプリの土台',
          style: TextStyle(
            color: Colors.white,
            fontSize: 24,
            fontWeight: FontWeight.bold,
          ),
        ),
      ),
    );
  }
}

実行結果

実行すると、黒い画面の中央に白い文字が表示されます。

TikTok風アプリの土台

この時点では、とてもシンプルです。

しかし、このコードにはFlutterアプリの重要な基本構造がすべて入っています。

main
↓
runApp
↓
MaterialApp
↓
home
↓
Scaffold
↓
body
↓
Text

これが、これから作るTikTok風アプリの土台です。

コードを1行ずつ見る

import

import 'package:flutter/material.dart';

これは、Flutterの基本的なWidgetを使うための読み込みです。

MaterialAppScaffoldTextColors などを使うには、このimportが必要です。

material.dartを読み込む
↓
Flutterの基本Widgetが使える

main

void main() {
  runApp(const TikTokLikeVideoApp());
}

main は、アプリのスタート地点です。

runApp によって、TikTokLikeVideoApp がアプリとして表示されます。

TikTokLikeVideoApp

class TikTokLikeVideoApp extends StatelessWidget {
  const TikTokLikeVideoApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      debugShowCheckedModeBanner: false,
      home: ShortVideoHomePage(),
    );
  }
}

TikTokLikeVideoApp は、アプリ全体の入口になるWidgetです。

ここでは、MaterialApp を返しています。

TikTokLikeVideoApp
└─ MaterialApp

このWidget自体は、状態が変化しないため、StatelessWidget を使っています。

StatelessWidgetとは何か

StatelessWidget は、状態を持たないWidgetです。

状態とは、ユーザー操作などで変わる値のことです。

たとえば、次のようなものが状態です。

いいねしているかどうか
今何番目の動画を見ているか
コメントが何件あるか
動画が再生中か停止中か

今作っている土台画面では、まだそういった変化はありません。

そのため、StatelessWidget で十分です。

buildメソッド

@override
Widget build(BuildContext context) {
  return const MaterialApp(
    debugShowCheckedModeBanner: false,
    home: ShortVideoHomePage(),
  );
}

build メソッドは、Widgetの見た目を作る場所です。

この場合、TikTokLikeVideoApp の見た目は MaterialApp です。

初心者向けには、次のように覚えてください。

buildメソッドは、画面に何を表示するかを返す場所

ShortVideoHomePage

class ShortVideoHomePage extends StatelessWidget {
  const ShortVideoHomePage({super.key});

  @override
  Widget build(BuildContext context) {
    return const Scaffold(
      backgroundColor: Colors.black,
      body: Center(
        child: Text(
          'TikTok風アプリの土台',
          style: TextStyle(
            color: Colors.white,
            fontSize: 24,
            fontWeight: FontWeight.bold,
          ),
        ),
      ),
    );
  }
}

ShortVideoHomePage は、最初に表示される画面です。

ここでは、Scaffold を返しています。

ShortVideoHomePage
└─ Scaffold
   └─ body
      └─ Center
         └─ Text

この構造が、1画面の基本になります。

Scaffoldの中身を見る

return const Scaffold(
  backgroundColor: Colors.black,
  body: Center(
    child: Text(
      'TikTok風アプリの土台',
      style: TextStyle(
        color: Colors.white,
        fontSize: 24,
        fontWeight: FontWeight.bold,
      ),
    ),
  ),
);

ここで、背景色を黒にしています。

backgroundColor: Colors.black,

そして、bodyCenter を置いています。

body: Center(
  child: Text(...),
),

Center は、中のWidgetを中央に置くWidgetです。

Text は、文字を表示するWidgetです。

TextStyleで文字を整える

style: TextStyle(
  color: Colors.white,
  fontSize: 24,
  fontWeight: FontWeight.bold,
),

TextStyle は、文字の見た目を整えるための設定です。

設定意味
color文字色
fontSize文字サイズ
fontWeight文字の太さ

ここでは、白色で、少し大きく、太い文字にしています。

TikTok風アプリでは、動画の上に白い文字を重ねることが多いので、ここで白文字の扱いに慣れておきます。

constとは何か

今回のコードには、const が何度も出てきます。

runApp(const TikTokLikeVideoApp());
return const MaterialApp(
return const Scaffold(

const は、簡単に言うと「最初から変わらない固定のWidgetや値」に使います。

初心者向けには、まず次のように理解しておけば大丈夫です。

const = 変わらないものにつける印

今回のように、表示内容が固定されているWidgetには const をつけられます。

ただし、今後、いいねの状態や動画の再生状態など、変化する値を扱うときは、すべてに const をつけられるわけではありません。

最初は、エディタが const を提案したらつける、くらいの理解で大丈夫です。

TikTok風アプリの土台として見る

今回作ったコードを、TikTok風アプリの土台として見てみます。

TikTokLikeVideoApp
└─ MaterialApp
   └─ ShortVideoHomePage
      └─ Scaffold
         └─ body

この body の中に、今後いろいろな部品を入れていきます。

body
├─ 動画背景
├─ 上部ナビ
├─ 右側ボタン
├─ 下部テキスト
└─ コメント欄を開く仕組み

つまり、今はまだ文字だけですが、構造としてはすでにTikTok風アプリの入口ができています。

次の段階では何をするのか

今は、bodyCenterText だけを置いています。

body: Center(
  child: Text('TikTok風アプリの土台'),
),

次の段階では、この bodyStack に置き換えます。

body: Stack(
  children: [
    動画背景,
    上部ナビ,
    右側ボタン,
    下部情報,
  ],
),

TikTok風UIは、動画の上に文字やボタンが重なっているため、Stack が重要になります。

つまり、今回の節は、次の準備です。

MaterialAppでアプリ全体を作る
↓
Scaffoldで画面の土台を作る
↓
次にStackでTikTok風レイアウトを作る

手を動かす練習1:背景色を変える

次の部分を探してください。

backgroundColor: Colors.black,

これを次のように変えてみてください。

backgroundColor: Colors.deepPurple,

画面背景が紫色になります。

この練習で分かることは、ScaffoldbackgroundColor が画面全体の背景色を決めているということです。

手を動かす練習2:表示文字を変える

次の部分を探してください。

'TikTok風アプリの土台'

これを次のように変えてみてください。

'ショート動画アプリを作る'

実行すると、中央の文字が変わります。

この練習で、Text の中の文字が画面に表示されることを確認できます。

手を動かす練習3:文字サイズを変える

次の部分を探してください。

fontSize: 24,

これを次のように変えてみてください。

fontSize: 32,

文字が大きくなります。

TextStylefontSize は、文字サイズを決める設定です。

手を動かす練習4:太字をやめる

次の部分を探してください。

fontWeight: FontWeight.bold,

これを削除してみてください。

文字の太さが通常になります。

文字の印象が変わることを確認してください。

よくあるつまずき1:MaterialAppとScaffoldの違いが分からない

初心者がよく混乱するのが、MaterialAppScaffold の違いです。

簡単にいうと、次の違いです。

Widget役割
MaterialAppアプリ全体の設定
Scaffold1画面の土台

たとえるなら、MaterialApp はアプリ全体の建物です。

Scaffold は、その中の1つの部屋です。

MaterialApp
└─ Scaffold
   └─ body

まずは、この親子関係を覚えてください。

よくあるつまずき2:homeとbodyの違いが分からない

home は、アプリを起動したときに最初に表示する画面です。

home: ShortVideoHomePage(),

body は、Scaffoldの中身です。

body: Center(...),

整理すると、次のようになります。

書き方意味
homeアプリの最初の画面
bodyその画面の中身

構造で見ると、こうです。

MaterialApp
└─ home: ShortVideoHomePage
   └─ Scaffold
      └─ body

よくあるつまずき3:buildメソッドが何をしているか分からない

build は、そのWidgetが何を表示するかを返す場所です。

@override
Widget build(BuildContext context) {
  return const Text('Hello');
}

この場合、このWidgetは Text('Hello') を表示します。

難しく考えすぎず、最初は次のように覚えてください。

buildのreturnに書いたWidgetが画面に表示される

よくあるつまずき4:constをどこにつけるか分からない

const は、変わらないWidgetや値に使えます。

しかし、最初から完璧に理解しようとしなくても大丈夫です。

まずは、次の方針で進めましょう。

エディタがconstを提案したらつける
エラーになるなら外す
状態が変わるWidgetではconstを外すことがある

この章の後半では、いいねやコメントなど、状態が変わる画面を作ります。

そのときは、const を外す場面も出てきます。

この節の確認問題

確認問題1

main は何をする場所ですか。

答え

Dartプログラムのスタート地点です。

Flutterアプリでは、ここから runApp を呼び出してアプリを起動します。

確認問題2

runApp は何をする関数ですか。

答え

指定したWidgetをFlutterアプリとして起動する関数です。

確認問題3

MaterialApp は何のために使いますか。

答え

アプリ全体の基本設定をするために使います。

最初に表示する画面を home で指定できます。

確認問題4

Scaffold は何のために使いますか。

答え

1画面の土台を作るために使います。

背景色や画面の中身である body を設定できます。

確認問題5

homebody の違いは何ですか。

答え

home は、アプリを起動したときに最初に表示する画面です。

body は、Scaffoldの中に表示する画面の中身です。

確認問題6

TikTok風アプリで背景色を黒にする理由は何ですか。

答え

動画や白い文字、アイコンを目立たせるためです。

動画を主役にしたUIでは、黒背景が見やすくなります。

この節のまとめ

この節では、Flutterアプリの土台である MaterialAppScaffold を学びました。

Flutterアプリは、次のような流れで起動します。

main
↓
runApp
↓
MaterialApp
↓
home
↓
Scaffold
↓
body

MaterialApp は、アプリ全体の設定をするWidgetです。

Scaffold は、1画面の土台を作るWidgetです。

今回のTikTok風アプリでは、まず黒背景の全画面アプリを作りました。

まだ動画もボタンもありませんが、この土台があるからこそ、次の節から画面を重ねて作っていくことができます。

この節のポイント:
- mainはアプリのスタート地点
- runAppでFlutterアプリを起動する
- MaterialAppはアプリ全体の設定
- homeは最初に表示する画面
- Scaffoldは1画面の土台
- bodyは画面の中身
- TikTok風アプリでは黒背景の土台を作る

この節で一番大切なのは、次の一文です。

Flutterアプリは、MaterialAppで全体を作り、Scaffoldで1画面の土台を作るところから始まる。

次の節では、Stack を使って、動画の上に文字やボタンを重ねるTikTok風レイアウトを作っていきます。

教材トップへ戻る