Comment recourir à une instruction conditionnelle dans l'attribut enfant d'un widget Flutter ?

Lorsque vous développez votre application mobile avec le framework Flutter, vous êtes obligé d'utiliser l'unique langage disponible : le langage Dart. Ce langage récent permet à Flutter de posséder un seul langage qui regroupe toutes les fonctionnalités nécessaires au développement d'une application, avec à la fois l'affichage et la gestion de l'arrière-plan. Le framework utilise un système de widget pour vous permettre de créer facilement votre application. Si vous souhaitez utiliser une condition pour les attributs de vos widgets, vous devez par contre faire attention à l'instruction que vous allez écrire.

Si vous souhaitez inclure des conditions dans votre code, vous ne pouvez utiliser directement les instructions "if/else" ou "switch". Par défaut dans le langage Dart, ces instructions ne fonctionnent pas avec un retour systématique. On ne peut donc mettre directement le test dans la définition de l'attribut.

//Ce morceau de code ne fonctionne pas, car les containers ne sont pas retournés
new Widget(
  child: 
    if (condition == true) {
      new widgetSiVrai(),
    } else {
      new widgetSiFaux(),
    }
)

Il existe plusieurs solutions pour réaliser un test avec un attribut. Dans le cas d'un "if/else" vous pouvez utiliser la notation ternaire en une ligne qui retourne systématiquement un élément.

new Widget(
  child: (condition == true) ? new widgetSiVrai() : new widgetSiFaux()
}

Vous pouvez encapsuler votre code dans une fonction. Elle peut être anonyme afin d'être déclarée directement avec votre widget, ou bien nommée, et dans ce cas elle devra être écrite pour retourner le type d'élément donc vous avez besoin (ici un widget).

//Fonction anonyme
new Widget(
  child: (() {
    if (condition == true) {
      monWidget = new widgetSiVrai(),
    } else {
      monWidget = new widgetSiFaux(),
    }
    return monWidget,
  }())
}

//Fonction déclarée
child: getWidget()
…
Widget getWidget() {
   if (condition == true) {
      monWidget = new widgetSiVrai(),
    } else {
      monWidget = new widgetSiFaux(),
    }
    return monWidget,
}

Une autre option est d'utiliser les collections. Avec une collection, les instructions "if" et "for" sont supportées, ainsi que les opérateurs du reste.

new Widget(
  child: [
    …Widgets,
    if (condition == true) {
        new widgetSiVrai(),
    else
        new widgetSiFaux(),
    ]
}

Android