Flutterウィジェット(センターウィジェット)の子属性内で条件文を使用する方法 質問する

Flutterウィジェット(センターウィジェット)の子属性内で条件文を使用する方法 質問する

これまで、ウィジェット内で条件文を使用する必要があるときは常に、次の操作を実行していました (簡略化されたダミーの例として Center と Containers を使用)。

new Center(
  child: condition == true ? new Container() : new Container()
)

ただし、if/else ステートメントを使用しようとすると、デッド コード警告が表示されます。

new Center(
  child: 
    if(condition == true){
      new Container();
    }else{
      new Container();
    }
)

興味深いことに、switch case ステートメントを試したところ、同じ警告が表示され、コードを実行できませんでした。何か間違ったことをしているのでしょうか、それとも、デッド コードがあると Flutter が判断せずに if/else または switch ステートメントを使用できないのでしょうか。

ベストアンサー1

実際には、 dart / flutter では、 andやその他のステートメントをインラインで使用できます。if/elseswitch

ビルダーを使用する

  Widget build(BuildContext context) {
    return Container(
      child: Builder(
        builder: (context) {
          if (true) //
            return "tis true";

          return "anything but true";
        },
      ),
    );
  }

または即時の無名関数

  Widget build(BuildContext context) {
    return Container(child: () {
      if (value == 1) {
        return Text('tis true');
      }
      return Text('anything but true');
    }());
  }

UI の「マークアップ」にロジックを直接追加しすぎることは強くお勧めしませんが、Dart の型推論には少し作業が必要であることがわかったので、そのようなシナリオでは役立つ場合があります。

三項演算子を使用する

condition ? Text("True") : null,

コレクション内でIf文またはFor文、あるいはスプレッド演算子を使用する

children: [
  ...manyItems,
  oneItem,
  if(canIKickIt)
    ...kickTheCan
  for (item in items)
    Text(item)

方法を使用する

child: getWidget()

Widget getWidget() {
  if (x > 5) ...
  //more logic here and return a Widget

編集 - Dart 3.0 の新機能

Dart 3.0 では、パターン マッチング、デストラクチャリング、ガード句を使用するために、if-case や switch 式などの新しい機能が追加されています。
https://dart.dev/language/patterns

スイッチ式

これで、switch を式として使用できるようになりました。https://dart.dev/language/branches#スイッチ式

child: switch (task) {
  Task_completed(:date) => Text("completed on $date"),
  Task_overdue(:priority) => Text("$priority"),
},

if-case (Dart 3.0 の新機能)

チェックする条件が 1 つまたは少数の場合は、switch ではなく if-case を使用します。https://dart.dev/language/branches#if-case

return ListView(children: [
  Text('header'),
  if (pair case [int x, int y]) // 
    Text('Coordinates: ($x, $y)') // 
  else
    Text('No coordinates given'),
]);

おすすめ記事