Android 颤振-can';t获取状态栏高度,以便准确计算可用屏幕高度
我正在尝试创建一个测试应用程序,它在一个列中包含两个小部件 第一个应占据可用高度的0.2,第二个应占据可用高度的0.8。后者是一个可滚动的小部件 为了计算可用高度,我需要3个属性:屏幕高度、状态栏高度和appbar高度 我得到了屏幕高度和应用程序栏高度 通过广泛搜索,我应该能够使用mediaQuery.padding.top获取状态栏高度,但它返回0。知道为什么吗 目前,底部溢出了24个像素,这显然是状态栏的高度Android 颤振-can';t获取状态栏高度,以便准确计算可用屏幕高度,android,flutter,dart,Android,Flutter,Dart,我正在尝试创建一个测试应用程序,它在一个列中包含两个小部件 第一个应占据可用高度的0.2,第二个应占据可用高度的0.8。后者是一个可滚动的小部件 为了计算可用高度,我需要3个属性:屏幕高度、状态栏高度和appbar高度 我得到了屏幕高度和应用程序栏高度 通过广泛搜索,我应该能够使用mediaQuery.padding.top获取状态栏高度,但它返回0。知道为什么吗 目前,底部溢出了24个像素,这显然是状态栏的高度 var availableHeight = mediaQuery.size.hei
var availableHeight = mediaQuery.size.height - mediaQuery.padding.top - appBar.preferredSize.height; //737 - 0 - 56
我正在windows上的android模拟器中测试它。设备:像素3,操作系统:安卓派
我意识到我可以使用LayoutBuilder进行开箱即用,而无需手动计算可用高度,但我仍然对答案感兴趣
以下是完整的代码:
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
AppBar appBar = AppBar(title: Text("Test"));
return MaterialApp(
title: 'Test App',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
appBar: appBar,
body: SafeArea(child: Test(appBar))
)
);
}
}
class Test extends StatelessWidget {
final AppBar appBar;
Test(this.appBar);
Widget build(BuildContext context) {
var mediaQuery = MediaQuery.of(context);
var availableHeight = mediaQuery.size.height - mediaQuery.padding.top - appBar.preferredSize.height; //737 - 0 - 56
return Column(
children: <Widget>[
Container(
color: Colors.green,
height: availableHeight * 0.2,
),
Container(
height: availableHeight * 0.8,
child: getScrollable()
)
]
);
}
Widget getScrollable() {
return SingleChildScrollView(
child: Column(
children: <Widget>[
Container(
color: Colors.amber,
height: 600.0
),
Container(
color: Colors.red,
height: 600.0
),
],
)
);
}
}
导入“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
AppBar AppBar=AppBar(标题:文本(“测试”));
返回材料PP(
标题:“测试应用程序”,
主题:主题数据(
主样本:颜色。蓝色,
),
家:脚手架(
appBar:appBar,
主体:安全区域(儿童:测试(appBar))
)
);
}
}
类测试扩展了无状态小部件{
最终AppBar AppBar;
试验(本附录B);
小部件构建(构建上下文){
var mediaQuery=mediaQuery.of(上下文);
var availableHeight=mediaQuery.size.height-mediaQuery.padding.top-appBar.preferredSize.height;//737-0-56
返回列(
儿童:[
容器(
颜色:颜色。绿色,
高度:可用高度*0.2,
),
容器(
高度:可用高度*0.8,
子级:getScrollable()
)
]
);
}
小部件getScrollable(){
返回SingleChildScrollView(
子:列(
儿童:[
容器(
颜色:颜色。琥珀色,
高度:600.0
),
容器(
颜色:颜色,红色,
高度:600.0
),
],
)
);
}
}
无需计算任何内容。使用Flex
和Flexible
定义每个孩子相对于可用空间应占用的空间:
进口“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
AppBar AppBar=AppBar(标题:文本(“测试”));
返回材料PP(
标题:“测试应用程序”,
主题:主题数据(
主样本:颜色。蓝色,
),
家:脚手架(
appBar:appBar,
主体:安全区域(儿童:测试(appBar))
)
);
}
}
类测试扩展了无状态小部件{
最终AppBar AppBar;
试验(本附录B);
小部件构建(构建上下文){
回程伸缩(
方向:轴垂直,
儿童:[
灵活的(
弹性:2,
子:容器(
颜色:颜色。绿色,
),
),
灵活的(
弹性:8,
子项:getScrollable(),
)
],
);
}
小部件getScrollable(){
返回SingleChildScrollView(
子:列(
儿童:[
容器(
颜色:颜色。琥珀色,
高度:600.0
),
容器(
颜色:颜色,红色,
高度:600.0
),
],
)
);
}
}
无需计算任何内容。使用Flex
和Flexible
定义每个孩子相对于可用空间应占用的空间:
进口“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
AppBar AppBar=AppBar(标题:文本(“测试”));
返回材料PP(
标题:“测试应用程序”,
主题:主题数据(
主样本:颜色。蓝色,
),
家:脚手架(
appBar:appBar,
主体:安全区域(儿童:测试(appBar))
)
);
}
}
类测试扩展了无状态小部件{
最终AppBar AppBar;
试验(本附录B);
小部件构建(构建上下文){
回程伸缩(
方向:轴垂直,
儿童:[
灵活的(
弹性:2,
子:容器(
颜色:颜色。绿色,
),
),
灵活的(
弹性:8,
子项:getScrollable(),
)
],
);
}
小部件getScrollable(){
返回SingleChildScrollView(
子:列(
儿童:[
容器(
颜色:颜色。琥珀色,
高度:600.0
),
容器(
颜色:颜色,红色,
高度:600.0
),
],
)
);
}
}
谢谢,这个flex解决方案似乎比我在问题中简要提到的带有LayoutBuilder的解决方案更优雅。然而,你有没有可能对这个问题有一个直截了当的答案?“我意识到我可以使用LayoutBuilder进行开箱即用,而无需手动计算可用高度,但我仍然对答案感兴趣。”谢谢,这个flex解决方案似乎比我在问题中简要提到的使用LayoutBuilder的解决方案更优雅。然而,你有没有可能对这个问题有一个直截了当的答案?“我意识到我可以使用LayoutBuilder进行开箱即用,而无需手动计算可用高度,但我仍然对答案感兴趣。”