【发布时间】:2018-08-24 17:59:21
【问题描述】:
我不明白LayoutBuilder 是如何用于获取小部件的高度的。
我需要显示小部件列表并获取它们的高度,以便计算一些特殊的滚动效果。我正在开发一个包,其他开发人员提供小部件(我不控制它们)。我读到 LayoutBuilder 可以用来获取高度。
在非常简单的情况下,我尝试将 Widget 包装在 LayoutBuilder.builder 中并将其放入 Stack,但我总是得到 minHeight 0.0 和 maxHeight INFINITY。我是否误用了 LayoutBuilder?
编辑:看来 LayoutBuilder 是不行的。我找到了CustomSingleChildLayout,这几乎是一个解决方案。
我扩展了该委托,并且能够在getPositionForChild(Size size, Size childSize) 方法中获取小部件的高度。但是,第一个调用的方法是 Size getSize(BoxConstraints constraints),作为约束,我得到 0 到 INFINITY,因为我将这些 CustomSingleChildLayouts 放在 ListView 中。
我的问题是 SingleChildLayoutDelegate getSize 的操作就像它需要返回视图的高度一样。我不知道那个时候孩子的身高。我只能返回constraints.smallest(即0,高度为0),或constraints.biggest,它是无穷大并导致应用程序崩溃。
在文档中甚至说:
...但是父级的大小不能取决于子级的大小。
这是一个奇怪的限制。
【问题讨论】:
-
LayoutBuilder 将为您提供父级的框约束。如果你想要孩子的大小,你需要一个不同的策略。我可以指出的一个示例是 Wrap 小部件,它根据关联的 RenderWrap 类中的子项的大小进行布局。这发生在布局期间,而不是 build()。
-
@JonahWilliams 嗯。我看不出 Wrap 对我有什么帮助,因为它是设计用于在周围布局孩子的小部件(类似于网络上的 flexbox 网格)。我有一个需要查找高度的子小部件。请参阅问题中的编辑。我几乎解决了 CustomSingleChildLayout 的问题,但遇到了它的局限性。
-
你能更具体地解释一下你想要什么吗?有多种解决方案。但每个都有不同的用例。
-
当然。我正在开发一个包。用户/开发人员为我的班级提供了一个小部件。我们在这里讨论任何小部件,从
new Text("hello")到更复杂的小部件。我将这些小部件放入 ListView,我需要它们的高度来计算一些滚动效果。我可以在布局时获取高度,就像 SingleChildLayoutDelegate 正在做的那样。 -
“滚动效果”是什么意思?你有例子吗?
标签: flutter dart layout widget flutter-widget