我的一个小部件的大小取决于我的另一个小部件的大小(以非标准方式) 所以我现在正在做的是使用 Rect Getter Plugin 并多次构建 Widget Tree (我通过使用等待当前构建完成然后再次运行构建的异步函数调用构建内部构建来做到这一点)
在我的特殊情况下,过程是这样的(或者至少这是我相信给定的https://docs.flutter.io/flutter/widgets/WidgetsBinding/drawFrame.html)
- 构建阶段完成
- 在 (build #1) 中调用的异步函数再次调用 build,同时 (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 个带有注释的“标记”小部件 小部件 1、小部件 2 和小部件 3 在初始构建阶段之后,我应该能够通过使用 findRenderObject() 获取 WIDGET 1 和 WIDGET 3 的大小(因为这个大小是在构建阶段计算的,我可以通过保存一个键来引用小部件,或者只使用 Rect Getter Plug In 为你做的) 然后我想保存这些值并停止运行其他阶段,这样我构建的内容(部分关闭,因为我还没有使用在布局阶段获取的尺寸)不会通过运行 drawFrame() 显示 然后我想再次运行构建函数,但这次我向 WIDGET 2 传递了一个大小,该大小是使用之前抓取的 WIDGET 1 和 WIDGET 3 的大小计算的
最佳答案
听起来您想要一个 LayoutBuilder 和/或一个 CustomMultiChildLayout。
关于flutter - 如何在布局阶段读取小部件的大小并在 drawFrame() 之前的构建阶段使用另一个小部件的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50729793/