Por varias razones, a veces build
se vuelve a llamar al método de mis widgets.
Sé que sucede porque un padre actualizó. Pero esto causa efectos no deseados. Una situación típica en la que causa problemas es cuando se usa de FutureBuilder
esta manera:
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: httpCall(),
builder: (context, snapshot) {
// create some layout here
},
);
}
En este ejemplo, si se volviera a llamar al método de compilación , desencadenaría otra solicitud http. Lo cual no es deseado.
Teniendo en cuenta esto, ¿cómo lidiar con la construcción no deseada? ¿Hay alguna forma de evitar la llamada de compilación?
flutter
flutter-widget
Rémi Rousselet
fuente
fuente
Respuestas:
El método de construcción está diseñado de tal manera que debe ser puro / sin efectos secundarios . Esto se debe a que muchos factores externos pueden desencadenar una nueva compilación de widgets, como:
Class.of(context)
cambio ( patrón)Esto significa que el
build
método no debe activar una llamada http ni modificar ningún estado .¿Cómo se relaciona esto con la pregunta?
El problema que enfrenta es que su método de compilación tiene efectos secundarios / no es puro, lo que hace que las llamadas de compilación extrañas sean problemáticas.
En lugar de evitar la llamada de compilación, debe hacer que su método de compilación sea puro, para que pueda llamarse en cualquier momento sin impacto.
En el caso de su ejemplo, transformaría su widget en un
StatefulWidget
extracto y luego extraería esa llamada HTTP ainitState
suState
:También es posible hacer un widget capaz de reconstruir sin obligar a sus hijos a construir también.
Cuando la instancia de un widget permanece igual; El aleteo a propósito no reconstruirá a los niños. Implica que puede almacenar en caché partes de su árbol de widgets para evitar reconstrucciones innecesarias.
La forma más fácil es usar
const
constructores de dardos :Gracias a esa
const
palabra clave, la instancia deDecoratedBox
permanecerá igual incluso si se llamara build cientos de veces.Pero puede lograr el mismo resultado manualmente:
En este ejemplo, cuando se notifica a StreamBuilder sobre nuevos valores,
subtree
no se reconstruirá incluso si lo hace StreamBuilder / Column. Ocurre porque, gracias al cierre, la instancia deMyWidget
no cambió.Este patrón se usa mucho en animaciones. Los usos típicos son
AnimatedBuilder
y todas las transiciones comoAlignTransition
.También puede almacenar
subtree
en un campo de su clase, aunque es menos recomendable ya que rompe la función de recarga en caliente.fuente
subtree
en un campo de clase interrumpe la recarga en caliente?StreamBuilder
es que cuando aparece el teclado, la pantalla cambia, por lo que las rutas deben reconstruirse. EntoncesStreamBuilder
se reconstruye yStreamBuilder
se crea un nuevo y se suscribe alstream
. Cuando seStreamBuilder
suscribe a astream
, sesnapshot.connectionState
convierte en loConnectionState.waiting
que hace que mi código devuelva aCircularProgressIndicator
, y luegosnapshot.connectionState
cambia cuando hay datos, y mi código devolverá un widget diferente, lo que hace que la pantalla parpadee con diferentes cosas.StatefulWidget
, suscribirme alstream
encendidoinitState()
y configurarlocurrentWidget
consetState()
elstream
envío de nuevos datos, pasandocurrentWidget
albuild()
método. ¿Hay alguna solución mejor?FutureBuilder
.Puede evitar llamadas de compilación no deseadas, de esta manera
1) Cree una clase Statefull secundaria para una pequeña parte individual de la IU
2) Uso de Proveedores de la biblioteca, por lo que su utilización, usted puede detener no deseados método de aumento de llamada
En estos a continuación situación llamada método de aumento
fuente
Flutter también tiene
ValueListenableBuilder<T> class
. Le permite reconstruir solo algunos de los widgets necesarios para su propósito y omitir los caros widgets.puede ver los documentos aquí ValueListenableBuilder flutter docs
o simplemente el código de muestra a continuación:
fuente