Flutter屏幕适配的三种方案

这篇具有很好参考价值的文章主要介绍了Flutter屏幕适配的三种方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

做移动端开发的同学都知道,针对不同型号和尺寸的手机要进行页面的适配,且 iOS 和 Android 适配方案各不相同,那我们用 Flutter 开发要怎么处理屏幕适配呢?

Flutter中的单位

Flutter使用的是类似于iOS中的点pt,也就是point。我们经常说 iPhone8 的尺寸是375x667,但是它的分辨率其实是 750x1334 。因为iPhone8的像素比(devicePixelRatio)是2.0,iPhone8plus的像素比是3.0。

iPhone各型号设备的尺寸

Flutter屏幕适配的三种方案

Flutter 中获取设备信息

获取设备相关的信息,可以使用官方提供的一个库

device_info: ^2.0.3
//获取设备的信息
Future getDeviceInfo() async{
  DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
  var dataInfo;
  //判断是iOS平台还是Android平台
  //IosDeviceInfo里面包含我们常用到的设备信息
  if(Platform.isIOS) {
    print('IOS设备:');
    IosDeviceInfo iosInfo = await deviceInfo.iosInfo;dataInfo = iosInfo;
  } else if(Platform.isAndroid) {
    print('Android设备');
    AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;dataInfo = androidInfo;
  }
  return dataInfo;
}

获取屏幕的尺寸

需要引入

import'dart:ui';

获取屏幕的宽高、刘海高度、分辨率等信息

// 1.媒体查询信息final mediaQueryData = MediaQuery.of(context);

// 2.获取宽度和高度final screenWidth = mediaQueryData.size.width;
final screenHeight = mediaQueryData.size.height;
final physicalWidth = window.physicalSize.width;
final physicalHeight = window.physicalSize.height;
final dpr = window.devicePixelRatio;

// 3.状态栏的高度// 有刘海的屏幕:44 没有刘海的屏幕为20final statusBarHeight = mediaQueryData.padding.top;
// 有刘海的屏幕:34 没有刘海的屏幕0final bottomHeight = mediaQueryData.padding.bottom;
print('屏幕width:$screenWidth height:$screenHeight');
print('分辨率: $physicalWidth * $physicalHeight');
print('像素比: $dpr');
print('状态栏height: $statusBarHeight 底部高度:$bottomHeight');

打印出的设备尺寸

Performing hot restart...
Syncing files to device iPhone 12 Pro...
Restarted application in 575ms.
flutter: 屏幕width:390.0 height:844.0
flutter: 分辨率: 1170.0 * 2532.0
flutter: 像素比: 3.0
flutter: 状态栏height: 47.0 底部高度:34.0

适配方案

1.通过等比换算的方式

计算公式:实际尺寸 = UI尺寸 * 设备宽度/设计图宽度

这里封装了一个类Adapt,通过类可以获取屏幕的信息

class Adapt {
  
  static double screenWidth = 0;
  static double screenHeight = 0;
  static double physicalWidth = 0;
  static double physicalHeight = 0;
  static double dpr = 0;
  static double ratio = 1.0;
  static double statusBarHeight = 0;
  static double bottomHeight = 0;

  static void initialize(BuildContext context, {double UIWidth = 375}) {
    // 1.媒体查询信息
    final mediaQueryData = MediaQuery.of(context);

    // 2.获取宽度和高度
    screenWidth = mediaQueryData.size.width;screenHeight = mediaQueryData.size.height;physicalWidth = window.physicalSize.width;physicalHeight = window.physicalSize.height;
    //像素比
    dpr = window.devicePixelRatio;

    // 3.状态栏的高度
    // 顶部有刘海:47pt 没有刘海的屏幕为20pt
    statusBarHeight = mediaQueryData.padding.top;
    // 底部有刘海:34pt 没有刘海的屏幕0pt
    bottomHeight = mediaQueryData.padding.bottom;
    //比例
    ratio = screenWidth/UIWidth;
  }

  static pt(size){
    return size * Adapt.ratio;
  }
}
示例代码

UI给出的设计稿的尺寸是375*667,定义一个大小为(300*300)pt的盒子,盒子中显示字体大小为30pt的文字

