En Dart 2.7, nos presentaron las extensiones que permiten a los desarrolladores agregar nuevas funcionalidades a los tipos existentes. 隆Las extensiones pueden ser de gran ayuda no solo cuando escribimos l贸gica de negocios, sino tambi茅n cuando tenemos otras tareas! Un ejemplo de tal tarea es trabajar con widgets.
Basado en mi experiencia con el desarrollo de iOS, inspirado en ViewModifier
SwiftUI, quer铆a descubrir c贸mo usar las extensiones Dart de una manera similar para reducir el desorden visual que resulta de una gran anidaci贸n del 谩rbol de widgets.
隆Tomemos un ejemplo!
Opci贸n con widgets anidados
A continuaci贸n se muestra un MyWidget
widget con texto dentro Padding
(del ejemplo est谩ndar con dartpad.dev ).
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return
Padding(
padding: const EdgeInsets.all(16),
child: Text('Hello, World!', style: Theme.of(context).textTheme.headline4)
);
}
}
Ahora veamos c贸mo podemos hacer lo mismo con las extensiones Dart.
Opci贸n con extensiones
Creamos una extensi贸n de la clase Widget
con el m茅todo padding
. Cuando se llama a este m茅todo, el objeto se envolver谩 en Padding
:
extension WidgetModifier on Widget {
Widget padding([EdgeInsetsGeometry value = const EdgeInsets.all(16)]) {
return Padding(
padding: value,
child: this,
);
}
}
Con la nueva extensi贸n, podemos actualizar de la MyWidget
siguiente manera:
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Text('Hello, World!', style: Theme.of(context).textTheme.headline4)
.padding();
}
}
, , ! , , .
:
extension WidgetModifier on Widget {
// ...
Widget background(Color color) { //
return DecoratedBox(
decoration: BoxDecoration(
color: color,
),
child: this,
);
}
Widget cornerRadius(BorderRadiusGeometry radius) { //
return ClipRRect(
borderRadius: radius,
child: this,
);
}
Widget align([AlignmentGeometry alignment = Alignment.center]) { //
return Align(
alignment: alignment,
child: this,
);
}
}
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Text('Hello, World!', style: Theme.of(context).textTheme.headline4)
.padding()
.background(Colors.lightBlue)
.cornerRadius(BorderRadius.all(Radius.circular(8.0)))
.padding(EdgeInsets.symmetric(horizontal: 8, vertical: 16))
.background(Colors.purple);
}
}
dartpad.dev
? , ! , , .
En este art铆culo, consideramos un enfoque alternativo para formar un 谩rbol de widgets en un proyecto Flutter, utilizando un concepto similar al ViewModifier
de SwiftUI. Con este enfoque, podemos simplificar los 谩rboles de widgets reduciendo su anidamiento. Y he demostrado solo unos pocos ejemplos de tales extensiones, pero con el mismo principio, puede crear muchas nuevas para otros casos en los que ser谩n igual de 煤tiles.
隆Gracias por tu atenci贸n! Espero que encuentres 煤til esta publicaci贸n. Si tiene alguna pregunta o comentario sobre este material, 隆no dude en ponerse en contacto conmigo en Twitter !
隆Hasta la proxima vez!