Czy ktoś z doświadczeniem w korzystaniu CustomSingleChildLayout
i CustomMultiChildLayout
klasami może szczegółowo wyjaśnić (z przykładami), jak z nich korzystać.
Jestem nowy w Flutter i staram się zrozumieć, jak z nich korzystać. Dokumentacja jest jednak okropna i niejasna. Próbowałem przeszukać Internet w poszukiwaniu przykładów, ale nie ma żadnej innej dokumentacji.
Byłbym wiecznie wdzięczny, gdybyś mógł pomóc.
Dziękuję Ci!
flutter
dart
flutter-layout
Walter M.
źródło
źródło
Odpowiedzi:
Przede wszystkim chcę powiedzieć, że cieszę się, że mogę ci w tym pomóc, ponieważ rozumiem twoje zmagania - są również korzyści z samodzielnego zrozumienia tego (dokumentacja jest niesamowita).
Co
CustomSingleChildLayout
stanie się oczywiste po tym, jak ci wyjaśnięCustomMultiChildLayout
.CustomMultiChildLayout
Istotą tego widżetu jest ułożenie dzieci, które przekazujesz do tego widżetu w jednej funkcji, tzn. Ich pozycje i rozmiary mogą się od siebie różnić, czego nie można osiągnąć za pomocą np. Gotowego
Stack
widgetu.Teraz musisz zrobić jeszcze dwa kroki , aby zacząć układać dzieci:
children
musi być aLayoutId
i przekazujesz temu widgetowi, który faktycznie chcesz pokazać jako dzieckoLayoutId
. Wid
unikalny sposób zidentyfikują Twoje widżety, udostępniając je podczas układania:MultiChildLayoutDelegate
podklasę, która obsługuje część układu. Dokumentacja tutaj wydaje się bardzo skomplikowana.Teraz cała konfiguracja jest zakończona i możesz rozpocząć wdrażanie rzeczywistego układu. Można do tego użyć trzech metod:
hasChild
, co pozwala sprawdzić, czy określony identyfikator (pamiętaszLayoutId
?) został przekazany dochildren
, tj. czy jest obecne dziecko tego identyfikatora.layoutChild
, do którego należy zadzwonić po każdym identyfikatorze , każdym dziecku, podanym dokładnie raz, a da ciSize
to dziecko.positionChild
, co pozwala zmienić pozycję zOffset(0, 0)
dowolnego określonego przesunięcia.Wydaje mi się, że koncepcja powinna być teraz całkiem jasna, dlatego zilustruję sposób implementacji delegata na przykład
CustomMultiChildLayout
:Dwa inne przykłady to jeden z dokumentacji (sprawdź przygotowania kroku 2 ) i realnego świata przykład pisałem jakiś czas temu na
feature_discovery
opakowaniu:MultiChildLayoutDelegate
wdrażanie iCustomMultiChildLayout
wbuild
metodzie .Ostatnim krokiem jest zastąpienie
shouldRelayout
metody , która w prosty sposób kontroluje, czyperformLayout
w dowolnym momencie należy wywołać ponownie, porównując do starego delegata (opcjonalnie możesz też przesłonićgetSize
) i dodając delegata doCustomMultiChildLayout
:Uwagi
Użyłem
1
i2
jako identyfikatorów w tym przykładzie, ale użycieenum
jest prawdopodobnie najlepszym sposobem obsługi identyfikatorów, jeśli masz określone identyfikatory.Możesz przekazać
Listenable
dosuper
(np.super(relayout: animation)
), Jeśli chcesz animować proces tworzenia układu lub uruchomić go na podstawie ogólnie możliwej do odsłuchania.CustomSingleChildLayout
Dokumentacja wyjaśnia to, co opisałem powyżej, bardzo dobrze, a tutaj również zobaczysz, dlaczego powiedziałem, że
CustomSingleChildLayout
będzie to bardzo oczywiste po zrozumieniu, jakCustomMultiChildLayout
działa:Oznacza to również, że używanie
CustomSingleChildLayout
odbywa się zgodnie z tymi samymi zasadami, które opisałem powyżej, ale bez żadnych identyfikatorów, ponieważ jest tylko jedno dziecko.Musisz użyć
SingleChildLayoutDelegate
zamiast tego, który ma różne metody implementacji układu (wszystkie mają domyślne zachowanie, więc technicznie wszystkie są opcjonalne do zastąpienia ):getConstraintsForChild
, co jest równoważne ograniczeniom, które przekazałemlayoutChild
powyżej.getPositionForChild
, co odpowiadapositionChild
powyższemu.Wszystko inne jest dokładnie takie samo (pamiętaj, że nie potrzebujesz
LayoutId
i zamiast tego masz tylko jedno dzieckochildren
).MultiChildRenderObjectWidget
Na tym
CustomMultiChildLayout
się opiera.Korzystanie z tego wymaga jeszcze głębszej wiedzy o Flutter i jest znowu nieco bardziej skomplikowane, ale jest to lepsza opcja, jeśli chcesz więcej dostosowań, ponieważ jest to jeszcze niższy poziom. Ma to jedną zasadniczą przewagę nad
CustomMultiChildLayout
(generalnie jest większa kontrola):CustomMultiChildLayout
nie może samodzielnie ustalić rozmiaru na podstawie swoich elementów potomnych (patrz problem dotyczący lepszej dokumentacji uzasadnienia ).Nie wyjaśnię, jak korzystać z
MultiChildRenderObjectWidget
tego z oczywistych powodów, ale jeśli jesteś zainteresowany, możesz sprawdzić moje poddanie się wyzwaniu Flutter Clock po 20 stycznia 2020 r., W którymMultiChildRenderObjectWidget
intensywnie korzystam - możesz również przeczytać artykuł na ten temat , co powinno wyjaśnić trochę, jak to wszystko działa.Na razie pamiętasz, że
MultiChildRenderObjectWidget
to właśnie umożliwiaCustomMultiChildLayout
, a bezpośrednie korzystanie z niego zapewni ci kilka miłych korzyści, takich jak brak konieczności używaniaLayoutId
i zamiast tego bezpośredni dostęp doRenderObject
danych rodzica.Śmieszny fakt
Cały kod napisałem zwykłym tekstem (w polu tekstowym StackOverflow), więc jeśli wystąpią błędy, proszę wskazać mi je i naprawię je.
źródło
LayoutId
być wyjątkowy na całym świecie czy lokalnie? globalnie, tj. czy widżety typu rodzeństwoCustomMultiChildLayout
wymagają posiadania odrębnychLayoutId
znaków u swoich dzieci.LayoutId
, co oznacza, że do tych danych, id, będzie mógł uzyskać dostęp tylko bezpośredni rodzic :)CustomMultiChildLayout
jest na przykład przydatny w scenariuszach, w których trzeba grupować automatyczne zmienianie rozmiaru wielu widżetów tekstowych w jednymColumn
zRow
„a”.