Anunciando — Dash

Bloc provider hecho fácil

Cesar Vega
Comunidad Flutter
4 min readMar 26, 2019

--

Este artículo es una traducción de un artículo publicado originalmente en inglés por Vinícius Sossella en Medium. Por favor, visita el siguiente enlace y recomienda el artículo original si te gusta el contenido:

¡Hola amigos, hoy estoy muy contento de anunciar a Dash! Una nueva forma de proveer y eliminar BLoC. En este artículo explicaré por qué se creó este paquete y el problema que intenta resolver.

Dash

El problema…

Cuando empezamos a utilizar el BloC en nuestro proyecto Flutter optamos por crear una clase de proveedor de bloc, cuya responsabilidad era, por supuesto, proporcionar blocs. Esta clase se extendía desde la clase InheritedWidget, pero pronto nos dimos cuenta de que teníamos un problema para cerrar/desintegrar los streams de nuestro bloc porque no tiene control sobre el ciclo de vida de los widgets.

Después de algún tiempo aprendimos que un buen enfoque para cerrar el stream de nuestro bloc sería hacer que nuestra clase stateful proveedora de blocs extendiera de la clase StatefulWidget la cual permite, a través del método dispose() sobreescrito, cerrar nuestros streams.

¡Bien! ¡PERO!

Esta solución funcionaba bien hasta que nos dimos cuenta de que extender nuestra clase provider de la clase StatefulWidget en realidad estaba incrementando el costo de proporcionar nuestra clase bloc debido a la complejidad de su tiempo. En otras palabras, se incrementó desde un Tiempo Constante (InheritedWidget) a un Tiempo Lineal (StatefulWidget).

¡Ok! ¿Y ahora?

La solución fue crear una clase Provider que extiende de InheritedWidget (que podría proporcionar a nuestra clase bloc con tiempo constante) y otra clase BlocProvider que extiende de StatefulWidget (que nos permite cerrar los streams de nuestro bloc a través del método sobreescrito dispose). Puedes encontrar más información sobre este enfoque aquí.

Otro enfoque sería usar algo como bloc_provider, pero entonces tenemos que tener cuidado con el widget descendente. En otras palabras, cada vez que necesitemos alguna clase bloc, vamos a necesitar un BlocProvider (que no es más que un StatefulWidget). Se vería así:

BlocProvider<MyBloc>(
creator: (_context, _bag) => MyBloc(),
child: MyWidget(),
)

Así que, sí, después de todo, teníamos una solución final, pero todo esto tenía tanto código y complejidad que nos gustaría que fuera más fácil y simple, para este propósito empezamos el paquete Dash.

Hablemos un poco sobre dispose

Como dije antes, StatefulWidget proporciona una forma de cerrar los streams a través de su método dispose(). Desintegrar es uno de los muchos pasos del ciclo de vida de los widgets y se utiliza para dessuscribirse y cancelar todas las animaciones, streams, etc…

¿Cuándo se llama Dispose? Estábamos pensando que cuando el widget ya no estuviera en la pantalla del dispositivo, activaría el método dispose(), pero eso no es cierto. ¡El método dispose de StatefulWidget se llama realmente cuando el widget ya no está en el árbol! Más detalles aquí.

Por ejemplo, digamos que navegamos desde ‘page1’ (StatefulWidget) a otra página ‘page2’, el método dispose de la página1 no se llamará porque la página1 se mantiene en el árbol (a menos que elimine la página1 del árbol antes de navegar a la página2). Así que, en este caso de navegación, ¡el método dispose de la página 1 será llamado cuando eliminemos la página 1 del árbol!

¡Es hora de conocer a Dash! 😊

dash

Dash viene a ayudar a todos los que quieren usar el patrón BloC y les gustaría una forma sencilla de proporcionar y eliminar la clase bloc sin necesidad de código adicional.

Entonces, ¿cómo usamos el patrón BloC con el guión?

Crea una clase abstracta que será la clase Provider, en el siguiente ejemplo la llamamos Provider y agregamos la anotación @BlocProvider a cada bloc que tengas en tu proyecto. No olvides añadir (part 'provider.g.dart';) también.

Extiende cada bloc que tengas de la clase Dash Bloc y cree una función estática instance().

Ejecuta el siguiente comando:

  • flutter packages pub run build_runner build ‘Este comando va a generar la clase provider.g.dart;’.

--

--

Cesar Vega
Comunidad Flutter

Systems Engineer, postgrade in Software Development, postgrade in Information Security