Как прочитать размер виджета в фазе макета и использовать размер для другого виджета в фазе сборки перед drawFrame () - PullRequest
0 голосов
/ 07 июня 2018

Размер одного из моих виджетов зависит от размера другого из моих виджетов (нестандартным способом), поэтому в настоящее время я использую плагин Rect Getter и многократно строю дерево виджетов (т.е.сделать это, вызвав сборку внутри сборки с помощью асинхронной функции, которая ожидает завершения текущей сборки и затем снова запускает сборку)

в моем конкретном случае процесс идет следующим образом (или, по крайней мере, это то, что я считаю, учитывая *)1003 *https://docs.flutter.io/flutter/widgets/WidgetsBinding/drawFrame.html)

  1. фаза сборки завершена
  2. асинхронная функция, вызываемая в (build # 1), вызывает сборку снова, в то время как фаза компоновки из (1) также выполняется
  3. асинхронная функция, вызываемая в (build # 2), снова вызывает build, пока выполняется фаза макета из (2)

, поскольку фаза макета из (1) завершена к моменту выполнения (3)Теперь у меня есть размер нужного виджета, и я могу использовать его, чтобы установить размер другого виджета, это работает, но у меня есть рамка мерцания

, поэтому я хотел бы сделать это

вызовите фазу сборки, как только вызовите фазу компоновки и захватите нужный размер с помощью RectGetter (который использует findRenderObject ()), остановите автоматический переход в «фазу компоновки битов», запустите фазу компоновки теперь с сохраненным размеромиз фазы макета, таким образом, последняя фаза, которая рисует кадр, не будет работать, и экран не будет мерцать

это возможно?Если так, может кто-нибудь указать мне правильное направление, чтобы сделать это?возможно, кто-то может помочь мне с примером.или даже некоторые функции, чтобы посмотреть.любая помощь приветствуется

--- Это всего лишь ОДИН из тех особых случаев, с которыми я работаю

new Scaffold(
    body: new Flex(
      direction: (isWidthMax) ? Axis.vertical : Axis.horizontal,
      //ONLY relevant if position is top or bottom
      textDirection: (position == sheetPosition.right)
          ? TextDirection.ltr
          : TextDirection.rtl,
      //ONLY relevant if position is left or right
      verticalDirection: (position == sheetPosition.top)
          ? VerticalDirection.up
          : VerticalDirection.down,
      crossAxisAlignment: CrossAxisAlignment.stretch,
      mainAxisSize: MainAxisSize.min,
      children: <Widget>[
        new Flexible(
            fit: FlexFit.loose,
            child: new Container(
              color: Colors.red,
            )),
        new RectGetter(
          key: objOneKey,
          child: new ConstrainedBox( //tag: WIDGET 1
            constraints: _calcBoxConstraints(isWidthMax),
            child: new Container(
              color: Colors.purple,
              child: new Flex(
                direction: (isWidthMax) ? Axis.vertical : Axis.horizontal,
                //ONLY relevant if position is top or bottom
                textDirection: (position == sheetPosition.right)
                    ? (placement == attachmentPlacement.inside)
                        ? TextDirection.rtl
                        : TextDirection.ltr
                    : (placement == attachmentPlacement.inside)
                        ? TextDirection.ltr
                        : TextDirection.rtl,
                //ONLY relevant if position is left or right
                verticalDirection: (position == sheetPosition.top)
                    ? (placement == attachmentPlacement.inside)
                        ? VerticalDirection.down
                        : VerticalDirection.up
                    : (placement == attachmentPlacement.inside)
                        ? VerticalDirection.up
                        : VerticalDirection.down,
                crossAxisAlignment: CrossAxisAlignment.stretch,
                mainAxisAlignment: MainAxisAlignment.end,
                mainAxisSize: MainAxisSize.min,
                children: <Widget>[
                  new Container( //tag: WIDGET 2
                    color: Colors.amberAccent,
                    child: sheet,
                  ),
                  new Flexible( //tag: WIDGET 3
                    fit: FlexFit.loose,
                    child: new Container(
                      color: Colors.greenAccent,
                      child: (attachment != null) ? attachment : null,
                    ),
                  ),
                ],
              ),
            ),
          ),
        ),
      ],
    ),
  );

. В приведенном выше коде есть 3 виджета, «помеченных» комментариями. WIDGET 1, WIDGET 2 и WIDGET 3 после начальной фазы сборки, я должен иметь возможность получить размер WIDGET 1 и WIDGET 3, используя findRenderObject () (потому что этот размер рассчитывается на этапе сборки, и я могу ссылаться на виджет, сохраняяключ, или просто с помощью подключаемого модуля Rect Getter, который делает это для вас), тогда я хотел бы сохранить значения и остановить другие фазы, чтобы запустить то, что я построил (который частично отключен, потому что я еще не использовал размеры, захваченныев фазе макета) НЕ отображается при запуске drawFrame (), тогда я хотел бы снова запустить функцию построения, но на этот раз я передаю WIDGET 2 размер, который был рассчитан с использованием размеров WIDGET 1 и WIDGET 3, полученных ранее

1 Ответ

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

Похоже, вы хотите LayoutBuilder и / или CustomMultiChildLayout.

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