フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

【Flutter/Dart】collection if と collection for が便利 (Control Flow Collection)

普段は Go を触ってるので Collection if / for が新鮮だったのでメモ。

var nav = ['Home', 'Furniture', 'Plants', if (promoActive) 'Outlet'];

これは promoActiveOutlet ならコレクションに追加。

var nav = [for (i = 0; i < 10; i++) "aaa"]

これは aaa を10回追加したコレクションの生成。

Control Flow Collection の Proposal

モチベーションとしては Flutter の構築時は上から下へ、外側から内側にウィジェットを読むとそれがそのままアプリの見た目になっているのが良いとされている。ただ条件分岐を使うと、別のところでウィジェットを組み立てて追加したり消したりなどが発生する。

Widget build(BuildContext context) {
  var buttons = <Widget>[
      IconButton(icon: Icon(Icons.menu)),
      Expanded(child: title),
  ];

  if (isAndroid) {
    buttons.add(IconButton(icon: Icon(Icons.search)));
  }

  return Row(
    children: buttons,
  );
}

すると良いアプローチがとれなくなるので、コレクション内でコントロールできるようになる。 提案されてたのがこちら。

Widget build(BuildContext context) {
  return Row(
    children: [
      IconButton(icon: Icon(Icons.menu)),
      Expanded(child: title),
      if (isAndroid) IconButton(icon: Icon(Icons.search)),
    ]
  );
}

memo

  • 他の言語で(自分が)見たことないのは、Flutter の構築時は上から下へ、外側から内側にウィジェットを読むとそれがそのままアプリの見た目になっているのが良い という言語思想が強いから?
  • proposal みると面白い、モチベーションのところでカルチャーが学べる
  • flutter 公式 docs から proposal 飛べるのよい
  • control flow collection 便利