前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Flutter SafeArea - 异形屏适配利器

Flutter SafeArea - 异形屏适配利器

作者头像
Flutter笔记
发布于 2019-07-25 06:25:52
发布于 2019-07-25 06:25:52
7.1K00
代码可运行
举报
文章被收录于专栏:Flutter笔记Flutter笔记
运行总次数:0
代码可运行

相信关注这个公众号的人已经了解过 Flutter. 如果还没有,那么可以去 Flutter官网 了解一下

现有手机可能会出现的问题

现在的手机已经不是方方正正的屏幕了,所以我们在写一些UI的时候可能会出现如下问题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: Text(widget.title),
    ),
    body: ListView.builder(itemBuilder: (context, index) {
      return SizedBox(
        height: 30,
        child: Text(
          'Data',
          style: TextStyle(fontSize: 18),
        ),
      );
    }),
    floatingActionButton: FloatingActionButton(
      onPressed: _incrementCounter,
      tooltip: 'Increment',
      child: Icon(Icons.add),
    ),
  );
}

如何解决

为了解决这个问题,Flutter 引入了 SafeArea(安全区域),我们只需要在代码中加入SafeArea

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: SafeArea(  // 加入SafeArea
        child: ListView.builder(itemBuilder: (context, index) {
          return Padding(
            padding: EdgeInsets.only(left: 10, bottom: 18),
            child: Text(
              'Data',
              style: TextStyle(fontSize: 18),
            ),
          );
        }),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }

可以看到问题已经被解决。

我们还可以仅指定特定的某一位置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SafeArea(
  top: false,
  bottom: true,
  left: true,
  right: false,
),

原理是什么

我们点进 SafeArea 的源码查看 build 方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Widget build(BuildContext context) {
    assert(debugCheckHasMediaQuery(context));
    // 这里获取到padding
    final EdgeInsets padding = MediaQuery.of(context).padding;
    return Padding( // 返回了一个 Padding widget
      padding: EdgeInsets.only(
        left: math.max(left ? padding.left : 0.0, minimum.left),
        top: math.max(top ? padding.top : 0.0, minimum.top),
        right: math.max(right ? padding.right : 0.0, minimum.right),
        bottom: math.max(bottom ? padding.bottom : 0.0, minimum.bottom),
      ),
      child: MediaQuery.removePadding(
        context: context,
        removeLeft: left,
        removeTop: top,
        removeRight: right,
        removeBottom: bottom,
        child: child,
      ),
    );
  }

可以看到SafeArea通过MediaQuery来检测屏幕尺寸,使应用程序的大小能与屏幕适配。

