すらぼうの開発ノート

モバイルアプリエンジニアのメモ

【Flutter / Dart】リスト(List)の生成方法まとめ

本エントリではList型データの生成方法を説明する。


Listとは

ListIterableを継承したクラスで、複数の要素を格納できる順序ありのデータ型。

api.dart.dev


Listインスタンスの生成

Listクラスには名前付きコンストラクタが複数個用意されている。 以下で各名前付きコンストラクタを使用したインスタンスの生成方法を説明する。

リテラルを代入

直接リストデータを代入する方法。

<T>表記(genericsという)でデータ型を指定しない場合List<dynamic>型になる。

List.empty()

名前の通り空のListデータ[]が生成される。

List.filled(要素数, 要素の値)

要素の値要素数個格納したListインスタンスを生成する。

上記のコードではint型のデータである1を10個格納したListが生成されている。

List.from(他のIterable型データ)

他のIterable型データをコピーしたListインスタンスを生成する。

List.generate(要素数, 要素を生成するコールバック関数(引数: index))

コールバック関数の引数にindexを受け取り、戻り値が要素となる。これを要素数回繰り返してListインスタンスを生成する。

ただ言葉だと若干分かりづらいので、上記のコードを例にもう少し詳細に説明する。

List.generate()のちょっと詳しい説明

(index) => index * 2は次の表記を簡潔にしたもの。

(int index){
  return index * 2;
}

なので引数に受け取った値を2倍して返す。

List.generate()では第二引数に割り当てられたコールバック関数を第一引数に割り当てた要素数だけコールする。この時コールバック関数の引数には要素番号(つまりindex)が割り当てられる。そしてコールバック関数の戻り値が、最終的に生成されるListインスタンスの要素となる。

なのでListインスタンス生成のフローは次の様になる。

  1. index0が渡され0 * 2がindex = 0の要素になる。
  2. index1が渡され1 * 2がindex = 1の要素になる。
  3. index2が渡され2 * 2がindex = 2の要素になる。
  4. index3が渡され3 * 2がindex = 3の要素になる。
  5. index4が渡され4 * 2がindex = 4の要素になる。
  6. index5が渡され5 * 2がindex = 5の要素になる。
  7. index6が渡され6 * 2がindex = 6の要素になる。
  8. index7が渡され7 * 2がindex = 7の要素になる。
  9. index8が渡され8 * 2がindex = 8の要素になる。
  10. index9が渡され9 * 2がindex = 9の要素になる。

このステップを経て、最終的には[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]が生成される。

List.of(他のIterable型データ)

他のIterable型データをコピーしたListインスタンスを生成する。

List.unmodifiable(他のIterable型データ)

他のIterable型データをコピーしたListインスタンスを生成する。 ただし生成されたListインスタンスは後述するaddなどの要素を変更する操作ができない。