Aquí quería mostrarte una anécdota si es que se puede llamar así muy interesante que tuve aquí con los providers que es lo que yo estoy empleando aquí por ejemplo para definir el tema fíjate qué es lo que tengo Bueno aquí tengo lo que es el Provider es un poco:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
final appModel = Provider.of<AppModel>(context, listen: false);
_initData(context);
return MaterialApp(
***
theme: appTheme.currentTheme,
***
}
_initData(BuildContext context) async {
final appTheme = Provider.of<ThemeSwitch>(context, listen: false);
}
Esto es para gente Obviamente que ya maneja un poquito lo que es Flutter Pero de igual manera te lo explico aquí rapidito por aquí arriba tengo el Main aquí Bueno la inicialización para otras cosas aquí tengo lo que es el Provider Tengo un par Realmente el de tema y también tengo aquí el D model Hay muchas formas de definirlo Pero yo lo defino de esta forma en la cual coloco lo coloco anidado Recuerda que usualmente esto se coloca en la parte más alta de la aplicación si es que lo queremos utilizar en toda la aplicación en este caso es para manejar datos de usuario y lo que sería el tema los podía fusionar pero lo dej así a la final Entonces esta es la parte para mí más alta que viene siendo justamente aquí en el run app obviamente qué es lo que tenemos acá Este no nos interesa el que me interesa trabajar es este y aquí los estoy como quien dice instanciando para hacer algo en este caso el del tema tal cual puedes esperar es para manejar el tema el modo oscuro y el modo claro aquí lo puedes ver un poquito también en la práctica es mediante este switcher y precisamente lo colocamos en la parte más alta de la aplicación para que cuando nosotros seleccionemos el tema que queremos ver lo puede ir como quien dice escalando como si fuera una hoja de estilo en cascada es decir bien en cascada hacia abajo no sé cómo definirlo y cambian toda la aplicación es un poco lo realizado acá entonces en base simplemente un bullano que lo tenemos acá definido defino ya sea el color claro aquí fíjate que estoy tomando el color claro que tenemos por defecto que lo podemos aprovechar y ahí yo personalizo son mis colores para los colores de mi marca que son el moradito que casi siempre utilizo y lo mismo con el tema oscuro Entonces esto yo lo devuelvo y es la y es lo que la final se emplea por aquí al momento de armar el material app por aquí abajo tengo la parte del tema.
Entonces al ser Provider va a tener su escuchador ahí:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
final appModel = Provider.of<AppModel>(context, listen: false);
_initData(context);
return MaterialApp(
***
theme: appTheme.currentTheme,
***
}
_initData(BuildContext context) async {
final appTheme = Provider.of<ThemeSwitch>(context, listen: false);
}
Y automáticamente cambiarlo Mediante los mecanismos que yo probé que en este caso es este este drawer que yo tengo acá automáticamente va a cambiar todo muy bonito por acá Recuerda que este es el Main qué es lo que pasa que yo quería hacer aquí una especie de sincronización que no es realmente Una sincronización Pero recuerda que también la aplicación de Academia está disponible aquí mediante web Y si yo cambio aquí a modo claro este tiene el mismo usuario autenticado claro, entonces, si lo dejo tal cual esta, la app funciona correctamente, al reaccionar la app se sincroniza el modo oscuro según el que se tenga establecido en la base de datos.
Si comento el condicional acá vamos a quitarle un momento a ver qué pasa voy a comentarlo voy a recargar toda la aplicación otra vez y venimos acá Aquí voy a cambiar Bueno aquí debería colocar el modos oscuro para ver cuál tengo Tengo el claro no actualizado acá coloco el modo oscuro y fíjate que aquí cambia obviamente la primera vez que estás implementando Esto me pasó esto yo me quedé así como que Wow yo haciendo un pequeño paréntesis.
Considero que lo peor que le puede pasar a un programador no es que el programa no funcione porque si no funciona como el esperado Simplemente tienes que ver dónde está la falla el problema es cuando haces estas cosas que tú te dices Esto está buenísimo obviamente no tiene una para lo que queremos no es una implementación muy útil porque otra vez compárala con YouTube no conozco una persona que vaya a ver YouTube en la tableta o en el teléfono y al mismo tiempo va a verlo en la PC o lo ves En la tableta o lo ves en la PC dependiendo de dónde te encuentres por lo tanto no tiene sentido hacer este tipo de sincronización esto sería una sincronización.
Pero obviamente cuando tú te pones a analizar esto tiene que haber algo que no está funcionando correctamente porque esto otra vez no tiene que suceder obviamente Esto va a suceder solamente aquí aquí ya se volvió loco aquí no va a cambiar porque el desarrollo es acá Pero de igual manera te lo muestro el por qué ya que a ver qué es lo que puede estar sucediendo acá recordemos que esto no es una comunicación full duplex la comunicación Viene solo de un lado es decir cuando yo hago la petición al servidor que me indica qué color o qué modo estoy empleando es el modo oscuro o el modo claro por lo tanto en qué momento como demonios esto se va a sincronizar así de manera automática.
El punto está en saber cómo funciona esto que te lo había comentado antes para darse cuenta de qué es lo que está pasando por aquí tenemos que colocar un print:
_initData(BuildContext context) async {
print("test")
final appTheme = Provider.of<ThemeSwitch>(context, listen: false);
}
Obviamente al inicio te mostré que esto no estaba sucediendo te mostré que cuando actualizaba en la web no actualizaba en el otro Entonces el problema es en base a cuando elimine este condicional aquí fíjate que está apareciendo qué es lo que está sucediendo que se está llamando en ciclos por lo tanto aquí que es el mensaje estamos es enviando múltiples peticiones cada no sé segundo se pudiera decir un poquito más a nuestro servidor por lo tanto si se conecta mil usuario y tú me conoces ahí el sermón vas actuar en algún punto del servidor y no tiene sentido que hagas esto porque también le estás consumiendo el internet Al pobre cliente ya que Recuerda que esto a la final es una aplica móvil Aunque la esté ejecutando desde el el Windows Entonces cuál es el problema precisamente cómo le estamos actualizando. Aunque Fíjate que aquí tiene listen en falso:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
final appModel = Provider.of<AppModel>(context, listen: false);
Era un poco lo que a mí me costaba ver aquí obviamente tiene list en el falso por lo tanto no tiene sentido que haga esto, lo que está sucediendo aquí el que está echando la broma es el que está aquí arriba porque a la final todo está en el mismo widget.
El problema es que, al actualizar el providencial en el init, se actualiza en toda la aplicación, dando por resultado que se ejecuta el init en bucle:
class MyApp extends StatelessWidget {
_initData(BuildContext context) async {
final appTheme = Provider.of<ThemeSwitch>(context, listen: false);
appTheme.darkTheme = userPreference.themeDarkMode = darkMode;
}
Esto puede ser un error muy común y difícil de ver, luego no te vas a dar cuenta de por qué tu aplicación crashea de repente sin sin sin sentido alguno o directamente no funciona de de la manera correcta o directamente se coloca un poco lento ya que suponte que no es solamente esta pendejada que yo estaba haciendo que que era el tema si no estás armando un listado de no sé 1000 registros 100 1000 registros 100 registros o lo que sea que que tiene imágenes consultas a a a internet para obtener esas imágenes obviamente la aplicación siempre va a estar como que cargando cargando cargando cargando cargando y en algún punto va a colapsar Y seguramente vaya a cerrar y no sepas Por qué Y aparte de que va a tener un mal funcionamiento y es precisamente esto tienes que estar muy pendiente de que no existan esos benditos bucles infinitos tal cual me pasó a mí antes así que ese era el mensaje que te quería dar
- Andrés Cruz
Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter
Acepto recibir anuncios de interes sobre este Blog.
!Cursos desde!
4$
En Academia
Ver los cursos!Libros desde!
1$
Ver los libros