Une personne expérimentée dans l'utilisation CustomSingleChildLayout
et les CustomMultiChildLayout
cours peut-elle expliquer en détail (avec des exemples) comment les utiliser?
Je suis nouveau sur Flutter et j'essaie de comprendre comment les utiliser. Cependant, la documentation est horrible et n'est pas claire. J'ai essayé de parcourir Internet pour trouver des exemples, mais il n'y a pas d'autre documentation.
Je vous serais éternellement reconnaissant si vous pouviez aider.
Je vous remercie!
flutter
dart
flutter-layout
Walter M
la source
la source
Réponses:
Tout d'abord, je tiens à dire que je suis heureux de vous aider avec cela car je peux comprendre vos difficultés - il y a aussi des avantages à le découvrir par vous-même (la documentation est incroyable).
Ce
CustomSingleChildLayout
qui sera évident après que je vous l'aurai expliquéCustomMultiChildLayout
.CustomMultiChildLayout
Le point de ce widget est vous permettant de mise en page les enfants que vous passez à ce widget dans une seule fonction, soit leurs positions et les tailles peuvent dépendent les uns des autres, ce qui est quelque chose que vous ne pouvez pas réaliser en utilisant par exemple le préconstruit
Stack
widgets.Maintenant, vous devez prendre deux autres mesures avant de commencer à disposer vos enfants:
children
doit être unLayoutId
et vous passez le widget que vous voulez réellement montrer en tant qu'enfant à celaLayoutId
. L'id
identifiera de manière unique vos widgets, les rendant accessibles lors de leur disposition:MultiChildLayoutDelegate
sous-classe qui gère la partie de présentation. La documentation ici semble être très élaborée.Maintenant, toute la configuration est terminée et vous pouvez commencer à implémenter la disposition réelle. Vous pouvez utiliser trois méthodes pour cela:
hasChild
, qui vous permet de vérifier si un identifiant particulier (vousLayoutId
vous souvenez ?) a été transmis àchildren
, c'est-à-dire si un enfant de cet identifiant est présent.layoutChild
, que vous devez appeler pour chaque identifiant , chaque enfant, fourni exactement une fois et il vous donnera leSize
de cet enfant.positionChild
, qui vous permet de modifier la position deOffset(0, 0)
n'importe quel décalage que vous spécifiez.Je pense que le concept devrait être assez clair maintenant, c'est pourquoi je vais illustrer comment implémenter un délégué pour l'exemple
CustomMultiChildLayout
:Deux autres exemples sont celui de la documentation (vérifiez la préparation étape 2 ) et un exemple réel que j'ai écrit il y a quelque temps pour le
feature_discovery
paquet: l'MultiChildLayoutDelegate
implémentation etCustomMultiChildLayout
dans labuild
méthode .La dernière étape consiste à remplacer la
shouldRelayout
méthode , qui contrôle simplement si elleperformLayout
doit être rappelée à un moment donné en la comparant à un ancien délégué, (vous pouvez également éventuellement remplacergetSize
) et en ajoutant le délégué à votreCustomMultiChildLayout
:Considérations
J'ai utilisé
1
et2
comme id dans cet exemple, mais l'utilisation d'unenum
est probablement la meilleure façon de gérer les id si vous avez des id spécifiques.Vous pouvez passer un
Listenable
àsuper
(par exemplesuper(relayout: animation)
) si vous souhaitez animer le processus de mise en page ou le déclencher sur la base d'une écoute en général.CustomSingleChildLayout
La documentation explique très bien ce que j'ai décrit ci-dessus et ici vous verrez également pourquoi j'ai dit que
CustomSingleChildLayout
cela sera très évident après avoir compris comment celaCustomMultiChildLayout
fonctionne:Cela signifie également que l'utilisation
CustomSingleChildLayout
suit les mêmes principes que ceux décrits ci-dessus, mais sans aucun identifiant car il n'y a qu'un seul enfant.Vous devez utiliser à la
SingleChildLayoutDelegate
place un , qui a différentes méthodes pour implémenter la mise en page (ils ont tous un comportement par défaut, ils sont donc techniquement tous facultatifs à remplacer ):getConstraintsForChild
, ce qui équivaut aux contraintes que j'ai passéeslayoutChild
ci-dessus.getPositionForChild
, qui est équivalent àpositionChild
ci-dessus.Tout le reste est exactement le même (rappelez-vous que vous n'avez pas besoin
LayoutId
et que vous n'avez qu'un seul enfant au lieu dechildren
).MultiChildRenderObjectWidget
C'est ce
CustomMultiChildLayout
sur quoi on s'appuie.Son utilisation nécessite une connaissance encore plus approfondie de Flutter et est encore un peu plus compliquée, mais c'est la meilleure option si vous souhaitez plus de personnalisation car elle est encore de niveau inférieur. Cela présente un avantage majeur par rapport à
CustomMultiChildLayout
(généralement, il y a plus de contrôle):CustomMultiChildLayout
ne peut pas se dimensionner en fonction de ses enfants (voir le problème concernant une meilleure documentation pour le raisonnement ).Je ne vais pas expliquer comment utiliser
MultiChildRenderObjectWidget
ici pour des raisons évidentes, mais si vous êtes intéressé, vous pouvez consulter ma soumission au défi Flutter Clock après le 20 janvier 2020, dans lequel j'utiliseMultiChildRenderObjectWidget
beaucoup - vous pouvez également lire un article à ce sujet , ce qui devrait expliquer un peu comment tout cela fonctionne.Pour l'instant, vous vous souvenez que
MultiChildRenderObjectWidget
c'est ce qui rendCustomMultiChildLayout
possible et l'utiliser directement vous donnera de beaux avantages comme ne pas avoir à utiliserLayoutId
et à la place pouvoir accéderRenderObject
directement aux données parentales de.Fait amusant
J'ai écrit tout le code en texte brut (dans le champ de texte StackOverflow), donc s'il y a des erreurs, veuillez me les signaler et je les corrigerai.
la source
LayoutId
être unique à l'échelle mondiale ou locale? globalement, c'est-à-dire que les widgets frères et sœurs de typeCustomMultiChildLayout
nécessitent d'avoirLayoutId
des enfants distincts .LayoutId
, ce qui signifie que ces données, l'id, ne seront accessibles que par le parent direct :)CustomMultiChildLayout
est si utile dans les scénarios où vous devez regrouper le redimensionnement automatique de plusieurs widgets de texte dans unColumn
deRow
, par exemple.