いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Flutterメモ-20 (CenterウィジェットとColumnウィジェットで中央表示)

概要

Flutterを初め触っていた時に、パッと理解できなかったのが

Centerウィジェットの中にColumnウィジェットを入れた際の表示でした。

Centerウィジェットは、その名前の通り、childに指定したウィジェットを中央に表示してくれるものです。

例えば

import 'package:flutter/material.dart';

void main() {
  runApp(
    const MaterialApp(
      home: Scaffold(
        body: Center(
          child: Text('hello world'),
        ),
      ),
    ),
  );
}

だと

f:id:gsf_zero1:20210930170819p:plain

というように狙ったとおりの表示をしてくれます。

んで、同じようにColumnウィジェットを使ってみると

import 'package:flutter/material.dart';

void main() {
  runApp(
    MaterialApp(
      home: Scaffold(
        body: Center(
          child: Column(
            children: const [
              Text('hello world'),
            ],
          ),
        ),
      ),
    ),
  );
}

f:id:gsf_zero1:20210930171107p:plain

なんでやねんって感じで、中央にあった文字列が一番上に行っちゃいます。

何故、このようになるのか?を知るために一旦 Column ウィジェットさんの背景色を変えてみます。

import 'package:flutter/material.dart';

void main() {
  runApp(
    MaterialApp(
      home: Scaffold(
        body: Center(
          child: Container(
            color: Colors.yellow,
            child: Column(
              children: const [
                Text('hello world'),
              ],
            ),
          ),
        ),
      ),
    ),
  );
}

f:id:gsf_zero1:20210930171458p:plain

色付けてみるとよくわかりますね。Columnウィジェットさんは縦幅いっぱいまで自分の高さを確保しています。

なので、Centerウィジェットで包んでも中央にならないという訳です。

んで、この可能な限り縦幅を確保する挙動は、 mainAxisSize プロパティで制御できます。

デフォルトの値は MainAxisSize.max となっています。なので、可能な限り縦幅が確保されます。

逆に必要な分のみの確保で良い場合は、 MainAxisSize.min を指定します。

上記の状態に MainAxisSize の指定をつけると

import 'package:flutter/material.dart';

void main() {
  runApp(
    MaterialApp(
      home: Scaffold(
        body: Center(
          child: Container(
            color: Colors.yellow,
            child: Column(
              mainAxisSize: MainAxisSize.min,
              children: const [
                Text('hello world'),
              ],
            ),
          ),
        ),
      ),
    ),
  );
}

f:id:gsf_zero1:20210930171832p:plain

こうなります。ちゃんと中央に配置されるようになりました。

ちなみに、MainAxisSizeはデフォルト(max)のままで、MainAxisAlighmentで中央(center)を指定した場合は

import 'package:flutter/material.dart';

void main() {
  const _axisSize = MainAxisSize.max;
  const _axisAlign = MainAxisAlignment.center;

  runApp(
    MaterialApp(
      home: Scaffold(
        body: Center(
          child: Container(
            color: Colors.yellow,
            child: Column(
              mainAxisSize: _axisSize,
              mainAxisAlignment: _axisAlign,
              children: const [
                Text('hello world'),
              ],
            ),
          ),
        ),
      ),
    ),
  );
}

f:id:gsf_zero1:20210930172311p:plain

このようになっています。

参考情報

stackoverflow.com

qiita.com

github.com


過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com

github.com