Flutter应用框架搭建之屏幕适配

背景:

移动设备多样性,特别是Android的碎片化严重,存在各种各样的分辨率,flutter跨平台开发又需要同时支持Android和IOS,为尽可能的还原设计图效果提升用户的体验,根据设计稿设计屏幕ui的时候我们需要考虑到屏幕适配的问题。

推荐方法:

直接使用ScreenUtil.init方法,传入屏幕尺寸、设计图尺寸和屏幕方向可以对flutter_screenutil进行初始化,代码如下:

ScreenUtil.init(
  BoxConstraints(
    maxWidth: MediaQuery.of(context).size.width,  //屏幕宽度
    maxHeight: MediaQuery.of(context).size.height, //屏幕高度
  ),
  designSize: const Size(360, 690), // 设计图尺寸
  orientation: Orientation.portrait); // 屏幕方向
)

使用这种方式只需要在使用flutter_screenutil前进行初始化即可,一般放在根路由即第一个页面加载的时候进行初始化。
注意:ScreenUtil.init不能够在MyApp中进行初始化,此时还没有加载MaterialApp无法使用MediaQuery.of(context)获取到屏幕的宽高。
初始化以后就可以使用flutter_screenutil提供的方法获取到适配后的数值进行使用了。
可以通过如下的api获取宽高以及字体的适配数值。

ScreenUtil().setWidth(540)  //根据屏幕宽度适配尺寸
ScreenUtil().setHeight(200) //根据屏幕高度适配尺寸(一般根据宽度适配即可)
ScreenUtil().radius(200)    //根据宽度或高度中的较小者进行调整
ScreenUtil().setSp(24)      //字体大小适配

传入的参数即为设计图上的大小。在实际使用中的示例如下:

Container(
  width: ScreenUtil().setWidth(200),
  height: ScreenUtil().setHeight(540),
  child: Text("Hello", style: TextStyle(fontSize: ScreenUtil().setSp(24)),),
);

flutter_screenutil更简单的写法,使用dart扩展的num类型:
上面的每一个方法和下面的相对应:

ScreenUtil().setWidth(540)  =>  540.h
ScreenUtil().setHeight(200) =>  200.w
ScreenUtil().radius(200)    =>  200.r
ScreenUtil().setSp(24)      =>  24.sp

相应的修改之后的使用示例:

Container(
width: 200.w,
height: 540.h,
child: Text("Hello", style: TextStyle(fontSize: 24.sp),),
);

注意:1.w!=1.h除非屏幕的分辨率比例和设计图的比例一致,所以要设置正方形,切记使用相同的单位,如果设置相同的w和h,可能是长方形。
除了上面的4钟扩展属性以外,还提供了sm以及sw和sh
sm:取数值本身和sp的值较小的值,如:12.sm则取12和12.sp的值进行比较,取较小的值。
sw:screen width的缩写,表示的是屏幕宽度,作用是按照屏幕宽度比例返回值。如0.2sw则返回屏幕宽度的20%,1.sw则是整个屏幕宽度
sh:screen height的缩写,即屏幕高度,作用于sw类似,返回指定比例的屏幕高度值。如1.sh为整个屏幕的高度。
使用sp作为字体单位,默认是会随着系统字体缩放进行变化的,如果不想让字体随着系统的缩放进行变化,可以设置textScaleFactor为1.0来实现。项目中可对MaterialApp进行全局设置,或者对Text进行单独的设置。
全局设置:

MaterialApp(
        debugShowCheckedModeBanner: false,
        title: 'Flutter_ScreenUtil',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        builder: (context, widget) {
          return MediaQuery(
            ///设置文字大小不随系统设置改变
            data: MediaQuery.of(context).copyWith(textScaleFactor: 1.0),
            child: widget,
          );
        },
        home: HomePage(title: 'FlutterScreenUtil Demo'),
      ),

单独设置:

Text("text", textScaleFactor: 1.0)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值