どうも、ちょげ(@chogetarou)です。
Columnの要素を動的に作成する方法を紹介します。
方法

Columnの要素を動的に作成する方法は3つあります。
for
1つは、「for文」もしくは「for in文」を使う方法です。
具体的には、Columnの引数「children」のリスト内でfor文を使います。
Column(
children: [
for (var i = 0; i < 10; i++)
Widget(),
],
),
リスト内でfor文を使う時は1つだけ条件があり、{}は使えず、1文で完結出来るものとなります。
以下は、使用例です。

@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
body: Column(
mainAxisSize: MainAxisSize.min,
children: [
for (var i = 0; i < 10; i++)
Container(
height: 70,
color: i.isOdd ? Colors.blue : Colors.pink,
),
],
),
),
);
}
map
2つ目は、配列のmapメソッドを使う方法です。
具体的には、List、Set、Mapが持つmapメソッドを使い、全ての要素で処理をし、ウェジェットのリストを返します。
そのリストをColumnの引数「children」に指定します。
Column(
children: _list
.map(
(e) => Widget(),
)
.toList(),
),
以下は、使用例です。

var _numbers = [
1,
2,
3,
4,
5,
];
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
body: Column(
children: _numbers
.map(
(e) => Container(
height: 100,
width: double.infinity,
color: Colors.blue[100],
child: Text('$e'),
alignment: Alignment.center,
),
)
.toList(),
),
),
);
}
関数
3つ目は、関数を使う方法です。
具体的には、表示するウェジェットのリストを戻り値とする関数を作ります。
List<Widget> _createList() {
~~~リストの作成~~~
return WidgetList();
}
以下は、使用例です。

@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
body: Column(
children: _createList(),
),
),
);
}
List<Widget> _createList() {
var _list = <Widget>[];
for (var i = 0; i < 10; i++) {
_list.add(
Container(
height: 70,
width: double.infinity,
color: Colors.green[100],
child: Text('$i'),
alignment: Alignment.center,
),
);
}
return _list;
}
まとめ
Columnの要素を動的に作成する方法は、次の3つです。
- for文もしくはfor in文
- mapメソッド
- 関数
コメント