Kann jemand mit Erfahrung in der Verwendung CustomSingleChildLayout
und im CustomMultiChildLayout
Unterricht in der Lage sein, ausführlich (mit Beispielen) zu erklären, wie man sie verwendet?
Ich bin neu bei Flutter und versuche zu verstehen, wie man diese benutzt. Die Dokumentation ist jedoch schrecklich und nicht klar. Ich habe versucht, das Internet nach Beispielen zu durchsuchen, aber es gibt keine andere Dokumentation.
Ich wäre auf ewig dankbar, wenn Sie helfen könnten.
Vielen Dank!
flutter
dart
flutter-layout
Walter M.
quelle
quelle
Antworten:
Zunächst möchte ich sagen, dass ich Ihnen gerne dabei helfen kann, da ich Ihre Kämpfe verstehen kann - es hat auch Vorteile, es selbst herauszufinden (die Dokumentation ist erstaunlich).
Was
CustomSingleChildLayout
passiert, wird offensichtlich sein, nachdem ichCustomMultiChildLayout
es Ihnen erklärt habe.CustomMultiChildLayout
Mit diesem Widget können Sie die untergeordneten Elemente, die Sie an dieses Widget übergeben, in einer einzigen Funktion anordnen, dh ihre Positionen und Größen können voneinander abhängen. Dies können Sie beispielsweise mit dem vorgefertigten Widget nicht erreichen
Stack
.Jetzt müssen Sie noch zwei weitere Schritte ausführen, bevor Sie Ihre Kinder auslegen können:
children
mussLayoutId
ein Kind sein, und Sie übergeben das Widget, das Sie tatsächlich als Kind anzeigen möchtenLayoutId
. Sieid
identifizieren Ihre Widgets eindeutig und machen sie beim Layout zugänglich:MultiChildLayoutDelegate
Unterklasse erstellen , die den Layoutteil behandelt. Die Dokumentation hier scheint sehr ausführlich zu sein.Jetzt ist die gesamte Einrichtung abgeschlossen und Sie können mit der Implementierung des eigentlichen Layouts beginnen. Dafür gibt es drei Methoden:
hasChild
Hiermit können Sie überprüfen, ob eine bestimmte ID (erinnern Sie sichLayoutId
?) an die übergeben wurdechildren
, dh ob ein Kind dieser ID vorhanden ist.layoutChild
, die Sie für jede ID , jedes Kind, genau einmal angeben müssen , und es gibt Ihnen dieSize
von diesem Kind.positionChild
Hiermit können Sie die Position vonOffset(0, 0)
einem beliebigen Versatz ändern .Ich bin der Meinung, dass das Konzept jetzt ziemlich klar sein sollte, weshalb ich veranschaulichen werde, wie ein Delegierter für das Beispiel implementiert wird
CustomMultiChildLayout
:Zwei weitere Beispiele sind die, aus der Dokumentation (Prüfung Vorbereitung Schritt 2 ) und einer realen Welt Beispiel , das ich vor einiger Zeit für das schrieb
feature_discovery
Paket:MultiChildLayoutDelegate
Umsetzung undCustomMultiChildLayout
in derbuild
Methode .Der letzte Schritt besteht darin, die
shouldRelayout
Methode zu überschreiben , mit der einfach gesteuert wird, obperformLayout
zu einem bestimmten Zeitpunkt erneut aufgerufen werden soll, indem sie mit einem alten Delegaten verglichen wird (optional können Sie diese auch überschreibengetSize
) und den Delegaten zu IhremCustomMultiChildLayout
:Überlegungen
Früher habe ich
1
und2
wie die ID in diesem Beispiel s, wobei jedoch eineenum
ist wahrscheinlich der beste Weg , um die IDs zu handhaben, wenn Sie bestimmte IDs haben.Sie können ein
Listenable
ansuper
(z. B.super(relayout: animation)
) übergeben, wenn Sie den Layoutprozess animieren oder basierend auf einem allgemein hörbaren Element auslösen möchten.CustomSingleChildLayout
Die Dokumentation erklärt, was ich oben wirklich gut beschrieben habe, und hier werden Sie auch sehen, warum ich gesagt habe, dass
CustomSingleChildLayout
dies sehr offensichtlich sein wird, nachdem Sie verstanden haben, wie esCustomMultiChildLayout
funktioniert:Dies bedeutet auch, dass die Verwendung
CustomSingleChildLayout
den gleichen Prinzipien folgt, die ich oben beschrieben habe, jedoch ohne IDs, da es nur ein einziges Kind gibt.Sie müssen
SingleChildLayoutDelegate
stattdessen ein verwenden, das unterschiedliche Methoden zum Implementieren des Layouts hat (alle haben Standardverhalten, sodass sie technisch alle optional überschrieben werden können ):getConstraintsForChild
Dies entspricht den Einschränkungen, an die ichlayoutChild
oben übergeben habe.getPositionForChild
, waspositionChild
oben äquivalent ist .Alles andere ist genau das gleiche (denken Sie daran, dass Sie nicht brauchen
LayoutId
und nur ein einziges Kind habenchildren
).MultiChildRenderObjectWidget
Darauf baut
CustomMultiChildLayout
man auf.Dies zu verwenden erfordert noch tiefere Kenntnisse über Flutter und ist wiederum etwas komplizierter, aber es ist die bessere Option, wenn Sie mehr Anpassungen wünschen, da es noch niedriger ist. Dies hat einen großen Vorteil gegenüber
CustomMultiChildLayout
(im Allgemeinen gibt es mehr Kontrolle):CustomMultiChildLayout
Größe kann nicht selbst auf der Grundlage ihrer Kinder (siehe Frage in Bezug auf eine bessere Dokumentation für die Begründung ).Ich werde
MultiChildRenderObjectWidget
aus offensichtlichen Gründen nicht erklären, wie man es hier benutzt, aber wenn Sie interessiert sind, können Sie meine Einreichung zur Flutter Clock Challenge nach dem 20. Januar 2020MultiChildRenderObjectWidget
lesen , in der ich sie ausgiebig benutze - Sie können auch einen Artikel darüber lesen , Das sollte ein bisschen erklären, wie das alles funktioniert.Im Moment können Sie sich daran erinnern, dass dies möglich
MultiChildRenderObjectWidget
ist. Wenn SieCustomMultiChildLayout
es direkt verwenden, erhalten Sie einige nützliche Vorteile, z. B. dass Sie es nicht verwenden müssenLayoutId
und stattdessenRenderObject
direkt auf die übergeordneten Daten des Benutzers zugreifen können.Lustige Tatsache
Ich habe den gesamten Code im Klartext geschrieben (im Textfeld StackOverflow). Wenn also Fehler auftreten, weisen Sie mich darauf hin, und ich werde sie beheben.
quelle
LayoutId
global oder lokal einzigartig sein? global, dh erfordern Geschwister-Widgets vom TypCustomMultiChildLayout
, dassLayoutId
ihre Kinder unterschiedliche Eigenschaften haben.LayoutId
, was bedeutet, dass auf diese Daten, die ID, nur vom direkten übergeordneten Element zugegriffen werden kann :)CustomMultiChildLayout
Dies ist beispielsweise in Szenarien nützlich, in denen Sie die automatische Größenänderung mehrerer Text-Widgets innerhalb einesColumn
von gruppieren müssenRow
.