【问题标题】:Get LayoutBuilder height in flutter在颤动中获取 LayoutBuilder 高度
【发布时间】:2020-02-12 21:35:51
【问题描述】:

我有一个包含 Expand(LayoutBuilder(Widget that can change vertical size by the user))) 的 Row 和右侧的 Column ,就像代码一样。我希望列的高度等于左侧小部件的高度(垂直长度)。列高也应该能够根据左侧小部件的高度进行更改。

Scaffold(
      backgroundColor: Colors.blue,
      body: Center(
        child: Row(children: <Widget>[
          Expanded(
            child: Container(
              color: Colors.grey,
              child: LayoutBuilder(builder: (context, size) {
                return TextField(
                  maxLines: null,
                );
              }),
            ),
          ),
          Container(
            color: Colors.red,
            child: Column(
              children: <Widget>[
                InkWell(
                  child: Icon(Icons.keyboard_arrow_up),
                  onTap: () {},
                ),
                InkWell(
                  child: Icon(Icons.keyboard_arrow_down),
                  onTap: () {},
                ),
              ],
            ),
          )
        ]),
      ),
    );

看起来与此相似。我的第一个解决方案是以某种方式获取 LayoutBuilder 高度并将其用于列的容器。使其外观和行为与描述相同的任何其他更好的方法都可以。

【问题讨论】:

  • 您可以在容器上放置一个对齐属性来保存该列,以使其最大程度地扩展。还可以使用 mainAxisSize: MainAxisSize.max 属性让列完全展开。利用列中的对齐属性让孩子们从那里做他们需要的事情。
  • @AdrianMurray 我不确定我是否理解您的帮助,请随时提交示例代码作为完整答案。

标签: flutter flutter-layout


【解决方案1】:

您可以将Row 放在LayoutBuilder 中,如下所示:

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(title: Text("")),
    body: Container(
      child: LayoutBuilder(builder: (context, size) {
        return Row(
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: <Widget>[
            Flexible(
              child: Container(
                color: Colors.grey,
                child: TextField(
                  maxLines: null,
                ),
              ),
            ),
            Container(
              color: Colors.red,
              child: Column(
                children: <Widget>[
                  InkWell(
                    child: Icon(Icons.keyboard_arrow_up),
                    onTap: () {},
                  ),
                  InkWell(
                    child: Icon(Icons.keyboard_arrow_down),
                    onTap: () {},
                  ),
                ],
              ),
            )
          ],
        );
      }),
    ),
  );
}

编辑:这将使Row 的高度取其父级的高度。

如果您希望Row 的高度为最小高度,在这种情况下,您可以用IntrinsicHeight 包裹Row,注意IntrinsicHeight 的使用可能很昂贵,所以不要如果你可以重组你的小部件来避免它,就不要每次都使用它。

【讨论】:

  • 问题是我不能将整个东西包装在另一个 Column 或 ListView 中,因为它试图采用无穷大的最大高度。我希望 LayoutBuilder 使用刚好等于 TextField 大小的最小高度。
  • 我确实工作过;但是,我会使用很多这样的小部件(可能超过 25 个),所以这可能不是理想的解决方案。
  • 我认为使用 LimitedBox 和 FittedBox 会更便宜。
猜你喜欢
  • 2020-11-02
  • 2018-10-11
  • 2020-06-03
  • 1970-01-01
  • 2020-04-05
  • 2020-11-29
  • 2020-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多