@override
Widget build(BuildContext context) {
  Adapt.initialize(context);
  returnScaffold(
    appBar: AppBar(
      title: const Text('屏幕适配'),
    ),
    body: Center(
      child: Container(
        width: Adapt.pt(300),
        height: Adapt.pt(300),
        color: Colors.orange,
        alignment: Alignment.center,
        child: Text(
          'Hello Word',
          style: TextStyle(fontSize: Adapt.pt(30)),
          textAlign: TextAlign.center,
        ),
      ),
    ),
  );
}

运行效果图,明显右边做适配的更符合效果

Flutter屏幕适配的三种方案

2. rpx方案适配

rpx是小程序中的适配方案,它将750px作为设计稿,1rpx=屏幕宽度/750,其它所有的单位都使用rpx单位。

  • 不管是什么屏幕,统一分成750份

  • 在iPhone8上: 1rpx = 375/750 = 0.5px

  • 在iPhone12proMax 上:1rpx = 428/750 = 0.571px

所以我们就可以通过上面的计算方式,算出一个rpx,再将自己的size和rpx单位相乘即可:比如300px的宽度:3002rpx

  • 在iPhone8上计算出的结果是300px

  • 在在iPhone12proMax上计算出的结果是342.6px通过计算可以看出,还是有明显数据上的差别的。

这里也是封装一个类 Adapt,直接可以获取屏幕的信息

class Adapt {
  static MediaQueryData _mediaQueryData = MediaQueryData();
  static double screenWidth = 0;
  static double screenHeight = 0;
  static double rpx = 0;
  static double px = 0;

  static void initialize(BuildContext context, {double standardWidth = 750}) {
    _mediaQueryData = MediaQuery.of(context);screenWidth = _mediaQueryData.size.width;screenHeight = _mediaQueryData.size.height;rpx = screenWidth / standardWidth;px = screenWidth / standardWidth * 2;
  }

  // 按照像素来设置
  static double setPx(double size) {
    return Adapt.rpx * size * 2;
  }

  // 按照rxp来设置
  static double setRpx(double size) {
    return Adapt.rpx * size;
  }
}
示例代码

和上面的需求是一样的,最后适配的效果是一样的

@override
Widget build(BuildContext context) {
  Adapt.initialize(context);
  returnScaffold(
    appBar: AppBar(
      title: const Text('屏幕适配'),
    ),
    body: Center(
      child: Container(
        width: Adapt.setPx(300),
        height: Adapt.setPx(300),
        color: Colors.orange,
        alignment: Alignment.center,
        child: Text(
          'Hello Word',
          style: TextStyle(fontSize: Adapt.setPx(30)),
          textAlign: TextAlign.center,
        ),
      ),
    ),
  );
}
Flutter屏幕适配的三种方案

注意:一定要在已经有 MaterialApp 的 Widget 中使用 context ,否则是无效的。我这里定义默认效果图的尺寸是 375*667,这里是可以自定义传入效果图的宽度的。

3. flutter_screenutil 插件

  • pubspec.yaml中引入

flutter_screenutil: ^5.0.1
  • 在已经有 MaterialApp 的 Widget 中使用 context 进行初始化

ScreenUtil.init(context,width:750,height:1334,allowFontScaling:false);
示例代码
Container(
   width: ScreenUtil().setWidth(300),
   height: ScreenUtil().setHeight(300)
 }
Text(
  'Hello Word',
  style: TextStyle(fontSize: ScreenUtil.getInstance().setSp(30)),
  textAlign: TextAlign.center,
)

其他更多用法可以参考官网文档:pub.flutter-io.cn/packages/fl…文章来源地址https://www.toymoban.com/news/detail-462243.html

