Dans mon application flutter , j'ai des widgets comme ci-dessous:
const borderBase = (
color: Colors.red,
width: 2,
style: BorderStyle.solid,
)
Container(
decoration: BoxDecoration(
border: Border.all(
...borderBase,
),
),
child: Text('Container 1'),
)
Container(
decoration: BoxDecoration(
border: Border(
top: BorderSide(
...borderBase,
),
),
),
child: Text('Container 2'),
)
Container(
decoration: BoxDecoration(
border: Border(
top: BorderSide(
color: Colors.red,
width: 2,
style: BorderStyle.solid,
),
),
),
child: Text('Container 2'),
)
Les deux utilisent les mêmes propriétés strong> pour leurs frontières . Donc, je me demandais s'il y avait une façon de opérateur-épandeur d'insérer les mêmes propriétés pour les deux widgets? Peut-être aimer:
Container(
decoration: BoxDecoration(
border: Border.all(
color: Colors.red,
width: 2,
style: BorderStyle.solid,
),
),
child: Text('Container 1'),
)
4 Réponses :
Une telle chose n'existe pas.
Un opérateur de diffusion est en cours de développement, mais il ne concerne que les listes, pas les classes ( https://github.com/dart-lang/language/issues/47 )
Je vois. Il n'y a donc aucun moyen de réutiliser dynamiquement les mêmes propriétés? Cela signifie que je dois les répéter à chaque fois?
Oui, vous y êtes obligé. Mais vous pouvez en discuter sur la question. Je pense que c'est aussi une fonctionnalité intéressante.
Vous pouvez faire quelque chose comme ceci:
const BorderSide borderBase = BorderSide(
color: Colors.red,
width: 2,
style: BorderStyle.solid,
);
Container(
decoration: BoxDecoration(
border: Border.all(
color: borderBase.color,
width: borderBase.width,
style: borderBase.style,
),
),
child: Text('Container 1'),
)
Container(
decoration: BoxDecoration(
border: Border(
top: borderBase,
),
),
child: Text('Container 2'),
)
Ce n'est pas le meilleur mais il reste encore une certaine réutilisation.
Mais de cette façon, j'obtiens des erreurs dans la variable borderBase disant Nom non défini 'couleur' , et d'autres erreurs linter .
Oh, je pense que vous vouliez dire que borderBase var devrait utiliser la BorderSide () classe , non? Parce que cela semble fonctionner.
Voici un exemple factice du modèle d'opérateur de propagation de mon pauvre homme:
Je crée un constructeur de copie pour les classes souvent recréées avec de légères modifications. C'est un travail supplémentaire lors de la définition, mais cela est payant à de nombreux endroits lorsque vous utilisez ces classes. Le même modèle peut être utilisé sur les classes standard en sous-classant - juste pour se connecter à la question spécifique.
class Address {
final String street;
final String city;
final String state;
Address({this.street, this.city, this.state});
Address.copy(Address copy, {
String street,
String city,
String state,
}) : this (
street: street ?? copy.street,
city: city ?? copy.city,
state: state ?? copy.state,
);
}
class User {
final String firstName;
final String lastName;
final Address address;
final String email;
User({this.firstName, this.lastName, this.address, this.email});
User.copy(User copy, {
String firstName,
String lastName,
Address address,
String email,
}) : this (
firstName: firstName ?? copy.firstName,
lastName: lastName ?? copy.lastName,
address: address ?? copy.address,
email: email ?? copy.email,
);
}
void workWithUsers(User user) {
final userChangedEmail = User.copy(user, email: 'new@email.com');
final userMovedToAnotherStreet = User.copy(user, address: Address.copy(user.address, street: 'Newstreet'));
}
Maintenant que la fléchette a à la fois l'opérateur de propagation et extensions de classe , vous pourriez abuser des deux pour ajouter le support ... spread aux méthodes static . Bien que je doute que ce soit une bonne idée , j'ai créé un dartpad fonctionnel ( gist ) pour démontrer. Le résultat final ressemble à quelque chose comme:
final Border spreadBorder = Border.fromSides([
...Border(
left: BorderSide(color: Colors.pink),
right: BorderSide(color: Colors.pinkAccent),
).sides,
...Border(
top: BorderSide(color: Colors.blue),
bottom: BorderSide(color: Colors.blueAccent),
).sides,
]).scale(5);
enum _Side { top, right, bottom, left }
extension SpreadBorder on Border {
Iterable<MapEntry<_Side, BorderSide>> get sides {
return () sync* {
if (top != BorderSide.none) {
yield MapEntry(_Side.top, top);
}
// ...other yields
}();
}
static Border fromSides(Iterable<MapEntry<_Side, BorderSide>> parts) {
BorderSide top, right, bottom, left;
for (final borderPart in parts) {
switch (borderPart.key) {
case _Side.top:
top = borderPart.value;
break;
// ... other cases
}
}
return Border(
top: top,
right: right,
bottom: bottom,
left: left,
);
}
}