La meilleure réponse pour l'instant est sans aucun doute la bonne.
Je vais essayer d'entrer dans les détails dans cette réponse.
Je vais répondre à la question, mais commencez par ceci : Ce n'est tout simplement pas la façon dont Dart doit être écrit, en partie parce que les membres privés de la bibliothèque facilitent la définition d'opérateurs tels que ==
. (Les variables privées d'un deuxième objet n'ont pas pu être vues pour la comparaison).
Maintenant que nous avons réglé cette question, je vais commencer par vous montrer comment il faut faire (library-private au lieu de class-private), puis je vous montrerai comment rendre une variable class-private si vous y tenez vraiment. C'est parti.
Si une classe n'a pas à voir les variables d'une autre classe, vous pouvez vous demander si elles ont vraiment leur place dans la même bibliothèque :
//This should be in a separate library from main() for the reason stated in the main method below.
class MyClass {
//Library private variable
int _val = 0;
int get val => _val;
set val(int v) => _val = (v < 0) ? _val : v;
MyClass.fromVal(int val) : _val = val;
}
void main() {
MyClass mc = MyClass.fromVal(1);
mc.val = -1;
print(mc.val); //1
//main() MUST BE IN A SEPARATE LIBRARY TO
//PREVENT MODIFYING THE BACKING FIELDS LIKE:
mc._val = 6;
print(mc.val); //6
}
Cela devrait être bon. Cependant, si vous vraiment veulent des données de classe privées :
Bien que techniquement vous ne soyez pas autorisé à créer des variables privées, vous pourrait l'émuler en utilisant la technique de fermeture suivante.
(CEPENDANT, vous devriez considérer AVEC PRÉCISION si vous en avez vraiment besoin et s'il n'existe pas un meilleur moyen, plus proche de Dart, de faire ce que vous essayez d'accomplir).
//A "workaround" that you should THINK TWICE before using because:
//1. The syntax is verbose.
//2. Both closure variables and any methods needing to access
// the closure variables must be defined inside a base constructor.
//3. Those methods require typedefs to ensure correct signatures.
typedef int IntGetter();
typedef void IntSetter(int value);
class MyClass {
IntGetter getVal;
IntSetter setVal;
MyClass.base() {
//Closure variable
int _val = 0;
//Methods defined within constructor closure
getVal = ()=>_val;
setVal = (int v) => _val = (v < 0) ? _val : v;
}
factory MyClass.fromVal(int val) {
MyClass result = MyClass.base();
result.setVal(val);
return result;
}
}
void main() {
MyClass mc = MyClass.fromVal(1);
mc.setVal(-1); //Fails
print(mc.getVal());
//On the upside, you can't access _val
//mc._val = 6; //Doesn't compile.
}
Alors oui. Soyez prudent et essayez de suivre les meilleures pratiques de la langue et tout devrait bien se passer.
EDIT
Apparemment, il y a une nouvelle syntaxe typedef qui est préférée pour Dart 2. Si vous utilisez Dart 2, vous devriez l'utiliser. Ou, encore mieux, utiliser les types de fonctions en ligne.
Si vous utilisez la seconde, elle sera moins verbeuse, mais les autres problèmes demeurent.