[Flutter]ListViewが難しかった

# きっかけ

長期休みに入り興味があったFlutterを始めた。
いろいろやってみて、まずListViewにつまづいた。つまづいたポイントとして、

- クラスの使い方
- 要素のUIの構成
- どのように要素にデータを渡すか

がある。

開発はXamarinを軽く触ったことがある程度で、初心者。
書籍は[基礎から学ぶFlutter](https://www.amazon.co.jp/基礎から学ぶ-Flutter-石井-幸次/dp/4863542941)を購入し、[公式サイト](flutter.dev)も見ながらスタートしたFlutter超初心者。また、Flutterを開発するにあたって日本語の記事が異常に少ないので書こうと思った。これからも何かつまづくことがあればちょくちょく書く予定。

# ListView

ListViewとは要素をスクロールできる画面に表示していくウィジェット。
FlutterにはYoutubeに公式チャンネルがあり、多くのウィジェットの紹介動画があり、短く、見やすい動画となっているのでおすすめ。もちろんListViewの動画もある。<iframe width="560" height="315" frameborder="0" allowfullscreen="" src="//www.youtube.com/embed/KJpkjHGiI5A"></iframe><br><a href="https://youtube.com/watch?v=KJpkjHGiI5A">ListView (Flutter Widget of the Week)</a>

## ListView.separated

ちょっと調べてみて、`ListView.separated`コンストラクタが使いやすそうだったので使ってみた。
他にも`ListView`、`ListView.builder`、`ListView.custom`があるがまだよくわからない（そのうち追記するかも）。
`ListView.separated`コンストラクタの使用例は、最後に書いたので参考にして欲しい。

公式サイトによると、このコンストラクタは以下のようになっているらしい。

[https://api.flutter.dev/flutter/widgets/ListView/ListView.separated.html](https://api.flutter.dev/flutter/widgets/ListView/ListView.separated.html)

>ListView.separated({ 
Key key, 
Axis scrollDirection: Axis.vertical, 
bool reverse: false, 
ScrollController controller,
bool primary, 
ScrollPhysics physics, 
bool shrinkWrap: false, 
EdgeInsetsGeometry padding, 
@required IndexedWidgetBuilder itemBuilder, 
@required IndexedWidgetBuilder separatorBuilder, 
@required int itemCount, 
bool addAutomaticKeepAlives: true, 
bool addRepaintBoundaries: true, 
bool addSemanticIndexes: true, 
double cacheExtent 
})

`@required`がついているものは必須の引数で、これらを解説する。


### itemBuilder


この引数には、```ListView```のアイテムを作るウィジェットを入れる。ここのウィジェットで作ったものがListViewの1アイテムとして`itemCount`の数分作られる。
また、関数は

```sample.dart
Widget functionName(BuildContext context, int index){}
```
のように書く。

### separatorBuilder

`itemBuilder`と同様の形式の関数を書く。公式サイトより引用し、

```sample.dart
(BuildContext context, int index) => Divider()
```
と書いたが、よくわかっていないため後に追記する。
（知っている方いたら教えてください！）

### itemCount

要素数。```int```型の整数値のみを入れる。```List<T> list```を使う場合、```list.length```を使うといいっぽい。


# 使用例

書いてみたプログラムと実行結果。

## プログラム
```sample.dart
import 'package:flutter/material.dart';
import 'dart:math';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MainPage(),
    );
  }
}

class Person {
  int age;
  final String name;
  Person({this.age, this.name});
}

class MainPage extends StatelessWidget {
  List<Person> _data = [
    Person(age: 20, name: "Satou"),
    Person(age: 18, name: "Suzuki"),
    Person(age: 30, name: "Tanaka")
  ];

  Widget MyListView() {
    return ListView.separated(
        itemBuilder: (BuildContext context, int index) {
          return Container(
            padding: EdgeInsets.all(10),
            child: Row(
              children: <Widget>[
                Container(
                  alignment: Alignment.topLeft,
                  child: Text(
                    _data[index].name,
                    style: TextStyle(fontSize: 25)
                  ),
                ),
                Spacer(),
                Container(
                  alignment: Alignment.bottomRight,
                  child: Text(
                    _data[index].age.toString(),
                    style: TextStyle(fontSize: 20)
                  ),
                )
              ],
            )
          );
        },
        separatorBuilder: (BuildContext context, int index) => Divider(),
        itemCount: _data.length);
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
            appBar: AppBar(title: Text("List Page")),
            body: Container(color: Colors.white, child: MyListView())));
  }
}
```

## 実行結果

<img width="469" alt="スクリーンショット 2020-03-19 22.17.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552830/61e363fc-cc0d-579b-ebb7-b656e63e6945.png">