120 votes

Colon après constructeur en fléchette

Ce code provient de la galerie Flutter et j'essaie de le comprendre et de l'adapter. Je saurais ce que cette syntaxe signifie:

 class DemoItem<T> {
  DemoItem({
    this.valueName,
    this.hintName,
    this.valueSurname,
    this.hintSurname,
    this.builder,
    this.valueToString

  }) : textController = new TextEditingController(text: valueToString(valueName));
 

En particulier, je saurais ce que signifie le signe deux-points après le constructeur et s'il existe un moyen de définir un autre TextEditingController, en plus de celui déjà défini.

179voto

Günter Zöchbauer Points 21340

La partie après l' : est appelé "initialisation de la liste. C'est un ,-liste séparée par des expressions qui peuvent accéder aux paramètres du constructeur et peuvent affecter à des champs d'instance, même final des champs d'instance. C'est pratique pour initialiser final champs avec les valeurs calculées.

La liste d'initialiseur est également utilisé pour appeler d'autres constructeurs comme : ..., super('foo').

Depuis environ Dart version 1.24 de la liste d'initialiseur prend également en charge assert(...) , ce qui est pratique pour vérifier les valeurs de paramètre.

L'initialiseur de liste ne peut pas lire à partir de this parce que le super constructeurs doivent être achevés avant l'accès à l' this est valable, mais il peut attribuer à l' this.xxx.

Soulignant que mentionné dans les commentaires par user693336:

Cela signifie également la liste d'initialiseur est exécuté avant que le corps du constructeur. Aussi l'initialiseur de listes de toutes les super-classes sont exécutés avant tout du constructeur organes sont exécutées.

23voto

binithb Points 376

Pour élaborer d'autres réponses et compléter la syntaxe, il est également possible d'avoir un vrai corps pour le constructeur avec du code d'initialisation

 NonNegativePoint(this.x, this.y) : assert(x >= 0), assert(y >= 0) {
    print('I just made a NonNegativePoint: ($x, $y)');
}
 

^ Ici, les affirmations se produisent avant l'exécution du corps

Un autre cas d'utilisation consiste à attribuer des valeurs aux champs finaux avant l'exécution du corps

 final String x;
final String y;

Point.fromJson(Map<String, num> json) : x = json['x'], y = json['y'] {
    print('In Point.fromJson(): ($x, $y)'); 
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X