これまで、ウィジェット内で条件文を使用する必要があるときは常に、次の操作を実行していました (簡略化されたダミーの例として 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/else
switch
ビルダーを使用する
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'),
]);