笔者在这篇文章ReactNative全面屏(Android)适配问题说起了如今的全面屏问题,不只是Android平台,IOS平台也是,给个人感受就是手机愈来愈长了。 如今的手机长宽比早就不是以前的16:9了,好比iphoneX 的长宽比为13:6,而如今多数的Android手机都到了19.5:9,有的甚至达到了21:9。 基于科技的发展(适配的血泪史),Flutter开发天然也须要注意这个问题。 在Flutter开发中,一般使用Scaffold的appBar和bottomNavigationBar组件的页面是没有适配问题,它内部对全面屏进行了适配。 适配问题主要是出如今没有使用Scaffold的状况下。 看一下这段代码,没有使用Scaffold:html
class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: Container( color: Colors.white, child: Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: <Widget>[ Container( color: Colors.lightBlue, child: Text('头部'), ), Container( color: Colors.redAccent, child: Text('底部'), ) ], ), ) ); } }
运行效果以下: react
能够看到上面和下面的组件已经被遮挡了,这就出现了适配问题,适配的主要问题就是集中在以下两点:安全
对于以上两种问题,Flutter给出了除上面使用Scaffold,还有以下两种方案:app
接下来具体看一下这两个方案的使用框架
这个使用比较简单,只要须要将组件进行包裹便可,less
home: SafeArea(child: Container( color: Colors.white, child: Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: <Widget>[ Container( color: Colors.lightBlue, child: Text('头部'), ), Container( color: Colors.redAccent, child: Text('底部'), ) ], ), ))
home位置修改成以下代码: home: SafePage() ------------------- 建立一个SafePage class SafePage extends StatelessWidget{ @override Widget build(BuildContext context) { EdgeInsets paddings = MediaQuery.of(context).padding; return Container( color: Colors.white, padding: EdgeInsets.fromLTRB(0, paddings.top, 0, paddings.bottom), child: Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: <Widget>[ Container( color: Colors.lightBlue, child: Text('头部'), ), Container( color: Colors.redAccent, child: Text('底部'), ) ], ), ); } }
以上两种方案运行效果以下图,能够看到头部和底部已经正常显示了。 iphone
上面这两种方案适用于IOS和Android两个平台,对于Android平台的适配在ReactNative全面屏(Android)适配问题也提到了另外的一种方案,看你们的实际须要,来采起合适的适配方案。ide
查看一下SafeArea这个Widget组件的源码,能够看到其实内部也是采用了上面提到的第二种方案,至关于SafeArea对第二种方案的封装,开发中使用起来更方便一下,源码以下ui
@override Widget build(BuildContext context) { assert(debugCheckHasMediaQuery(context)); /// 以下五行代码就是SafeArea能够进行适配的缘由, final MediaQueryData data = MediaQuery.of(context); EdgeInsets padding = data.padding; // Bottom padding has been consumed - i.e. by the keyboard if (data.padding.bottom == 0.0 && data.viewInsets.bottom != 0.0 && maintainBottomViewPadding) padding = padding.copyWith(bottom: data.viewPadding.bottom); return Padding( 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, ), ); }
截图可能看起来更方便,注意看红框部分 spa
关于Flutter的全面屏适配先分享这些。
欢迎关注个人公众号:君伟说。分享移动开发技术,职场生活和工做中的酸甜苦辣。
原文出处:https://www.cnblogs.com/wayne6688/p/12214767.html