Android 颤振-can';t获取状态栏高度,以便准确计算可用屏幕高度

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

我正在尝试创建一个测试应用程序,它在一个列中包含两个小部件

第一个应占据可用高度的0.2,第二个应占据可用高度的0.8。后者是一个可滚动的小部件

为了计算可用高度,我需要3个属性:屏幕高度、状态栏高度和appbar高度

我得到了屏幕高度和应用程序栏高度

通过广泛搜索,我应该能够使用mediaQuery.padding.top获取状态栏高度,但它返回0。知道为什么吗

目前,底部溢出了24个像素,这显然是状态栏的高度

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进行开箱即用,而无需手动计算可用高度,但我仍然对答案感兴趣。”