🐡

【Flutter】Widgetをif文で制御する方法

2022/06/04に公開

Widgetをif文で制御できない

FlutterにてWigetを条件によって制御しようとした際、
直接if文で制御することができない。

これだとエラー出る


  Widget build(BuildContext context) {
    return const Center(
      child: 
      if(true){
        Text("a")
      }else{
        Text("b")
      }
    );
  }

なぜなのか

前提としてDart言語は以下2つの要素で構成されている

  • 式(Expression)
  • 文(Statement)

この2つの要素の説明については、式(Expression)と文(Statement)で以下の様に説明されている

文はそれ単独で完結する言語要素です。式はそれ単独では基本的に完結せず、文または式の一部として使用される言語要素です。また、式の最大の特徴として、値を返すという点が挙げられます(文は値を返しません)。例えば、定数式はその値そのものを返します。条件式は真偽値(True/False)を返す式です。条件式の一つとして比較式がありますが、条件式そのものはTrue/Falseを返せばなんでもよいため、単なるBooleanのTrue(定数式)もまた条件式になります。比較式は比較演算子を挟んで左辺と右辺の式を比較し、その結果をTrue/Falseで返すため、条件式になることができます。

ようするに

  • 式 : 値を返す。それ単独で完結しない要素。
  • 文 : 値を返さない。それ単独で完結する要素。

if文は「文」になる為、値を返さない。

Wigetを制御する場合は必ず戻り値が1つ必要となる。
そのため、if文ではWigetを制御することができない。

対策

対策① : 三項演算子を使用する

三項演算子を「式」の為、使用することができる。
複雑なものでなければ、これが最も簡単に使用することができる。


  Widget build(BuildContext context) {
    return const Center(
      child: (true)?Text("a"):Text("b")
    );
  }

対策② : 関数を使用する

Wigetが戻り値の関数も使用することができる。
条件が複雑になる場合はこれを使用する方がいい。


  Widget build(BuildContext context) {
    return Center(
      child: ifText(true),
    );
  }

  Widget ifText(bool value) {
    if (value) {
      return const Text("a");
    } else {
      return const Text("b");
    }
  }

参考

https://yumanoblog.com/flutter-if-switch/

https://yone-ken.hatenadiary.org/entry/20090421/p1

http://ichitcltk.hustle.ne.jp/gudon2/index.php?pageType=file&id=word_expression_statement.md

Discussion