重要概念#2-1: Flutterの心臓部「ウィジェット(Widget)」とは何か?
Flutterの世界へようこそ!これからあなたがFlutterで何かを作る時、必ず「ウィジェット」という言葉を耳にします。テキスト、ボタン、画像、レイアウト、果てはアプリ全体まで... Flutterでは、目に見えるものも、見えないものも、すべてがウィジェットです。
このドキュメントでは、Flutterの心臓部であるウィジェットの正体を、レゴブロックや料理の材料に例えながら解き明かしていきます。
1. ウィジェットとは「部品」である
ウィジェットを最も簡単に理解する方法は、レゴブロックを想像することです。
- 四角いブロック、丸いブロック、透明なブロック... レゴには様々な形の部品があります。
- これらの部品を組み合わせて、家や車、お城など、望むものを作り上げます。
Flutterのウィジェットも全く同じです。
Text(文字を表示する部品)、Icon(アイコンを表示する部品)、Image(画像を表示する部品)といった、基本的なUI部品があります。- これらの部品を、
Column(縦に並べる部品)やRow(横に並べる部品)、Padding(余白を作る部品)といったレイアウト用の部品を使って組み合わせることで、複雑な画面を構築していきます。
「小さなウィジェットを組み合わせて、より大きなウィジェットを作る」 これが、FlutterのUI構築における、たった一つの、しかし最も重要な原則です。
2. ウィジェットは「設定書」である
ここで少し技術的な話をします。ウィジェットは、画面に表示されるピクセルそのものではありません。
ウィジェットとは、「画面のこの部分に、こういう見た目で、こういう振る舞いをする要素を表示してください」とFlutterフレームワークに指示するための、不変の(変わらない)設定書なのです。
料理に例えるなら、ウィジェットは「レシピカード」です。 * レシピカード(ウィジェット)には、「タマネギをみじん切りにする」「塩を少々加える」といった指示が書かれています。 * 実際に調理を行うのは、シェフ(Flutterフレームワーク)です。 * シェフは、レシピカードの指示を読み取り、最終的な料理(画面のピクセル)を作り上げます。
この「ウィジェット=設定書」という考え方は、Flutterのパフォーマンスの秘密でもありますが、初めのうちは「ウィジェット=UIの部品」と理解しておけば十分です。
3. ウィジェットの主な種類
Flutterには何百ものウィジェットがありますが、大きく分けると以下のカテゴリに分類できます。
基本的なウィジェット(見える部品)
Text: 文字列を表示します。Image: 画像を表示します。Icon: アイコンフォントからアイコンを表示します。ElevatedButton,TextButton: 様々な種類のボタンです。TextField: ユーザーが文字を入力するためのフィールドです。Container: 色を塗ったり、枠線を付けたり、余白を設けたりできる、便利な四角い箱です。
レイアウトウィジェット(見えない枠組み)
Row: 子ウィジェットを横方向に並べます。Column: 子ウィジェットを縦方向に並べます。Stack: 子ウィジェットを重ねて配置します(Z軸方向)。Padding: 子ウィジェットの周りに余白(パディング)を作ります。Center: 子ウィジェットを中央に配置します。ListView: スクロール可能なリストを作成します。
4. ウィジェットツリー:入れ子構造
Flutterのコードを見ると、ウィジェットが何重にも入れ子(ネスト)になっていることに気づくでしょう。
// 入れ子構造の例
Center( // 中央に配置するウィジェット
child: Column( // 縦に並べるウィジェット
children: <Widget>[
Text('こんにちは'), // テキストウィジェット
ElevatedButton( // ボタンウィジェット
onPressed: () {},
child: Text('ボタン'),
),
],
),
)
このウィジェットの親子関係の構造全体を「ウィジェットツリー」と呼びます。Flutterアプリは、この巨大なウィジェットツリーを構築することで、画面全体を定義しているのです。
🤖 AI活用プロンプト
特定のUIをどうやってウィジェットで実現すれば良いか分からない時は、AIに聞いてみましょう。 ``` 画面の中央に、プロフィール画像(円形)を置いて、その下にユーザー名(太字)、さらにその下に自己紹介文を縦に並べて表示したいです。
CircleAvatarとColumn、Textウィジェットを使ったコードを書いてください。 ```
ウィジェットの概念を理解することは、Flutterをマスターするための第一歩です。心配しないでください、実際にコードを書いていくうちに、自然とこの「すべてがウィジェット」という考え方に慣れていきます。