Может ли кто-то с опытом в использовании CustomSingleChildLayout
и CustomMultiChildLayout
классах быть в состоянии подробно объяснить (с примерами), как их использовать.
Я новичок во Флаттере и пытаюсь понять, как их использовать. Однако документация ужасна и непонятна. Я пытался найти в Интернете примеры, но другой документации нет.
Я был бы вечно благодарен, если бы вы могли помочь.
Спасибо!
flutter
dart
flutter-layout
Уолтер М
источник
источник
Ответы:
Прежде всего, я хочу сказать, что я рад помочь вам в этом, так как я могу понять вашу борьбу - есть и преимущества, чтобы понять это самостоятельно (документация потрясающая).
Что
CustomSingleChildLayout
будет очевидно после того, как я объяснилCustomMultiChildLayout
вам.CustomMultiChildLayout
Смысл этого виджета позволяет макет детям вы передаете этот виджет в одной функции, то есть их позиция и размеры могут зависеть друг от друга, что - то вы не можете достичь , используя , например , в скомпилированном
Stack
виджете.Теперь вам нужно сделать еще два шага , прежде чем вы начнете раскладывать своих детей:
children
которому вы передаете, должен быть,LayoutId
и вы передаете ему виджет, который вы действительно хотите показать как ребенокLayoutId
. Онid
будет уникальным образом идентифицировать ваши виджеты, делая их доступными при их размещении:MultiChildLayoutDelegate
подкласс, который обрабатывает часть макета. Документация здесь кажется очень сложной.Теперь все настройки завершены, и вы можете приступить к реализации фактического макета. Для этого можно использовать три метода:
hasChild
, который позволяет проверить, был ли передан конкретный идентификатор (помнитеLayoutId
?)children
, то есть присутствует ли дочерний элемент этого идентификатора.layoutChild
, который вам нужно назвать для каждого идентификатора , каждого ребенка, предоставленного ровно один раз, и он даст вамSize
этого ребенка.positionChild
, что позволяет изменить положение сOffset(0, 0)
любого указанного смещения.Я чувствую, что концепция должна быть достаточно ясной, поэтому я проиллюстрирую, как реализовать делегат для примера
CustomMultiChildLayout
:Два другого примером является один из документации (проверка подготовки шага 2 ) и в реальном мире , например , я написал некоторое время назад для
feature_discovery
пакета:MultiChildLayoutDelegate
внедрение иCustomMultiChildLayout
вbuild
методе .Последний шаг - переопределение
shouldRelayout
метода , который просто контролирует,performLayout
должен ли он вызываться снова в любой данный момент времени путем сравнения со старым делегатом (по желанию вы также можете переопределитьgetSize
) и добавлением делегата к вашемуCustomMultiChildLayout
:Соображения
В этом примере я использовал
1
и2
в качестве идентификаторов s, ноenum
, вероятно, наилучшим способом обработки идентификаторов является использование идентификаторов, если у вас есть конкретные идентификаторы.Вы можете передать
Listenable
вsuper
(напримерsuper(relayout: animation)
) , если вы хотите , чтобы оживить процесс компоновки или триггер это основанный на Listenable в целом.CustomSingleChildLayout
Документация действительно хорошо объясняет то, что я описал выше, и здесь вы также поймете, почему я сказал, что
CustomSingleChildLayout
это будет очень очевидно после понимания того, какCustomMultiChildLayout
работает:Это также означает, что использование
CustomSingleChildLayout
следует тем же принципам, которые я описал выше, но без идентификаторов, потому что есть только один ребенок. Вместо этоговам нужно использовать a
SingleChildLayoutDelegate
, который имеет разные методы для реализации макета (все они имеют поведение по умолчанию, поэтому технически все они необязательны для переопределения ):getConstraintsForChild
, что эквивалентно ограничениям, которые я передалlayoutChild
выше.getPositionForChild
, что эквивалентноpositionChild
приведенному выше.Все остальное точно так же (помните, что вам не нужно
LayoutId
и у вас есть только один ребенок вместоchildren
).MultiChildRenderObjectWidget
Это то, что
CustomMultiChildLayout
построено на.Использование этого требует еще более глубоких знаний о Flutter и, опять же, немного сложнее, но это лучший вариант, если вы хотите больше настроек, потому что это еще более низкий уровень. Это имеет одно важное преимущество перед
CustomMultiChildLayout
(как правило, больше контроля):CustomMultiChildLayout
не может измерить себя исходя из своих потомков (см. проблему, касающуюся лучшей документации для обоснования ).Я не буду объяснять, как использовать
MultiChildRenderObjectWidget
здесь по понятным причинам, но если вы заинтересованы, вы можете проверить мою подачу заявки на участие в конкурсе Flutter Clock после 20 января 2020 года, в которой яMultiChildRenderObjectWidget
активно использую - вы также можете прочитать статью об этом , что должно объяснить немного, как все это работает.На данный момент вы можете помнить, что
MultiChildRenderObjectWidget
именно это делаетCustomMultiChildLayout
возможным, и непосредственное использование этого даст вам некоторые приятные преимущества, такие как отсутствие необходимости использованияLayoutId
и возможность прямого доступа кRenderObject
родительским данным.Забавный факт
Я написал весь код в виде простого текста (в текстовом поле StackOverflow), поэтому, если есть ошибки, укажите их мне, и я их исправлю.
источник
LayoutId
быть уникальным глобально или локально? глобально, т. е. действительно ли виджет типа «родной брат»CustomMultiChildLayout
требует наличия определенныхLayoutId
дочерних виджетов .LayoutId
, что означает, что эти данные, идентификатор, будут доступны только непосредственному родителю :)CustomMultiChildLayout
так полезен в тех случаях , когда вам нужно группа автоматического изменения размера нескольких виджетов текста внутриColumn
изRow
«s, для примера.