dart - examples - flutter stack
¿Cuál es la relación entre los widgets con estado y sin estado en Flutter? (6)
Un widget con estado se define como cualquier widget que cambie su estado dentro de su vida útil. Pero es una práctica muy común que un StatelessWidget
tenga un StatefulWidget
como uno de sus hijos. ¿ StatelessWidget
no se convierte en estado si tiene StatefulWidget
como uno de sus hijos?
Intenté buscar en la documentación como parte del código de StatelessWidget
, pero no pude descubrir cómo un StatelessWidget
puede tener un Statefulwidget
como sus hijos y seguir siendo StatelessWidget
.
¿Cuál es la relación y la diferencia entre los widgets con estado y sin estado en Flutter?
Como se menciona en los documentos aleteo.
¿Cuál es el punto de?
Algunos widgets son con estado, y algunos son apátridas. Si un widget cambia, el usuario interactúa con él, por ejemplo, es con estado. El estado de un widget consiste en valores que pueden cambiar, como el valor actual de un control deslizante o si se marca una casilla de verificación. El estado de un widget se almacena en un objeto de Estado, separando el estado del widget de su apariencia. Cuando el estado del widget cambia, el objeto de estado llama a setState () y le indica al marco que vuelva a dibujar el widget.
Un widget sin estado no tiene un estado interno para administrar. Icon, IconButton y Text son ejemplos de widgets sin estado, en la subclase StatelessWidget.
Un widget con estado es dinámico. El usuario puede interactuar con un widget con estado (por ejemplo, escribiendo en un formulario o moviendo un control deslizante), o cambia con el tiempo (quizás una fuente de datos haga que se actualice la interfaz de usuario). Checkbox, Radio, Slider, InkWell, Form y TextField son ejemplos de widgets con estado, que son subclase StatefulWidget.
https://flutter.io/tutorials/interactive/#stateful-stateless
De la documentación en flutter.io :
... Lo importante que se debe tener en cuenta aquí es que los widgets sin estado y con estado se comportan igual. Reconstruyen cada fotograma, la diferencia es que StatefulWidget tiene un objeto State que almacena los datos del estado en los marcos y los restaura.
Si tiene alguna duda, siempre recuerde esta regla: si un widget cambia (el usuario interactúa con él, por ejemplo) es un estado. Sin embargo, si un hijo está reaccionando para cambiar, el padre que lo contiene puede seguir siendo un widget sin estado si el padre no reacciona para cambiar.
El estado es información que (1) se puede leer de forma sincrónica cuando se construye el widget y (2) puede cambiar durante la vida útil del widget. Es responsabilidad del implementador del widget asegurarse de que se notifique rápidamente al Estado cuando dicho estado cambie, utilizando State.setState.
StatefulWidget :
Un widget con estado es un widget que describe parte de la interfaz de usuario mediante la construcción de una constelación de otros widgets que describen la interfaz de usuario de manera más concreta. El proceso de construcción continúa de forma recursiva hasta que la descripción de la interfaz de usuario es completamente concreta (por ejemplo, consiste completamente en RenderObjectWidgets, que describen RenderObjects concretos).
Los widgets con estado son útiles cuando la parte de la interfaz de usuario que está describiendo puede cambiar dinámicamente, por ejemplo, debido a que tiene un estado interno impulsado por reloj, o depende de algún estado del sistema. Para composiciones que dependen solo de la información de configuración en el objeto en sí y del BuildContext en el que se infla el widget, considere usar StatelessWidget.
Las propias instancias de StatefulWidget son inmutables y almacenan su estado mutable en objetos State separados creados por el método createState, o en los objetos a los que ese Estado se suscribe, por ejemplo, los objetos Stream o ChangeNotifier, a los que se almacenan las referencias en los campos finales del StatefulWidget sí mismo.
StatelessWidget :
Un widget sin estado es un widget que describe parte de la interfaz de usuario mediante la construcción de una constelación de otros widgets que describen la interfaz de usuario de manera más concreta. El proceso de construcción continúa de forma recursiva hasta que la descripción de la interfaz de usuario es completamente concreta (por ejemplo, consiste completamente en RenderObjectWidgets, que describen RenderObjects concretos).
Los widgets sin estado son útiles cuando la parte de la interfaz de usuario que está describiendo no depende de otra cosa que no sea la información de configuración en el objeto en sí y el BuildContext en el que se infla el widget. Para composiciones que pueden cambiar dinámicamente, por ejemplo, debido a tener un estado interno impulsado por el reloj, o dependiendo de algún estado del sistema, considere usar StatefulWidget.
Un StatelessWidget nunca se reconstruirá por sí mismo (pero puede desde eventos externos). Un StatefulWidget puede. Esa es la regla de oro.
PERO cualquier tipo de widget puede ser repintado en cualquier momento.
Sin estado solo significa que todas sus propiedades son inmutables y que la única forma de cambiarlas es crear una nueva instancia de ese widget. Por ejemplo, no bloquea el árbol de widgets.
Pero no debes preocuparte por cuál es el tipo de tus hijos. No tiene ningún impacto en ti.
Los widgets sin estado son widgets estáticos. Solo necesitas pasar algunas propiedades antes de inicializar los Widgets sin estado. No dependen de ningún cambio de datos o cualquier cambio de comportamiento. Por ejemplo. Texto, icono, RaisedButton son widgets sin estado.
Los widgets de estado son widgets dinámicos, se pueden actualizar durante el tiempo de ejecución en función de la acción del usuario o el cambio de datos. Si un Widget puede cambiar su estado durante el tiempo de ejecución, será un widget con estado.
Editar 15/11/2018
Los Widgets sin estado pueden volver a renderizarse si los datos de entrada / externos cambian (los datos externos son datos que se pasan a través del constructor). Debido a que los Widgets sin estado no tienen un estado, se procesarán una vez y no se actualizarán, pero solo se actualizarán cuando cambien los datos externos.
Mientras que los Widgets de estado tienen un estado interno y pueden volver a renderizarse si los datos de entrada cambian o si el estado del Widget cambia.
Tanto los widgets sin estado como los con estado tienen un ciclo de vida diferente.
Pregunta de sobre la ausencia de estado frente a la apatridia .
En Flutter, la diferencia es que los widgets sin estado se pueden definir solo con todos los argumentos del constructor. Si creas dos widgets sin estado usando los mismos argumentos, entonces serán los mismos.
Sin embargo, un widget con estado no es necesariamente el mismo que otro creado con los mismos argumentos de constructor. Podría estar en un estado diferente.
En realidad, un widget con estado es inmutable (sin estado) en sí mismo, pero Flutter administra un objeto de estado separado y lo asocia con el widget, como se explica en el StatefulWidget . Esto significa que cuando Flutter reconstruye un widget con estado, verificará si debe reutilizar un objeto de estado anterior y, si lo desea, adjuntará ese objeto de estado al widget.
El widget padre no tiene estado porque no le importa el estado de su hijo. El propio niño con estado (o técnicamente Flutter) se hará cargo de su propio estado.
En un nivel alto, estoy de acuerdo en que esto hace que el widget padre tenga estado, porque dos padres pueden contener dos hijos con diferentes estados y, por lo tanto, ser ellos mismos técnicamente diferentes. Pero desde el punto de vista de Flutter, construye el widget padre sin preocuparse por el estado y solo cuando se construye el niño considerará su estado de estado.