¿Puede alguien con experiencia en el uso CustomSingleChildLayouty las CustomMultiChildLayoutclases poder explicar en detalle (con ejemplos) cómo usarlos?
Soy nuevo en Flutter y estoy tratando de entender cómo usarlos. Sin embargo, la documentación es horrible y no está clara. Traté de buscar en Internet ejemplos, pero no hay otra documentación.
Estaría eternamente agradecido si pudieras ayudar.
¡Gracias!
                    
                        flutter
                                dart
                                flutter-layout
                                
                    
                    
                        Walter M
fuente
                
                fuente

Respuestas:
En primer lugar, quiero decir que me complace ayudarlo con esto, ya que puedo entender sus dificultades: también es beneficioso resolverlo usted mismo (la documentación es increíble).
Lo que
CustomSingleChildLayouthaga será obvio después de que te lo expliqueCustomMultiChildLayout.CustomMultiChildLayoutEl objetivo de este widget es permitirle diseñar los elementos secundarios que pasa a este widget en una sola función, es decir, sus posiciones y tamaños pueden depender el uno del otro, que es algo que no puede lograr usando, por ejemplo, el
Stackwidget preconstruido .Ahora, hay dos pasos más que debe seguir antes de comenzar a diseñar a sus hijos:
childrendeben serLayoutIdy le pasas el widget que realmente quieres mostrar como niño a esoLayoutId. Elidva a identificar de forma exclusiva sus widgets, haciéndolos accesibles cuando dejó suelto:MultiChildLayoutDelegatesubclase que maneje la parte del diseño. La documentación aquí parece ser muy elaborada.Ahora, toda la configuración está lista y puede comenzar a implementar el diseño real. Hay tres métodos que puede usar para eso:
hasChild, que le permite comprobar si se pasó una identificación particular (LayoutId¿ recuerda ?)children, es decir, si está presente una hija de esa identificación.layoutChild, que debe llamar para cada ID , cada niño, proporcionado exactamente una vez y le dará elSizede ese niño.positionChild, que le permite cambiar la posición deOffset(0, 0)cualquier desplazamiento que especifique.Siento que el concepto debería ser bastante claro ahora, por eso ilustraré cómo implementar un delegado para el ejemplo
CustomMultiChildLayout:Otros dos ejemplos son el de la documentación (verifique el paso 2 de preparación ) y un ejemplo del mundo real que escribí hace tiempo para el
feature_discoverypaquete:MultiChildLayoutDelegateimplementación yCustomMultiChildLayouten elbuildmétodo .El último paso es anular el
shouldRelayoutmétodo , que controla de forma simple si seperformLayoutdebe volver a llamar en cualquier momento dado al compararlo con un delegado anterior (opcionalmente, también puede anulargetSize) y agregar el delegado a suCustomMultiChildLayout:Consideraciones
Utilicé
1y2como id s en este ejemplo, pero usar unenumes probablemente la mejor manera de manejar los identificadores si tiene identificadores específicos.Puede pasar un
Listenableasuper(psuper(relayout: animation). Ej. ) Si desea animar el proceso de diseño o activarlo en función de una capacidad de escucha en general.CustomSingleChildLayoutLa documentación explica muy bien lo que describí anteriormente y aquí también verá por qué dije que
CustomSingleChildLayoutserá muy obvio después de comprender cómoCustomMultiChildLayoutfunciona:Esto también significa que el uso
CustomSingleChildLayoutsigue los mismos principios que describí anteriormente, pero sin ningún identificador porque solo hay un solo hijo.En su
SingleChildLayoutDelegatelugar, debe usar un , que tiene diferentes métodos para implementar el diseño (todos tienen un comportamiento predeterminado, por lo que técnicamente todos son opcionales para anular ):getConstraintsForChild, que es equivalente a las restricciones que pasélayoutChildarriba.getPositionForChild, que es equivalente a lopositionChildanterior.Todo lo demás es exactamente lo mismo (recuerde que no necesita
LayoutIdy solo tiene un solo hijo en lugar dechildren).MultiChildRenderObjectWidgetEn esto se
CustomMultiChildLayoutbasa.El uso de esto requiere un conocimiento aún más profundo sobre Flutter y, una vez más, es un poco más complicado, pero es la mejor opción si desea una mayor personalización porque es un nivel aún más bajo. Esto tiene una gran ventaja sobre
CustomMultiChildLayout(generalmente, hay más control):CustomMultiChildLayoutno puede dimensionarse a sí mismo en función de sus elementos secundarios (vea el tema sobre una mejor documentación para el razonamiento ).No explicaré cómo usarlo
MultiChildRenderObjectWidgetaquí por razones obvias, pero si está interesado, puede consultar mi presentación al desafío Flutter Clock después del 20 de enero de 2020, en el que utilizoMultiChildRenderObjectWidgetextensamente; también puede leer un artículo sobre esto , lo que debería explicar un poco de cómo funciona todo.Por ahora, puede recordar que eso
MultiChildRenderObjectWidgetes lo que haceCustomMultiChildLayoutposible y usarlo directamente le dará algunos beneficios agradables, como no tener que usarLayoutIdy, en cambio, poder acceder a losRenderObjectdatos primarios del archivo directamente.Hecho de la diversión
Escribí todo el código en texto sin formato (en el campo de texto StackOverflow), por lo que si hay errores, indíquemelo y lo solucionaré.
fuente
LayoutIdser único a nivel mundial o local? globalmente, es decir, los widgets de tipo hermanosCustomMultiChildLayoutrequieren tener distintivosLayoutIden sus hijos.LayoutId, lo que significa que solo el padre directo accederá a estos datos, el ID :)CustomMultiChildLayoutes muy útil en escenarios en los que necesita agrupar el cambio de tamaño automático de varios widgets de texto dentro de unaColumndeRow's, por ejemplo.