Aleteo. Simplificaci贸n del dise帽o de widgets con extensiones de dardo

imagen



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 ViewModifierSwiftUI, 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 MyWidgetwidget 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 Widgetcon 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 MyWidgetsiguiente 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 ViewModifierde 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!




All Articles