如何在 Flutter 中获取 AppBar 高度?

Posted

技术标签:

【中文标题】如何在 Flutter 中获取 AppBar 高度?【英文标题】:How to get AppBar height in Flutter? 【发布时间】:2018-10-09 02:22:07 【问题描述】:

如何在 Flutter 中获取 AppBar 的高度? 我正在使用 MarialApp 小部件('package:flutter/material.dart')。 我有我的 Context 的高度,想减去 appbar 的高度。

final double height = MediaQuery.of(context).size.height;

【问题讨论】:

你可以在 Flutter 中获取任何Widget 的高度,AppBar 是一个普通的Widget @creativecreatorormaybenot OP 询问如何获得AppBar 的高度,而您刚刚说可以获得AppBar 的高度。 【参考方案1】:

我认为这不是一个理想的方法,但它会起作用。

首先声明您将在Scaffold 中使用的AppBar 小部件。

Widget demoPage() 
  AppBar appBar = AppBar(
    title: Text('Demo'),
  );
  return Scaffold(
    appBar: appBar,
    body: /*
    page body
    */,
  );

现在您可以使用appBarpreferredSized 获取高度

double height = appBar.preferredSize.height;

您可以使用此高度来降低屏幕高度

final double height = MediaQuery.of(context).size.height;

【讨论】:

我真的不明白如何减少 appBar.preferredSize.height。那可能吗?多谢。我尝试更改 kToolbarHeight 的值,但由于它是 const var 而失败。 如果你觉得它更整洁,你可以简单地使用AppBar().preferredSize.height。它将产生与上述相同的结果,但将创建 AppBar 的另一个实例 额外知识:- 使用MediaQuery.of(context).padding.top 扣除状态栏高度 appBar.preferredSize.height = kToolbarHeight = 56.0MediaQuery.of(context).padding.top + kToolbarHeight 正是我想要得到的。 请记住,如果你在脚手架内,它可能会覆盖 MediaQuery.padding - 所以你只会得到 0。而不是使用: Scaffold.of(context).appBarMaxHeight;学分去@na2axl!【参考方案2】:

你可以用这个:

var height = AppBar().preferredSize.height;

这种方式非常简单

【讨论】:

【参考方案3】:

无需存储AppBar 实例,或创建一个虚拟实例来获取高度。此外,AppBar.preferredSize 将始终返回与 56.0 相同的值,这是 Material Design 的标准,并且该值在某些情况下并不总是可用(例如缺少状态栏的高度)。

由于AppBar 肯定与Scaffold 一起使用,恕我直言,获得真实AppBar 高度(设备顶部与Scaffold 主体顶部之间的距离)的更智能方法是使用:

double height = Scaffold.of(context).appBarMaxHeight;

这样,计算的高度将包括(独立于平台):

状态栏高度 应用栏高度 底部应用栏小部件高度(如果有)(例如 TabBar)

希望这会有所帮助!

【讨论】:

这如何帮助您获得底部栏的高度?我不认为我的底部栏和应用栏高度相同。 嗨@Graham,“底部应用栏小部件”是指放置在AppBar底部的小部件(具有Appbar.bottom属性),例如TabBar。我不是指放置在 Scaffold 底部的 BottomAppBar 小部件。 对我来说这只是返回 56 这不是 appbar+statusbar。 这个解决方案很完美 老兄,你刚刚救了我的命! Scaffold 覆盖了 MediaQuerry->padding,所以我总是会错过状态栏的高度。非常感谢!【参考方案4】:

正常工具栏高度有一个常数:kToolbarHeight

【讨论】:

说是56,太短了 @AlirezaAkbari 因为您还需要扣除 MediaQuery.of(context).padding.top 感谢 Avnish Kumar【参考方案5】:

在 AppBar 中观看

MediaQuery.of(context).padding.top + kToolbarHeight

【讨论】:

【参考方案6】:

获取身高:

MediaQuery.of(context).size.height - (MediaQuery.of(context).padding.top + kToolbarHeight)

我希望,这个解决方案也能帮助你。感谢您提出这个问题。

【讨论】:

获得身高的超棒的智能解决方案。谢谢兄弟!【参考方案7】:

AppBar 的高度固定为 56。

您应该创建自己的应用栏来实现 PreferredSizeWidget

class TestAppBar extends StatelessWidget implements PreferredSizeWidget 
  @override
  Widget build(BuildContext context) 
    return AppBar(
      title: Text('TEST'),
      centerTitle: true,
    );
  

  @override
  Size get preferredSize => Size.fromHeight(34);

【讨论】:

【参考方案8】:

您可以使用以下方法获取 AppBar 的高度:

double height = appBar.preferredSize.height;

确保您已声明 AppBar 小部件。

【讨论】:

【参考方案9】:

你可以用这个:

  @override
  final Size preferredSize; // default is 56.0

  WidgetAppBar(@required this.appBarTitle, @required this.appBarColor, Key key) : preferredSize = Size.fromHeight(40), super(key: key);

【讨论】:

欢迎来到 Stack Overflow!虽然这段代码可以解决问题,including an explanation 解决问题的方式和原因确实有助于提高帖子的质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的答案以添加解释并说明适用的限制和假设。 From Review【参考方案10】:

这将给出应用栏或状态栏的高度

var height = MediaQuery.of(context).padding.top;

但是,这仅适用于移动设备,其他设备没有状态栏

【讨论】:

【参考方案11】:

使用首选尺寸

//defined as
Size preferredSize

首选尺寸是高度为 kToolbarHeight 和底部小部件首选高度之和的尺寸。

Scaffold 使用此尺寸来设置其应用栏的高度。

在实现 PreferredSizeWidget 的应用栏类中定义如下

 preferredSize = new Size.fromHeight(kToolbarHeight + (bottom?.preferredSize?.height ?? 0.0))

例如一个链接...

https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/material/app_bar.dart

【讨论】:

以上是关于如何在 Flutter 中获取 AppBar 高度?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AppBar 中包装子小部件以获得更大的子高度和 Flutter 中的填充

Flutter 的一些小技巧

如何在 Flutter 中创建带有底部彩色边框的 AppBar?

Flutter-AppBar

如何在 Flutter 中使用 GestureDetector 隐藏 appBar?

如何在 Flutter 的 AppBar 中有可点击的文本