メインコンテンツへスキップ
【コピペOK】flutterのSizedBoxとExpandedの違いをわかりやすく
  1. Posts/

【コピペOK】flutterのSizedBoxとExpandedの違いをわかりやすく

Flutter モバイルアプリ開発 UI設計 Flutter アプリ開発 Flutter UI SizedBox Expanded レイアウト
目次

flutterでオブジェクトのサイズ調整の理解が曖昧な方向け。

flutterでアプリ開発を行う際に頻出する項目の一つのため、この記事でなるべくわかりやすく解説します。

SizedBoxとExpandedを使いこなしてサイズ調整をできるようになりましょう。

この記事は以下のような方を対象者としています。

  • flutter初学者の方
  • flutterでオブジェクトのサイズ調整のやり方が分からない方

SizedBoxとExpandedのデモコード
#

Alt text

まずは、こちらのソースコードをご覧ください。

こちらのコードでは、赤色、青色、緑色の四角形型オブジェクトを描画するデモコードです。

こちらのソースを元に解説していきます。

class SplashScreen extends StatefulWidget {
  SplashScreen({Key key, this.title}) : super(key: key);
  final String title;

  @override
  _SplashScreenState createState() => _SplashScreenState();
}

class _SplashScreenState extends State<SplashScreen> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
     body: Container(
        child: Row(
            children: <Widget>[
                <!-- 今回の説明部分 -->
                Expanded(
                    child: _redBoxWidget(),
                ),
                Expanded(
                    child: _blueBoxWidget(),
                ),
                Expanded(
                    child: _greenBoxwidget(),
                )
            ],
       ),
    ));
  }
}

<!-- 赤色のボックスを描画 -->
Widget _redBoxWidget() {
  return Container(
    color: Colors.red,
    padding: EdgeInsets.all(10.0),
    margin: EdgeInsets.all(10.0),
  );
}

<!-- 青色のボックスを描画 -->
Widget _blueBoxWidget() {
  return Container(
    color: Colors.blue,
    padding: EdgeInsets.all(10.0),
    margin: EdgeInsets.all(10.0),
  );
}

<!-- 緑色のボックスを描画 -->
Widget _greenBoxwidget() {
  return Container(
    color: Colors.green,
    padding: EdgeInsets.all(10.0),
    margin: EdgeInsets.all(10.0),
  );
}

ちなみにアプリで表示するとこんな感じです。

Alt text

flutterをわかりやすく : Expandedとは
#

こちらはオブジェクトを縦もしくは横いっぱいにオブジェクトを表示するために使われます。

KotlinやJavaのコードでいうと"match_parent"のような役割です。

このExpandedのおかげでオブジェクトにwidthやheightの設定が不要になります。

また、ExpandedはColumn(オブジェクトを縦に並べる)、Row(オブジェクトを横に並べる)、もしくはFlex(比率で並べる)内で使われる必要があります。

flutterをわかりやすく : SizedBoxとは
#

こちらはExpandedとは対照的にwidthとheightで厳密にオブジェクトのサイズを指定したい時に使われます。

試しに先ほどのコードを一部ExpandedをSizedBoxに修正したコードと画像を添付します。

class _SplashScreenState extends State<SplashScreen> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Container(
      child: Row(
        children: <Widget>[
          <!-- ExpandedからSizedBoxに変更しwidthとheightを指定 -->
          SizedBox(
            width: 200,
            height: 200,
            child: _redBoxWidget(),
          ),
          Expanded(
            child: _blueBoxWidget(),
          ),
          Expanded(
            child: _greenBoxwidget(),
          )
        ],
      ),
    ));
  }
}

Alt text

この通り赤色のボックスのサイズが縦横共に変わっていますね。

ColumnやRowやFlex内でExpanded等サイズを調整するキーワードがない場合
#

この場合は「“RenderBox was not laid out”」というエラーが発生します。

これはつまりオブジェクトのサイズ調整に関連する情報が定義されていないので、どのように描画していいか分からないということでエラーが返ってきます。

そのため、ColumnやRowなどオブジェクトの並べ方に関する定義をしたら忘れずにサイズ調整の情報も定義してください。

関連記事

【flutter初心者】Column/Row/Center/Containerの違いをわかりやすく
Flutter開発 UI/UXデザイン レイアウト実装 初心者向けチュートリアル Flutter アプリ開発 Column Row Center Container レイアウトウィジェット Flutter初心者 UI設計 Flutterチュートリアル
【Flutter】BoxDecorationの使い方をわかりやすく
Flutter開発 UIデザイン 初心者向けガイド Flutter BoxDecoration UIデザイン アプリ開発 Container DecorationImage Border Shadow 背景デザイン 初心者向け Flutter UI 作り方
【個人開発】副業でアプリを作りたいならサーバーは契約しない方がいい理由
アプリ開発 副業 アプリ開発 副業アプリ 個人開発 サーバー不要 Flutter モバイルアプリ