Flutter: Análisis sobre el gestor de estados Dash
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.
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.
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:
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.
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.