Flutterで三項演算子じゃなくてif文とかswitch文使いたい時

公開:2020/10/09
更新:2020/10/11
2 min読了の目安(約2100字TECH技術記事

How to use conditional statement like ternary operator

三項演算子使う感じでif文使おうとすると使えないかなしみ

これはOK

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: (1 == 1) ? Text('1') : Text('2'),
        ),
      ),
    );
  }
}

こうすると使えない

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child:
          if(1 == 1){
            Text('1'),
          }
          else{
            Text('2'),
          }
        ),
      ),
    );
  }
}

何故か

三項演算子は式だけどif文はステートメントだから

値一個だけ帰ってこないと駄目なわけですね

対策

即時関数を利用する

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: (() {
            if (1 == 1) {
              return Text('1');
            } else {
              return Text('2');
            }
          })(),
        ),
      ),
    );
  }
}

これで無名関数で一つの値が帰ってくるので、if文が使える。
returnで値が帰ってきてればなんでもいいので途中で処理とかも書けますね。

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: (() {
            switch (1) {
              case 1:
                return Text('1');
              case 2:
                return Text('2');
            }
          })(),
        ),
      ),
    );
  }
}

同じ理由でswitch文も使える。
ただ即時関数見づらいので名前付きで切り分ける方が多い気がしますね...

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: switchBun(),
        ),
      ),
    );
  }

  Widget switchBun() {
    switch (1) {
      case 1:
        return Text('1');
      case 2:
        return Text('2');
    }
  }
}

終わり

意外と即時関数を使ってif文書いてるみたいな記事がなかったので書きました。
なんでif文が使えないんだと詰まったことがあったので、同じような人に届くと良いです。