8
votes

Flutter: mot-clé @required

Je ne comprends pas vraiment comment fonctionne @required . Par exemple, j'ai vu ce code:

class Test{
  final String x;
  Test({
    @required this.x
  });

  factory Test.initial(){
    return Test(x: "");
  }

}

Mais que devrait faire @required ici? On dirait que cela fait d'un paramètre facultatif un paramètre non facultatif.


0 commentaires

4 Réponses :


2
votes

@required est une annotation qui créera un avertissement pour que vous vous rappeliez que le paramètre nommé est nécessaire pour que la classe fonctionne comme prévu. Cela ne créera pas d'erreurs de compilation, du moins pour ce que je sais.


2 commentaires

Mais si ce paramètre est nécessaire, pourquoi est-il défini comme facultatif?


Principalement pour la lisibilité du code. Les paramètres non nommés ne peuvent pas être rapidement compris par quelqu'un qui lit une instanciation d'objet.



6
votes

@required est nécessaire lorsque vous avez plus d'un paramètre nommé et que vous souhaitez que certains des paramètres soient obligatoires, vous l' @required aide de @required .

Exemple

class Test {
  final String a; // say a is mandatory
  final String b;
  final String c;
  final String d;

  Test({
    @required this.a, // annotate it using required
    this.b,
    this.c,
    this.d,
  });
}


8 commentaires

même si je ne mentionne pas l'annotation, il est également obligatoire de passer le paramètre car le constructeur par défaut est surchargé par ce constructeur. Quelle en est l'utilité alors?


@ NullByte08 Je ne vous ai pas compris clairement, vous n'avez pas besoin de transmettre de valeur à a si vous ne l' @required pas avec @required .


non, il est nécessaire de passer la valeur à a même si elle n'est pas annotée avec @required


@ NullByte08 J'adorerais si vous pouvez poster une question avec ce détail, je peux mieux vous aider.


@ NullByte08 Y a-t-il un problème lors de la création d'une nouvelle question?


vérifiez ce code repl.it/repls/ClutteredAppropriateDriverwrapper


Vous utilisez des arguments de position, non nommés.


Continuons cette discussion en chat .



1
votes

@required vous oblige à transmettre les arguments marqués @required lors de la création d'un objet de classe. Par exemple, lorsque vous affichez une boîte de dialogue, vous marquez le contexte comme requis car vous ne pouvez pas afficher la boîte de dialogue sans avoir un contexte valide. Mais, vous ne devez pas en abuser.


0 commentaires

10
votes

Paramètres requis par défaut

Les paramètres d'un constructeur de classe ou d'une fonction sont obligatoires par défaut.

import 'package:meta/meta.dart';

class Test {
  final String x;
  Test({@required this.x});
}

Vous n'êtes pas autorisé à faire ceci:

dependencies:
  meta: ^1.2.2

Vous devez faire ceci:

final value = Test(); 
// The parameter 'x' is required.

Paramètres nommés facultatifs

Si vous entourez un paramètre d'accolades, en plus de devenir un paramètre nommé, il devient également facultatif.

class Test {
  final String x;
  Test({@required this.x});
}

C'est acceptable:

final value = Test(x: 'hello'); 

Alors est-ce:

final value = Test(); 

Dans le cas du premier, cependant, value.x est null .

Paramètres nommés obligatoires

Parfois, un développeur ne souhaite pas autoriser un paramètre à être null , il y ajoute donc l'annotation @required .

class Test {
  final String x;
  Test({this.x});
}

Ce n'est plus ok:

final value = Test('hello');

Ce n'est qu'un avertissement, mais cela rappelle aux gens qu'ils doivent ajouter le paramètre manquant.

Créer vos propres paramètres requis

Si vous utilisez Flutter, vous avez déjà accès à l'annotation @required et vous pouvez l'utiliser lorsque vous écrivez vos propres classes et fonctions.

Si vous travaillez sur un projet non Flutter dans Dart, vous devez importer le meta package de l'équipe Dart.

pubspec.yaml :

final value = Test(); 
// 1 positional argument(s) expected, but 0 found.

Code de fléchette :

class Test {
  final String x;
  Test(this.x);
}

Mise à jour

Depuis novembre 2020, la sécurité nulle est dans le canal bêta Flutter / Dart et cela inclut le mot-clé required , qui remplace l'annotation @required . Ce sera bientôt dans le canal stable.


0 commentaires