如何在绘制之前知道小部件的大小?

Mig*_*ivo 2 widget dart flutter flutter-layout

I\xe2\x80\x99m 尝试使用 an来实现用户按下时AnimatedContainer展开效果的简单动画(类似于)。ExpandableTile

\n\n

我的问题是,这个容器在展开时可以具有 10.0 高度或 1000.0 (它必须是动态的)。好的,要为其制作动画,它需要事先知道高度,这是有道理的。但是在渲染之前我怎么知道它的最大高度(I\xe2\x80\x99m 将渲染可以有 1 到 N 行的文本))。

\n\n

我\xe2\x80\x99想过很多可能性,但似乎都不合适。大多数时候,我们从已经渲染的东西中获取尺寸,而RenderBox不是相反,所以这有点困扰我。

\n\n

先感谢您!

\n

Mig*_*ivo 6

我最终通过使用非常适合这种情况的Offstage小部件找到了解决方案。

\n\n

解决方案

\n\n

将子树包装在 a 中Offstage并为其分配一个键(可以是 a GlobalKey),然后,在实际渲染它之前,我可以通过执行以下操作来获取其高度:

\n\n
  void _getWidgetHeight() {\n    if (subtreeHeight == null) {\n      RenderBox renderBox = key.currentContext.findRenderObject();\n      subtreeHeight = renderBox.size.height;\n    }\n    setState(() {\n      _isOffstage = false;\n    });\n  }\n
Run Code Online (Sandbox Code Playgroud)\n\n

这样,AnimatedContainer例如,如果您有一个 ,并且需要将动画设置为其最终大小,则可以使用以下内容:

\n\n
AnimatedContainer(\n        duration: Duration(milliseconds: 250),\n        height: subtreeHeight ?? 100.0 // some default size,\n      ...\n  )\n
Run Code Online (Sandbox Code Playgroud)\n\n

它会相应地呈现。

\n\n

请注意,请确保子树中的内容可以在动画时插入到内部(Container例如,如果您\xc2\xb4在 a或中使用它,则将其包装在 a 中)。OffstageFlexibleColumnRow

\n