ChatGPT解决这个技术问题 Extra ChatGPT

如何在 Flutter 中获取 AppBar 高度?

如何在 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 的高度。

c
creativecreatorormaybenot

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

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

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

现在您可以使用 preferredSized 获取 appBar高度

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!
v
vitaminwater

你可以使用这个:

var height = AppBar().preferredSize.height;

这种方式非常简单


我喜欢这个答案。谢谢!
n
na2axl

无需存储 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 将覆盖 MediaQuery,并且您将一直得到 padding.top == 0。
我可以问一下,当您将 appBar 构建为单独的类/小部件时,您是如何到达脚手架的?
D
Daniel Illescas

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


上面写着 56,太短了
@AlirezaAkbari 因为您还需要扣除 MediaQuery.of(context).padding.top 感谢 Avnish Kumar
H
Hellomik U

只需在 AppBar 中观看

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

K
Kamlesh

获取身高:

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

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


获得身高的真棒,智能的解决方案。谢谢兄弟!
MediaQuery.of(context).padding.top -> 它给出状态栏高度,kToolbarHeight -> 它给出工具栏高度,谢谢 :)
S
Sebastian

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);
}

g
goops17

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

double height = appBar.preferredSize.height;

确保您已声明 AppBar 小部件。


M
Mehmet Emre Öz

你可以使用这个:

  @override
  final Size preferredSize; // default is 56.0

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

欢迎来到堆栈溢出!虽然此代码可能会解决问题,但including an explanation如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的回答以添加解释并说明适用的限制和假设。 From Review
m
marc_s

使用首选尺寸

//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


H
Hardik Hirpara

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

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

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