FlutterのWidgetについて、学び直してみる。

## FlutterのWidgetの種類
こちらが、公式のドキュメント
https://docs.flutter.dev/development/ui/widgets
いっぱいありますね...
今回は簡単そうなものから、復習してみようと思います。
Flutter最近触ってなかったので、忘れてました!
バージョンアップも速いので、Udemyで勉強し直しました。

## まずはContainerから
Container Widgetを使うことで、サイズ・背景・余白・枠線などを指定することができます。

main.dart
```dart
import 'package:flutter/material.dart';
import 'package:widgetapp/home_page.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: HomePage(),
    );
  }
}
```

home_page.dart
```dart
import 'package:flutter/material.dart';

class HomePage extends StatefulWidget {
  const HomePage({ Key? key }) : super(key: key);

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        // 背景色
        color: Colors.blue,
        // 横幅
        width: 100,
        // 縦幅
        height: 100,
        child: const Text("Box"),
      ),
    );
  }
}

```
![スクリーンショット 2022-03-25 22.31.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303722/cc608f80-4a1e-5769-27fa-08149ed728b1.png)

左端にズレてますね。見栄えを良くしましょう。
まず、ContainerWidgetをCenterWidgetでラップします。
VsCodeだとマウスカーソルをContainerの上に置いて、電球のアイコンにホバーすると、メニューが表示されるので、centerを選択します。
そうするとカラーBOXが画面中央へ移動します。

home_page.dart
```dart
import 'package:flutter/material.dart';

class HomePage extends StatefulWidget {
  const HomePage({ Key? key }) : super(key: key);

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Container(
          // 背景色
          color: Colors.blue,
          // 横幅
          width: 100,
          // 縦幅
          height: 100,
          child: const Text("Box"),
        ),
      ),
    );
  }
}
```
![スクリーンショット 2022-03-25 22.36.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303722/cb9352d6-8f52-9fa0-39a2-128ab6cf6b30.png)

## 今度カラーBOXの数を増やしてみましょう。
ContainerWidgetをRowWidgetで、ラップしてContainerWidegetをコピーして、３個に増やして色を変えてみましょう。
そうするとこんな感じになります。
home_page.dart
```dart
import 'package:flutter/material.dart';

class HomePage extends StatefulWidget {
  const HomePage({ Key? key }) : super(key: key);

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Row(
          children: [
            Container(
              // 背景色
              color: Colors.blue,
              // 横幅
              width: 100,
              // 縦幅
              height: 100,
              child: const Text("Box"),
            ),
            Container(
              // 背景色
              color: Colors.red,
              // 横幅
              width: 100,
              // 縦幅
              height: 100,
              child: const Text("Box"),
            ),
            Container(
              // 背景色
              color: Colors.green,
              // 横幅
              width: 100,
              // 縦幅
              height: 100,
              child: const Text("Box"),
            ),
          ],
        ),
      ),
    );
  }
}
```
![スクリーンショット 2022-03-25 22.47.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303722/696fce27-abd4-c862-638f-027666dce21c.png)

でも、このコードだとカラーBOXが増えていくと、コードがごちゃごちゃして、見づらいなと思います。以前から、悩んでいたことなのですが、Fluter,Dartの文法を最近学び直して、クラスの中に関数化して、コードを見やすくする方法をUdemyで学びました。

**_colorBoxBlue() {}という書き方ですが...**

_(アンダースコア)をメソッドの前につけて、プライベイトにすることで、クラス内でしか使えないようになり、他のクラスでは利用できなくなるそうです。
Javaだと、Privateというのをプロパティやメソッドの前につけていました。
余白もつけてみました。

home_page.dart
```dart
import 'package:flutter/material.dart';

class HomePage extends StatefulWidget {
  const HomePage({Key? key}) : super(key: key);

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Row(
          children: [
            const SizedBox(width: 10),
            _colorBoxBlue(),
            const SizedBox(width: 10),
            _colorBoxRed(),
            const SizedBox(width: 10),
            _colorBoxGreen(),
            const SizedBox(width: 10),
          ],
        ),
      ),
    );
  }

  Widget _colorBoxBlue() {
    return Container(
      // 背景色
      color: Colors.blue,
      // 横幅
      width: 100,
      // 縦幅
      height: 100,
      child: const Text("Blue"),
    );
  }

  Widget _colorBoxRed() {
    return Container(
      // 背景色
      color: Colors.red,
      // 横幅
      width: 100,
      // 縦幅
      height: 100,
      child: const Text("Red"),
    );
  }

  Widget _colorBoxGreen() {
    return Container(
      // 背景色
      color: Colors.green,
      // 横幅
      width: 100,
      // 縦幅
      height: 100,
      child: const Text("Green"),
    );
  }
}

```
![スクリーンショット 2022-03-25 23.04.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303722/1d501f5b-3e57-dcdc-8a2f-da40cb0731ed.png)

StackWidgetというものも学んだので、紹介しておきます。見た目は良くないですが、Widgetを重ねて表示することができるもので、自分で見た目をカスタマイズすることができます。

home_page.dart
```dart
import 'package:flutter/material.dart';

class HomePage extends StatefulWidget {
  const HomePage({Key? key}) : super(key: key);

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        children: [
          _netWorkImage(),
          Center(
            child: Column(
              children: [
                const SizedBox(height: 10),
                _colorBoxBlue(),
                const SizedBox(height: 10),
                _colorBoxRed(),
                const SizedBox(height: 10),
                _colorBoxGreen(),
                const SizedBox(height: 10),
              ],
            ),
          ),
        ],
      ),
    );
  }

  Widget _netWorkImage() {
    return const Image(
      image: NetworkImage(
          'https://flutter.github.io/assets-for-api-docs/assets/widgets/owl.jpg'),
      width: 250,
      height: 250,
    );
  }

  Widget _colorBoxBlue() {
    return Container(
      // 背景色
      color: Colors.blue,
      // 横幅
      width: 100,
      // 縦幅
      height: 100,
      child: const Text("Blue"),
    );
  }

  Widget _colorBoxRed() {
    return Container(
      // 背景色
      color: Colors.red,
      // 横幅
      width: 100,
      // 縦幅
      height: 100,
      child: const Text("Red"),
    );
  }

  Widget _colorBoxGreen() {
    return Container(
      // 背景色
      color: Colors.green,
      // 横幅
      width: 100,
      // 縦幅
      height: 100,
      child: const Text("Green"),
    );
  }
}

```
![スクリーンショット 2022-03-25 23.21.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303722/fb7a48b2-1dce-9fe0-6ab3-f9d69aa9ab90.png)

## 最後に
FlutterのWidgetは種類が多すぎて覚えるのが大変です!!!
常に公式のドキュメントやコミュニティの方々が発信している情報をチェックするようにした方が良いです。
ある日、非推奨になっているもののあるので、人が発信している情報を見てびっくりしました!