Flutter

Flutter 全面屏适配Android 和IOS

2021-03-09  本文已影响0人  景小帮

概要:

1.全屏幕特色,及存在的问题;

2.适配IOS全屏iPhone X;

3.适配Android 全面屏

总结:

全屏幕特点,以及存在的问题

特点:

1、大、屏占比高、长宽比不再是比16:9 ,达到了19.5:9甚至更高;

2、短边的像素,density的取值都是一样的,所以需要适配的是长边;

问题:

1.传统布局的高度不足,导致上下留黑边

2.甚至屏幕顶部或底部的布局,如弹框,会在全面屏手机上发生位移


页面适配

全面屏的页面适配分两种情况:

1.一种是对于页面已经使用了Scaffold的appBar与bottomNavigationBar的页面是不需要额外适配的,因为Scaffold框架会自动帮我们完成这些适配工作

2.另外一种情况,在很多页面没有用到Scaffold或者Scaffold的appBar与bottomNavigationBar,那么该如何适配全面屏呢?

对于这种情况要适配全面屏需要知道以下要点:

适配要点:

1.顶部NavigationBar上部预留安全区域;

2.底部NavigationBar 底部预留安全区域;

对于安全区域的适配有两种方案:

方案一:采用SafeArea来包裹页面,SafeArea是Flutter中的一个用于适配全面屏的组件,它类似于RN中SafeAreaView主要是用于解决适配全面屏手机的安全区域的问题;

优缺点:相对简单,只需要引入SafeArea,但不够灵活。

方案二:借助MediaQuery.of(context).padding获取屏幕四周的Padding,然后根据Padding自己实现对安全区域的控制;

优缺点:需要借助MediaQuery.of(context).padding自己实现对安全区域的控制,相对复杂些,但灵活度比较高

具体使用方法:

效果图:

代码:(自己写的具体例子)

import 'package:flutter/material.dart';

///

/// 全面屏适配 ios 可以通过以下两种方式(选择其中一种)进行适配,

/// android 以下也适用但是还需要在android 清单文件AndroidManifest.xml进行配置

///    <!--设置全面屏-->

///        <meta-data

///            android:name="android.max_aspect"

///            android:value="2.3" />

///

class ScreenPageextends StatefulWidget {

@override

  _ScreenPageStatecreateState() =>_ScreenPageState();

}

class _ScreenPageStateextends State {

@override

  Widgetbuild(BuildContext context) {

return _mediaQuery();

  }

///方法一,借助SafeArea 来完成

  _safeArea(){

return MaterialApp(

title:'全面屏适配',

      theme:ThemeData(primarySwatch: Colors.blue),

      home:Container(

decoration:BoxDecoration(color: Colors.white),

        child:SafeArea(

child:Column(

mainAxisAlignment: MainAxisAlignment.spaceBetween,

            children: [

Text("顶部"),

              Text('底部'),

            ],

          ),

        ),

      ),

    );

  }

///方法二,通过MediaQuery 实现

  _mediaQuery(){

final EdgeInsets padding = MediaQuery.of(context).padding;

    return MaterialApp(

title:'全面屏适配',

      theme:ThemeData(primarySwatch: Colors.blue),

      home:Container(

padding:EdgeInsets.fromLTRB(0, padding.top,0,padding.bottom),

        decoration:BoxDecoration(color: Colors.white),

        child:Column(

mainAxisAlignment: MainAxisAlignment.spaceBetween,

            children: [

Text("顶部"),

              Text('底部'),

            ],

          ),

      ),

    );

  }

}

上一篇下一篇

猜你喜欢

热点阅读