はじめに
今回の記事は必要最低限の構造から基礎を学んでみようという記事になります!
といっても私自身勉強を始めたばかりなので間違っている箇所も多々あると思いますが備忘録の意味合いもかねて残したいと思います。
コード
今回は扱うコードはこちら。
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', home: Scaffold( appBar: AppBar( title: Text('上のバーのテキスト') ), body: Center( child: Text("真ん中のテキスト") ), ) ); } }
20行程度のかなり短いコードになります。
これを分解していきましょう。
構造
まず前提としてFlutter
のUIはすべてウィジェットで構成されています。
このウィジェット階層構造をウィジェットツリーというらしく、これをしっかりと把握することが重要といえるでしょう。
ということで先程のコードを図におこしてみました。
ひとつひとつみていきます。
MyApp
これは最上部のウィジェットでルートウィジェットというそうです。
runAppメソッド
の引数にはルートウィジェットのインスタンスを渡します。
またDart
はnew
というキーワードをつけなくてもインスタンス化できることに注意してください。(あっても良い)
ウィジェットにはStatelessWidget
とStatefulWidget
の2種類があり以下のような区別があります。
StatelessWidget
は状態を持たないウィジェット(インスタンス化したら変わることはない)StatefulWidget
は状態を持つウィジェット(インスタンス化後に変化することがある)
よく見てみるとMyApp
はStatelessWidget
を継承しているので、状態を持たないウィジェットということが分かります。
さらにStatelessWidget
を継承しているクラスはbuild
メソッドを実装しなければなりません。
MaterialApp
MaterialApp
クラスはマテリアルデザインのためのウィジェットです。
MaterialApp class - material library - Dart API
ちなみにマテリアルデザインとはGoogleが提唱しているデザインの考え方のことで、見た目をカッコよくすることができます。
コンストラクターの引数はめちゃくちゃありますが、用いている引数は以下の二つになります。
title
: アプリを識別するためにデバイスが使用する一行の説明文home
: デフォルトのルートウィジェット
title
の英語をほぼ直訳してみたのですが、いまいちよく分かっていません。画面的には変更はないので内部で使うものだと思います。
Scaffold
Scaffold
クラスはマテリアルデザイン用のウィジェットです。
Scaffold class - material library - Dart API
プロパティにはappBar
やfloatingActionButton
,drawer
,bottomNavigatonBar
のような実際に見た目ようなものがあります。
今回使ったコンストラクターの引数は以下の二つ
appBar
:Scaffold
の上部に表示されるバーbody
:Scaffold
の主要なコンテンツ
AppBar
AppBar
クラスはマテリアルデザインのバーです。
AppBar class - material library - Dart API
これも色々とカスタマイズすることができるみたいですが、使ったコンストラクターの引数は一つだけ。
title
:appBar
に表示される主要なウィジェット
Center
Center
クラスは子をそれ自体の中央に配置するウィジェットです。
Center class - widgets library - Dart API
これはここに載せられるくらいシンプルなコンストラクターです。
Center({Key key, double widthFactor, double heightFactor, Widget child})
今回使った引数は一番右にあるchild
です。
child
: 階層構造でこのウィジェットの下にあるウィジェット
Text
最後にText
クラスはテキストを表示するウィジェットです。
もうこのコンストラクターはシンプルすぎて可愛くみえてくるレベルです。
Text(String data)
これは説明不要でしょう。
さいごに
まず最初にFlutterを触って思ったことはネストがあまりに深くなりがちなところです。
ずっとUnityを触ってきた身からするとめまいがしそうなレベルです。
UnityなんかはGUIによってこういった階層構造を表すことでネストが深いコードをうまく避けているのでしょう。
ただ見た目をコードで作るといったらおそらく避けては通れないのかもしれません。(そういえばHTMLとかもネストが深かったような)
とりあえずは慣れるしかなさそうです。
ではまた。