flutter - 如何在布局阶段读取小部件的大小并在 drawFrame() 之前的构建阶段使用另一个小部件的大小

标签 flutter flutter-layout

我的一个小部件的大小取决于我的另一个小部件的大小(以非标准方式) 所以我现在正在做的是使用 Rect Getter Plugin 并多次构建 Widget Tree (我通过使用等待当前构建完成然后再次运行构建的异步函数调用构建内部构建来做到这一点)

在我的特殊情况下,过程是这样的(或者至少这是我相信给定的https://docs.flutter.io/flutter/widgets/WidgetsBinding/drawFrame.html)

  1. 构建阶段完成
  2. 在 (build #1) 中调用的异步函数再次调用 build,同时 (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 个带有注释的“标记”小部件 小部件 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/

相关文章:

ios - Flutter iOS RevenueCat 未捕获异常 'NSInternalInconsistencyException'

android - 更改build.gradle文件上的applicationId后出现错误

flutter - 在ShowDialog的TextField上显示错误文本

flutter - 如何在Flutter中实现自定义应用栏布局可滚动效果

Flutter:迭代期间并发修改:Instance(length:2) of '_GrowableList'

dart - 使用通用 bloc 提供程序时 bloc 不会被初始化

flutter - 有没有办法在容器中包含多个子代?

Flutter:如何设置 SliverAppBar 默认折叠

flutter - 无法在flutter应用程序中更改状态栏图标亮度?

flutter - paint()方法中的Size属性不同于CustomPainter中指定的大小