¿Puede alguien con experiencia en el uso CustomSingleChildLayout
y las CustomMultiChildLayout
clases 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
CustomSingleChildLayout
haga será obvio después de que te lo expliqueCustomMultiChildLayout
.CustomMultiChildLayout
El 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
Stack
widget preconstruido .Ahora, hay dos pasos más que debe seguir antes de comenzar a diseñar a sus hijos:
children
deben serLayoutId
y le pasas el widget que realmente quieres mostrar como niño a esoLayoutId
. Elid
va a identificar de forma exclusiva sus widgets, haciéndolos accesibles cuando dejó suelto:MultiChildLayoutDelegate
subclase 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á elSize
de 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_discovery
paquete:MultiChildLayoutDelegate
implementación yCustomMultiChildLayout
en elbuild
método .El último paso es anular el
shouldRelayout
método , que controla de forma simple si seperformLayout
debe 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é
1
y2
como id s en este ejemplo, pero usar unenum
es probablemente la mejor manera de manejar los identificadores si tiene identificadores específicos.Puede pasar un
Listenable
asuper
(psuper(relayout: animation)
. Ej. ) Si desea animar el proceso de diseño o activarlo en función de una capacidad de escucha en general.CustomSingleChildLayout
La documentación explica muy bien lo que describí anteriormente y aquí también verá por qué dije que
CustomSingleChildLayout
será muy obvio después de comprender cómoCustomMultiChildLayout
funciona:Esto también significa que el uso
CustomSingleChildLayout
sigue los mismos principios que describí anteriormente, pero sin ningún identificador porque solo hay un solo hijo.En su
SingleChildLayoutDelegate
lugar, 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élayoutChild
arriba.getPositionForChild
, que es equivalente a lopositionChild
anterior.Todo lo demás es exactamente lo mismo (recuerde que no necesita
LayoutId
y solo tiene un solo hijo en lugar dechildren
).MultiChildRenderObjectWidget
En esto se
CustomMultiChildLayout
basa.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):CustomMultiChildLayout
no 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
MultiChildRenderObjectWidget
aquí 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 utilizoMultiChildRenderObjectWidget
extensamente; 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
MultiChildRenderObjectWidget
es lo que haceCustomMultiChildLayout
posible y usarlo directamente le dará algunos beneficios agradables, como no tener que usarLayoutId
y, en cambio, poder acceder a losRenderObject
datos 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
LayoutId
ser único a nivel mundial o local? globalmente, es decir, los widgets de tipo hermanosCustomMultiChildLayout
requieren tener distintivosLayoutId
en sus hijos.LayoutId
, lo que significa que solo el padre directo accederá a estos datos, el ID :)CustomMultiChildLayout
es muy útil en escenarios en los que necesita agrupar el cambio de tamaño automático de varios widgets de texto dentro de unaColumn
deRow
's, por ejemplo.