【 Flutter 】Flutter を 基礎 から 学習 ( ウィジェット編 ) part54 Multi-child layout widgets

基礎 から 学ぶ Flutter 」という書籍で  学習 したことを ブログでアウトプットしていこうと思います。今回は ウィジェット編 ( part54 )です。

前回

【 Flutter 】Flutter を 基礎 から 学習 ( ウィジェット編 ) part53 Multi-child layout widgets

引き続き、Multi-child layout widgetsについて学びます。

Multi-child layout widgets

Wrapウィジェット

WrapウィジェットはウィジェットRowウィジェットやColumnウィジェットの代わりに使用できようです。

このウィジェットは、子ウィジェットを並べすぎて画面のからはみ出ようとして時に自動で改行しなんとか子ウィジェットを画面内に収めようとうしてくれるありがたいウィジェットです。

Rowウィジェットの悲劇

Rowウィジェットだと、子ウィジェットを並べすぎるとエラーになります。
本学習中によく遭遇した工事中マークです(笑

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(new MaterialApp(home: new MyApp()));
}

class MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _State();
  }
}

class _State extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('テスト中です。'),
        ),
        body: Container(
            alignment: Alignment.topLeft,
            child: Row(
              children: <Widget>[box(), box(), box(), box(), box()],
            )),
      ),
    );
  }

  Widget box({
    double size = 120,
    Color color = Colors.green,
    Alignment alignment = Alignment.center,
  }) {
    return Container(
        margin: const EdgeInsets.all(8),
        alignment: alignment,
        width: size,
        height: size,
        color: color);
  }
}

こうなります。

Wrapで解決

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(new MaterialApp(home: new MyApp()));
}

class MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _State();
  }
}

class _State extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('テスト中です。'),
        ),
        body: Container(
            alignment: Alignment.topLeft,
            child: Wrap(
              // Row -> Wrapにするだけ!
              children: <Widget>[box(), box(), box(), box(), box()],
            )),
      ),
    );
  }

  Widget box({
    double size = 120,
    Color color = Colors.green,
    Alignment alignment = Alignment.center,
  }) {
    return Container(
        margin: const EdgeInsets.all(8),
        alignment: alignment,
        width: size,
        height: size,
        color: color);
  }
}

最後に

そうなるとRowColumnウィジェットの存在って・・・。

今日はここまで!