然后返回了一个Padding Widget 来包裹住我们编写的页面。这样我们的页面就不会被异形屏幕给遮挡住了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Flutter笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Flutter开发实战分析-pesto_demo解析
以下代码基本参考于 flutter_gallery中的pesto_demo示例。(可以结合本文看源码)
deep_sadness
2018/08/30
2.4K0
Flutter开发实战分析-pesto_demo解析
Flutter 数据监听Widget
给定ValueListenable 一个泛型和一个构建器,它从泛型的具体值构建小部件,这个类将自动注册为ValueListenable 的侦听器,并在值更改时用更新的值调用构建器。
Flutter笔记
2019/07/24
1.9K0
Flutter 数据监听Widget
flutter系列之:widgets,构成flutter的基石
flutter中所有的组件都是由widgets组成的,flutter中有各种各样的widgets,这些widgets构成了flutter这个大厦。
程序那些事
2022/08/18
7300
Flutter 组件 | ValueListenableBuilder 局部刷新小能手
我们对初始项目非常熟悉,在 _MyHomePageState 中,通过点击按钮将状态量 _counter 自加,在使用 setState 让当前 State 类持有的 Element 进行更新。作为初学者来说,这很方便,也很容易理解。但对于已入门的人来说,这样的 setState 显然是有失优雅的。
张风捷特烈
2021/01/04
8.6K0
Flutter 组件 |  ValueListenableBuilder 局部刷新小能手
Flutter | 容器组件
EdgeInsetsGeometry 是一个抽象类,开发中,我们一般都使用 EdgeInsets 类,他是 EdgeInsetsGeometry 的子类,定义了一下设置填充的方法
345
2022/02/11
5.7K0
Flutter | 容器组件
【Flutter】Flutter 全面屏适配 ( 需要适配的情况 | Android 设置最大宽高比 | 使用 SafeArea 进行全面屏适配 | 使用 MediaQuery 进行全面屏适配 )
位置适配 : 基于 屏幕 顶部 / 底部 摆放的组件 , 会出现偏移 , 没有按照设计位置摆放 ;
韩曙亮
2023/03/29
5.6K0
【Flutter】Flutter 全面屏适配 ( 需要适配的情况 | Android 设置最大宽高比 | 使用 SafeArea 进行全面屏适配 | 使用 MediaQuery 进行全面屏适配 )
Flutter 1.17 新 Material motion 规范的预构建动画
软件包 pub 地址:https://pub.dev/packages/animations
老孟Flutter
2020/09/11
1.2K0
Flutter 1.17 新 Material motion 规范的预构建动画
Flutter开发-容器类组件
Padding可以给其子节点添加填充(留白),和边距效果类似。我们在前面很多示例中都已经使用过它了,现在来看看它的定义:
码客说
2020/05/14
3.8K0
Flutter | 常用组件分类、概述、实战
AppBar(title属性,Text组件; action:动作响应;!!!! titleSpacing:标题文字间距; toolbarOpacity:标题透明度;)
凌川江雪
2020/06/16
4.4K0
用flutter给图片加个好看的遮罩层【flutter20个实例之六】
左起图一是我业务中的样式,左起图二、三是下方源码展示样式(复制可直接运行,无额外组件引入)
sinnoo
2020/11/13
4.4K0
用flutter给图片加个好看的遮罩层【flutter20个实例之六】
Flutter实现代码提示功能
在实现代码提示功能前,我们先来看看什么是代码提示,当我输入关键字String 时,如果输入到 Stri 的时候,编辑器会为我找出所有包含 Stri 的代码关键词,这个时候,我们只要选中需要输入的关键字,它就会为我补充剩余的单词,这个就是代码提示功能,那么在Flutter 中如何实现这一功能呢?
rhyme_lph
2021/07/29
1.7K0
Flutter实现代码提示功能
Flutter容器类组件
⚠️注意, Flutter官方并没有对Widget进行如此划分。中文版《Flutter实战》对其分类主要是方便讨论和对Widget功能区分记忆。
白白白小艾
2022/03/24
4K0
Flutter可滑动组件
移动端数据量比较大时,一般都是通过列表来进行展示的,比如商品数据、聊天列表、通信录、朋友圈等。
白白白小艾
2022/03/24
7.5K0
Flutter 入门指北之快速搭建界面(含Flutter知识体系)
完整版脑图,后台回复 “Flutter” 关键字,关注 码个蛋(codeegg)会持续更新本系列文章.
陈宇明
2020/12/16
1.8K0
Flutter - ListView 挂件中使用 JSON 文件
在 app 开发中,最重要的部分是,我们需要从服务或者本地获取数据,渲染到我们的挂件中。
Jimmy_is_jimmy
2022/10/27
1.5K0
Flutter跨平台移动端开发
constrainedBox 可以给子 widget 添加更多约束条件。与 sizedBox 同通过 renderConstrainedBox 绘制
码脑
2019/05/25
3K0
Riverpod - flutter 状态管理的应用
Riverpod 是 Flutter 下知名度较高的状态管理依赖,同样出自 Provider 的开发者 rrousselGit 之手。
xcsoft
2024/07/31
2881
动手编写你的第一个 Flutter 应用
我将带领大家尝试编写一个 Flutter 应用,感受一下 Flutter 开发的语法特点和运行效率。
CSDN技术头条
2020/02/26
1K0
Flutter GridView 使用
今天学习一下在Flutter中怎么使用GridView,效果如上图。 头部是一个Banner,使用的是第三方的
赵哥窟
2019/09/20
2.3K0
Flutter GridView 使用
Flutter | Key 的原理和使用
在几乎所有的 widget 中,都有一个参数 key ,那么这个 key 的作用是什么,在什么时候才需要使用到 key ?
345
2022/02/11
1.3K0
Flutter | Key 的原理和使用
相关推荐
Flutter开发实战分析-pesto_demo解析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验