Размер одного из моих виджетов зависит от размера другого из моих виджетов (нестандартным способом), поэтому в настоящее время я использую плагин Rect Getter и многократно строю дерево виджетов (т.е.сделать это, вызвав сборку внутри сборки с помощью асинхронной функции, которая ожидает завершения текущей сборки и затем снова запускает сборку)
в моем конкретном случае процесс идет следующим образом (или, по крайней мере, это то, что я считаю, учитывая *)1003 *https://docs.flutter.io/flutter/widgets/WidgetsBinding/drawFrame.html)
- фаза сборки завершена
- асинхронная функция, вызываемая в (build # 1), вызывает сборку снова, в то время как фаза компоновки из (1) также выполняется
- асинхронная функция, вызываемая в (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, полученных ранее