Flutter: Análisis sobre el gestor de estados Dash

Frank Moreno
Comunidad Flutter
Published in
3 min readJun 14, 2019

--

En marzo del 2019, en el artículo Announcing — Dash se anunciaba un gestor de estados inspirado en BLoC. Indicando una ventaja en velocidad de lectura de los estados de nuestra aplicación. Dicho artículo puedes encontrarlo traducido al español en Anunciando — Dash gracias a Cesar Vega.

Haciendo un resumen, este partía de la premisa de que Flutter BLoC accedía a los estados con una complejidad linean O(N) y proponía una forma en la que podía acceder con una complejidad constante O(1).

En este artículo haremos una autopsia a este gestor de estados y veremos porqué usarlo o no.

¿Realmente BLoC es de complejidad lineal?

Haciendo un rastreo de los commits, en el 30 de noviembre del 2018 en Flutter BLoC se emitió un commit en el cual el widget BlocProvider empezó a ser tipo stateless y para poder acceder a él se tenía que viajar a través de los widgets ancestor mediante el método context.ancestorWidgetOfExactType() . Dicho método, tal como dicen en Dash tiene una complejidad lineal motivando la construcción de este último gestor de estados.

Captura de pantalla del commit donde BlocProvider se convierte en StatelessWidget

NOTA: Si quieres entender como es que funciona el acceso a los estados provisto por los widgets ancestros, te recomiendo que leas mi otro artículo Inherited Widget Decodificado.

EL 15 de diciembre del 2018, hubo otro commit donde BlocProvider pasaba de ser un StatelessWidget a ser un StatefulWidget hasta la fecha.

Captura de pantalla de la sección del commit donde BlocProvider para de ser StatelessWidget a StatefulWidget

A fin de cuentas, para acceder a un BLoC, tenemos que viajar por todos los ancestros hasta encontrar al deseado. Por lo tanto, Dash tiene todo el sentido de existir.

¿Dash es otro gestor de estados diferente a BLoC?

Dash no intenta ser otro gestor de estados, sino un complemento a BLoC mediante un mecanismos en forma de tool que auto-genera código para acceder a un provider construido como InheritedWidget, el cual permite acceso a los estados con una complejidad constante O(1), también explicado aquí.

En el ejemplo de Dash, podemos ver cómo es que auto-genera el código:

Captura de pantalla del código auto-generado por Dash en el ejemplo del paquete.

Sobre dispose

Como ventaja adicional, Dash estaba pensado para poder emplear el método dispose para la liberación de memoria (puedes ver más detalles en el artículo Anunciando — Dash). Sin embargo, desde este mes (Junio del 2019), se ha empezado a integrar el uso automático de dispose dentro del propio paquete BLoC.

Captura de pantalla de los últimos commits

Conclusiones

BLoC ha sido una de las mejores opciones al momento de plantear la arquitectura de manejo de estados de nuestra aplicación. Sin embargo, hay mucho en lo cual trabajar. Dash sirve como un buen complemento para lograr optimizaciones en la velocidad de lectura de los estados, pero al no estar integrado, no va a mejorar a la velocidad que debería, ni mucho menos será siempre necesario porque Flutter BLoC puede llegar a implementar todas las mejoras por sí mismo.

Otra punto a tomar en cuenta es el BlocProviderTree que nos permite, de una manera sencilla, proveer de muchos BLoCs, pero Dash aún no ha complementado la optimización de este.

Si a todo esto le sumamos que provider es un paquete que ya nos provee todas estas ventajas de Dash sobre BLoC incluidas y aún tiene más cosas que ofrecer, podemos ver que BLoC y Dash ya no serían nuestra primera opción para la gestión de estados pese a su contribución a la arquitectura de gestión de estados.

Puedes seguirme en Twitter para ver más análisis como este.

--

--

Frank Moreno
Comunidad Flutter

Rust, Node.js, Go and Flutter developer. I want to create tools for better developer experience with good performance.