HarmonyOS鸿蒙Next中flutter如何适配智慧多窗(顶部窗口控制条遮挡)

HarmonyOS鸿蒙Next中flutter如何适配智慧多窗(顶部窗口控制条遮挡) 顶部窗口控制条避让适配智慧多窗 在flutter里,切换智慧多窗时,MediaQuery.of(_context!).padding.top会变成0,这块该如何判断适配?

2 回复

MediaQuery.of(context).padding.top 返回的是Flutter渲染页面被遮挡的部分的尺寸

由于顶部的被遮挡区,通常就是状态栏或者刘海部分,所以这个方法就可以间接来获取状态栏高度。

但是根据MediaQuery的源码看描述,父布局有可能会消耗了这个padding。例如:

上述代码,在Scaffold内部,就拿不到padding了,结果就为0

这种情况下就会发现两次获取的高度都有了并且一致。

所以需要自己根据需要适配的组件,重新做一下获取padding的处理。有些情况下父组件占了padding,被源码手动remove了,就会导致获取不到。

class MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    print('外层获取状态栏高度:${MediaQuery.of(context).padding.top}');
    
    return Scaffold(
      // appBar: AppBar(
      //   backgroundColor: Theme.of(context).colorScheme.inversePrimary,
      //   title: Text(widget.title),
      // ),
      body: Builder(
        builder: (context) {
          print('内层获取状态栏高度:${MediaQuery.of(context).padding.top}');
          return const Text('data');
        },
      ),
    );
  }
}

监听页面长度变化,可以使用 MediaQuery.of(context).size 获取屏幕的宽度和高度。从而动态调整界面元素的大小和位置

class MyWidget extends StatelessWidget {

  const MyWidget({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final screenSize = MediaQuery.of(context).size;

    return Container(
      width: screenSize.width,
      height: screenSize.height,
      child: Text('Hello, World!'),
    );
  }
}

更多关于HarmonyOS鸿蒙Next中flutter如何适配智慧多窗(顶部窗口控制条遮挡)的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在HarmonyOS鸿蒙Next中,Flutter应用适配智慧多窗时,需处理顶部窗口控制条遮挡问题。可以通过以下步骤实现:

  1. 获取安全区域:使用MediaQuery.of(context).padding获取顶部安全区域高度。
  2. 调整布局:在布局中添加Padding,将内容下移以避免遮挡。
  3. 动态响应:监听窗口变化,动态调整布局。

示例代码:

Padding(
  padding: EdgeInsets.only(top: MediaQuery.of(context).padding.top),
  child: YourContentWidget(),
)

确保应用在不同窗口模式下都能正确显示。

回到顶部