Как использовать ограничения и размеры других виджетов на этапе сборки - PullRequest
0 голосов
/ 10 июня 2018

Я хочу убедиться, что покрываю все случаи

  1. Родительский виджет считывает (и, возможно, использует) дочерний размер или ограничения

  2. Дочерний виджет считывает (и, возможно, использует) размер или ограничения родительского элемента

  3. Дочерний виджет считывает (и, возможно, использует) размер или ограничения другого дочернего элемента

Решение, похоже, состоит в том, чтобы ...

  1. Пусть фаза сборки запустится

  2. Тогда размер и ограничения нужного виджетадля извлечения данных из построены

  3. Затем я прерываю регулярную последовательность фаз (чтобы функция Draw Frame не запускалась)

  4. Затем перезапуститефаза сборки с данными, которые у меня сейчас есть

  5. и позволить рамке рисовать

Проблема в том, что я не знаю, как это сделать

Ранее я опубликовал гораздо более конкретный вопрос, связанный с этим, и получил пару ответов, конструктор макетов, пользовательские мульти-чиМакет ld и пользовательский макет с одним дочерним элементом ...

Но это для очень специфических обстоятельств

Компоновщик компоновки создает дерево виджетов, которое может зависеть от размера родительского виджета.Таким образом, он обрабатывает только случай 2

И два других имеют ограничение, что размер родителя не может зависеть от размера ребенка.Так что, похоже, подразумевается, что он обрабатывает только случай 2.

Итак, какие еще есть решения?

Плагин получения прямоугольного кода работает, но не прерывает рисование кадра, поэтому есть кадрstutter https://pub.dartlang.org/packages/rect_getter

Плагин после компоновки, который я еще не пробовал, но похоже, что та же проблема возникает, потому что он говорит, что он запускается после первого кадра https://pub.dartlang.org/packages/after_layout

Любая помощь приветствуется!Я бы не хотел постоянно жить с использованием обходных путей: /

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Я являюсь автором плагина для прямого получения, и я весьма заинтересован в вашей задаче.

Да, как говорили другие парни, я думаю, что флаттер - это очень гибкий фреймворк для пользовательского интерфейса, поэтому нам не нужно знатьфактический размер виджета в большинстве случаев.Но когда я попытался написать аниме-эффект, имитирующий открытие книги, я обнаружил, что необходимо знать информацию о прямоугольнике «Карты», и, наконец, я нашел способ получить прямоугольник из визуализированного объекта из исходного кода heros.dart .В результате он стал плагином для получения, который вы знаете.flutter_openbookeffect

На самом деле, возможно, я сталкиваюсь с той же проблемой с вами, потому что я хочу написать макет 'Masonry', такой как this , поэтому ядолжен знать информацию о прямоугольных элементах предыдущих элементов, чтобы решить, где должен быть нарисован текущий элемент.

Мое решение: 1. Оберните дочерний виджет в rect_getter, сначала сначала создайте макет;2. Затем используйте таймер, чтобы получить прямую информацию о ребенке сразу после завершения сборки;3. Вызовите setState (), чтобы перестроить макет, и используйте прямую информацию о детях для вычисления ограничений каждого дочернего элемента в области просмотра.

Фрагмент кода (НЕ завершен): code fragment

и текущий прогресс: enter image description here

Мои коды можно найти здесь , но они были настолько ужасны и прокомментировали использование китайского языка, что я не думаю, что вызахочет их прочитать.

0 голосов
/ 10 июня 2018

Виджеты не могут делать это специально.Виджет должен никогда зависеть от размера и позиции или что-нибудь .Даже их дети.

Если вы когда-либо сталкиваетесь с ситуацией, в которой вам нужно, LayoutBuilder в большинстве случаев должно быть в порядке.

Если это не так, то что вы хотите создать, нет 't a Widget.Но вместо RenderObject один из нижних слоев флаттера.

Виджеты, такие как Center, Stack или Column, фактически вычисляются с использованием RenderObject.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...