到了这里,关于Flutter屏幕适配的三种方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • flutter-移动端适配

    不同屏幕之间的尺寸适配 使用插件 flutter_screenutil flutter 屏幕适配方案,用于调整屏幕和字体大小的flutter插件,让你的UI在不同尺寸的屏幕上都能显示合理的布局! 安装 # add flutter_screenutil flutter_screenutil: ^5.8.4

    2024年02月12日
    浏览(33)
  • Flutter:引领移动开发新潮流,跨平台应用程序的终极解决方案

    Flutter是由Google开发的一款开源移动应用开发框架,它可以帮助开发者快速高效地构建跨平台的移动应用程序。Flutter基于Dart编程语言,具有简单易学、高效灵活的特点,并且可以与现有的Android和iOS应用进行集成。本文将介绍Flutter的基本概念、开发环境搭建、基础组件、生命

    2024年02月04日
    浏览(86)
  • Android之屏幕适配方案

    在说明适配方案之前,我们需要对如下几个概念有所了解:屏幕尺寸,屏幕分辨率,屏幕像素密度。 屏幕尺寸 屏幕尺寸指屏幕的对角线的物理长度,单位是英寸,1英寸=2.54厘米。 比如常见的屏幕尺寸:5.0、5.99、6.0等等 屏幕分辨率 屏幕分辨率是指手机在横向、纵向上的像素

    2024年02月03日
    浏览(48)
  • Redis的三种部署方案

    在Redis中提供的集群方案总共有三种:单机模式,主从复制集群、哨兵模式,Redis分片集群 Redis 只运行在一台服务器上,并且所有的数据都存储在这一台服务器的内存中。 搭建主从复制集群解决的是高并发读问题。 单个Redis节点的并发能力有限,要进一步提高Redis的并发能力

    2024年04月10日
    浏览(33)
  • 微信小程序适配问题 移动端适配方案 viewport

    iPhone X 兼容 在小程序页面开发中,涉及到需要适配 iPhone X 的地方主要有:导航栏(NavigationBar),标签栏(TabBar)以及页面底部的吸底按钮。 对于position: fixed的可交互组件,如果渲染在iPhone X的安全区域外,容易误触 Home Indicator,应当把可交互的部分都渲染到安全区域内。

    2024年02月12日
    浏览(44)
  • Flutter笔记:发布一个模块 scale_design - (移动端)设计师尺寸适配工具

    Flutter笔记 发布一个模块scale_design 设计师尺寸适配工具与常用组件库 作者 : 李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 : 291148484@163.com 本文地址 :https://blog.csdn.net/qq_28550263/article/details/134210226 模块地址 :https://pub.dev/packages/scale_design 仓库地址 :https://github.com/jack

    2024年02月05日
    浏览(42)
  • 恒流电路的三种设计方案

    作为硬件研发工程师相信对恒流电路不会陌生,本文介绍下三种恒流电路的原理图。 三极管恒流电路 三极管恒流电路     三极管的恒流电路,主要是利用Q2三极管的基级导通电压为0.6~0.7V这个特性;当Q2三极管导通,Q1三极管基级电压被拉低而截止,负载R1不工作;负载R1流

    2024年02月11日
    浏览(51)
  • iOS 组件化的三种方案

    本文主要介绍iOS组件化的三种方案 URL Scheme Target - Action Protocol - Class 匹配 1.1、 URL Scheme路由 使 URL 处理本地的跳转 通过中间层进⾏注册 调⽤ (load方法里把被调用者注册到中间层) 注册表⽆需使用反射 非懒加载 / 注册表的维护 / 参数 URL Scheme路由示例  参考了系统URL Schem

    2024年02月12日
    浏览(37)
  • 微信小程序之scroll-view自适配屏幕高度解决方案

    需求说明: 一般用于列表数据的展示(带有搜索框),根据官方文档,scroll-view需要固定一个高度,那么,对于不同的手机分辨率来说,可能显示的效果就不一样了,有的没到底,有的显示不全等等 解决方案:   不同的手机,但是可以通过计算,获取到scroll-view的填充高度。

    2024年02月12日
    浏览(59)
  • pc端与移动端适配 解决方案

    一般网站实现pc端与移动端适配的需求,方案有两个: 1、一套页面,从设计时就考虑到跨设备适配,响应式的一步到位; 2、开发两套页面,根据设备尺寸加载加载不同的资源,目前已经不常见了; 做一个响应式的页面。即只用一个链接,用媒体查询来控制样式。同一个链接

    2024年02月04日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包