有没有办法获取现有小部件的大小?

Posted

技术标签:

【中文标题】有没有办法获取现有小部件的大小?【英文标题】:Is there a way to get the size of an existing widget? 【发布时间】:2017-04-27 23:46:16 【问题描述】:

我试图让我的 UI 显示两个按钮,其中一个略微重叠,位于全宽卡片的中间。因为 Stack 只会与其未定位的子代一样宽,所以我添加了一个 SizedBox 的未定位子代,宽度为 double.INFINITY 给我一个画布来放置按钮,但我不知道该放什么作为 SizedBox 的高度。理想情况下,无论用户是在手机还是平板电脑上,我都希望这个小部件能够适当地调整自身的大小,因此我宁愿将 SizedBox 高度基于按钮的当前大小,而不是仅仅硬编码一个数字。

有没有办法找到给定现有小部件的大小?如果不是,如何确定需要在多种屏幕尺寸上看起来不错的对象的高度?

示例代码:

new Card(
  child: new Stack(
    children: <Widget>[
      new SizedBox(
        width: double.INFINITY,
      ),
      new Positioned(
        left: 1.0,
        child: getButtonOne(),
      ),
      new Positioned(
        right: 1.0,
        child: getButtonTwo(),
      ),
    ],
  ),
),

【问题讨论】:

我发现一个更好的方法来达到我想要的效果是根本不使用堆栈,只是一个带有两个按钮的行,并将重叠的按钮放在一个 Transform 小部件内,其变换属性为“new Matrix4.translationValues(-30.0, 0.0, 0.0)",但我仍然对我最初问题的答案感到好奇。 嗨!您实际上可以回答自己的问题。如果您找到答案,请将其添加为答案。比上面的评论更容易找到:) 我以后会的。不过,我的评论并不能回答我关于如何获取小部件大小的问题,这就是为什么我只是将其作为评论。 【参考方案1】:

简短的回答是否定的,因为在构建功能时,小部件尚未布局,因此它们没有大小。

更长的答案是,要实现自定义布局效果,您可以使用自定义布局构建器,但在您的情况下这无济于事,因为自定义布局构建器无法根据其子级调整自身大小。下一个层次是直接构建一个自定义渲染对象,这正是 Stack 和 Row 和 Column 等实际上是什么。然后你可以根据布局做任何你想做的事情。

【讨论】:

以上是关于有没有办法获取现有小部件的大小?的主要内容,如果未能解决你的问题,请参考以下文章

Azure DevOps - 小部件大小

如何在不知道小部件的字体系列/大小的情况下更改小部件的字体样式?

获取我的主屏幕小部件的大小

QWidget 我们可以获取/修改小部件的现有上下文菜单吗

gtkmm 获取小部件的大小

Android在小部件内获取textView值