1
votes

Dart assurez-vous que le booléen facultatif dans la classe n'est pas nul

Puisqu'il s'agit d'une valeur facultative, elle sera parfois nulle, alors comment éviter de générer une erreur? Est-ce la seule façon de le faire?

class QText extends StatelessWidget {
  QText(this.text, this.size, [this.bold]);

  final String text;
  final double size;
  final bool bold ?? false;

  @override
  Widget build(BuildContext context) {
    return Whatever..
  }
}

J'aimerais faire cela mais bien sûr cela ne fonctionne pas:

class QText extends StatelessWidget {
  QText(this.text, this.size, [this.bold]);

  final String text;
  final double size;
  bool bold;

  @override
  Widget build(BuildContext context) {
    bold = (bold == null) ? false : bold;
    return Whatever..
  }
}

p>


0 commentaires

4 Réponses :


1
votes

Vous devez définir votre valeur par défaut pour la variable à l'intérieur du constructeur:

Comme ci-dessous:

assert(bold != null,"bold cannot be null.")

Si rien n'est passé en gras variable alors il prendra la valeur par défaut comme false .

EDIT^

Vous pouvez utiliser l'assertion pour empêcher l'utilisateur de passer null , vous pouvez également imprimer un message si l'assertion échoue.

QText(this.text, this.size, [this.bold = false]): assert(bold != null,"bold cannot be null.");


3 commentaires

Ah bon? Vous pouvez donc le faire comme en Javascript. C'est super. Je ne sais pas pourquoi je n'ai même pas essayé ça lol.


Cela n'empêche pas un appelant de passer explicitement null comme argument.


Réponse mise à jour.



5
votes

Comme les champs sont définitifs, essayez de passer la valeur par défaut lors de l'initialisation du constructeur.

Ajoutez également une instruction assert pour vous assurer qu'elle n'est jamais initialisée à null.

Exemple :

class QText extends StatelessWidget {
  QText(this.text, this.size, [this.bold = false]) : assert(bold != null);

  final String text;
  final double size;
  final bool bold;

  @override
  Widget build(BuildContext context) {}
}


0 commentaires

3
votes

Pour l'instant, tous les types de Dart sont nullables. Même avec une valeur par défaut, quelqu'un peut explicitement passer null comme argument. Si vous voulez être absolument certain que la valeur n'est pas null , vous devez garder toutes les manières de définir la valeur. Dans l'exemple d'origine, la variable bold était publique et non définitive, ce qui signifie que vous devez également protéger le setter.

Exemple avec la variable finale:

class QText extends StatelessWidget {
  QText(this.text, this.size, [bool bold]) : this.bold = bold ?? false;

  final String text;
  final double size;
  bool _bold;

  bool get bold => _bold;
  void set bold(bool bold) { this._bold = bold ?? false; }
  ...
}

Exemple avec bold paramétrable :

class QText extends StatelessWidget {
  QText(this.text, this.size, [bool bold]) : this.bold = bold ?? false;

  final String text;
  final double size;
  final bool bold;
  ...
}

Vous pouvez utiliser une valeur par défaut, mais cela ne vous achète rien du point de vue de la sécurité. Il est cependant utile comme documentation.


0 commentaires

0
votes

On dirait que la question est bientôt obsolète car la langue empêchera la nullité dans ce cas très bientôt. La sécurité nulle est déjà disponible dans le canal de développement.

plus d'infos: https://medium.com/dartlang/announcing- sound-null-safety-defd2216a6f3


0 commentaires