热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【Flutter问题系列第73篇】如何在Flutter应用中进行屏幕适配(含使用教程、原理解析)

这是【Flutter问题系列第73篇】,如果觉得有用的话,欢迎关注专栏。文章目录一:问题描述二:解决方案

这是【Flutter 问题系列第 73 篇】,如果觉得有用的话,欢迎关注专栏。

文章目录

      • 一:问题描述
      • 二:解决方案
        • 2-1:引入、获取依赖
        • 2-2:初始化插件
        • 2-3:如何使用插件
      • 三:屏幕适配原理及 rpx 的解释说明


一:问题描述

随着移动端的设备越来越多样化,尤其是安卓手机五花八门的屏,屏幕适配也变得越来越复杂。

那么在 Flutter 中针对不同分辨率的手机如何进行屏幕适配呢?

前面先说下如何屏幕适配,省去那些繁文缛节,怎么简单怎么来,如果有用,可以再来看末尾的解析。

二:解决方案

这里用到 pub 上的第三方插件库 flutter_screenutil,截止到发文插件已经更新到了 5.5.3+2。

因为我一直用的是 5.0.0+2 版本,挺稳定的,所以后面将以 5.0.0+2 版本为例说明 flutter_screenutil 插件如何使用。

2-1:引入、获取依赖

在项目的配置文件 pubspec.yaml 中引入依赖,如下图所示

在这里插入图片描述

然后在终端执行 flutter pub get 命令获取依赖。

2-2:初始化插件

为方便后续使用,我们定义一个 util 的文件夹,新建一个 rpx.dart 文件,然后在此文件中进行插件的初始化。

代码如下所示

import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';// ------------------------------------------------------
// author:Allen Su
// date :2022/7/7 23:04
// usage :屏幕适配
// ------------------------------------------------------/// 初始化屏幕适配(以 iphone6 为设计尺寸)
void initScreenUtil(BoxConstraints constraints) {ScreenUtil.init(constraints, designSize: Size(375, 667));
}/// rpx 根据屏幕宽度自适应 1rpx = 0.5px = 1物理像素
double rpx(double rpx) {return ScreenUtil().setWidth(rpx);
}

这里将 rpx 设备为全局的方便调用(之前用的静态类,每次使用起来很麻烦)

注:至于为什么命名为 rpx 和为什么要以 375x667 为设计尺寸,放在文末进行解释说明。

初始化插件的方法有了,在哪里调用呢?需要在 main.dart 中,并且在加载 MaterialApp 之前进行初始化

代码如下所示

class AllenSuApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return LayoutBuilder(builder: (BuildContext context, BoxConstraints constraints) {initScreenUtil(constraints); // 初始化屏幕适配插件return MaterialApp(home: HomePage(),);},);}
}

准备工作已经完成,接下来就是如何使用了。

2-3:如何使用插件

使用起来非常的简单,只需要把要设置的数字直接当作参数传给 rpx 即可,比如设计稿给的盒子宽是 150 ,那你就直接把 150 填进去即可。

下面举例说明。

例一:设置字体大小

Widget _view() {return Text("大家好,我是 Allen Su",style: TextStyle(fontSize: rpx(16)),);}

例二:设置盒子大小,内外边距

Widget _view() {return Container(width: rpx(150),height: rpx(100),padding: EdgeInsets.symmetric(vertical: rpx(15)),margin: EdgeInsets.symmetric(horizontal: rpx(10)),);}

其它的情况大家举一反三即可,使用起来是不是特别的方便呢?

5.5.3+2 版本的改动和适配

我也下载了 5.5.3+2 版本的插件,相比较当前代码,只是在初始化插件时,把参数类型由 BoxConstraints 改为了 BuildContext,修改后的代码如下所示

void initScreenUtil(BuildContext context) {ScreenUtil.init(context, designSize: Size(375, 667));
}

相应地,在引用 initScreenUtil 的地方也要修改其参数类型。

现在你已经会在 Flutter 应用中进行屏幕适配了,如果你对其原理有兴趣可以继续往下看。

三:屏幕适配原理及 rpx 的解释说明

①:原理

查看 flutter_screenutil 插件的源码可知,针对不同设备只是把原型图上的尺寸等比例放大和缩小了,其原理是

开发尺寸 / 原型图尺寸 = 实际屏幕宽度 / 原型图屏幕宽度

②:什么是 rpx

rpx 单位是微信小程序中 css 的尺寸单位,rpx 可以根据屏幕宽度进行自适应,规定屏幕宽为750rpx,

具体的可以点击查看微信小程序中对于 rpx 的解释说明。

③:Flutter 中的单位

我们知道在 Android 中常用的单位有 px、dp、sp 等,在 iOS 中是以 pt(point)为单位,在 Flutter 中的单位是什么呢?

Flutter 的单位使用的类似于 iOS 中的 pt,像我们平常所说的 iphone6 的尺寸是 375x667,但其实它的分辨率是 750x1334。

④:rpx 和 px 的换算关系

也就是说,rpx 和 px 存在这样的关系

  • 1 rpx = 0.5 px = 1 物理像素
  • 1 px = 1 物理像素 = 2 rpx

这也是为什么我们会以 375x667 作为初始尺寸。而不是 750x1334。

⑤:为什么使用 rpx 不需要进行单位转换

这里放一张截图,看下其它设备的换算关系

在这里插入图片描述

因为设计图一般为 2 倍图,所以我们可以直接 rpx 单位,不用再进行二次转换了。

这也是为什么我们可以直接把原型图中的尺寸,当作参数写入到封装好的 rpx 方法中的原因。

目前为止并没有完美的屏幕适配方案,我们只能尽可能的做到完美,所以这需要我们平常多多注意可能溢出、布局错乱的问题(Flutter 也提供了自适应的组件如 SafeArea、Expanded 等)。

至此,如何在 Flutter 应用中进行屏幕适配便介绍到这里。

本来想着两个小时可以写完的,不知不觉已经 1点 22 了,溜了溜了~

你的问题得到解决了吗?欢迎在评论区留言。

赠人玫瑰,手有余香,如果觉得文章不错,希望可以给个一键三连,感谢。



结束语
Google 的 Flutter 越来越火,截止 2022年7月8日 GitHub 标星已达 142K,Flutter 毅然是一种趋势,所以作为前端开发者,没有理由不趁早去学习。

无论你是 Flutter 新手还是已经入门了,不妨先点个关注,后续我会将 Flutter 中的常用组件(含有源码分析、组件的用法及注意事项)以及可能遇到的问题写到 CSDN 博客中,希望自己学习的同时,也可以帮助更多的人。

推荐阅读
  • 自然语言处理(NLP)——LDA模型:对电商购物评论进行情感分析
    目录一、2020数学建模美赛C题简介需求评价内容提供数据二、解题思路三、LDA简介四、代码实现1.数据预处理1.1剔除无用信息1.1.1剔除掉不需要的列1.1.2找出无效评论并剔除 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 短视频app源码,Android开发底部滑出菜单首先依赖三方库implementationandroidx.appcompat:appcompat:1.2.0im ... [详细]
  • PBO(PixelBufferObject),将像素数据存储在显存中。优点:1、快速的像素数据传递,它采用了一种叫DMA(DirectM ... [详细]
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • 本文将介绍如何在混合开发(Hybrid)应用中实现Native与HTML5的交互,包括基本概念、学习目标以及具体的实现步骤。 ... [详细]
  • 我有一个从C项目编译的.o文件,该文件引用了名为init_static_pool ... [详细]
  • Android 自定义 RecycleView 左滑上下分层示例代码
    为了满足项目需求,需要在多个场景中实现左滑删除功能,并且后续可能在列表项中增加其他功能。虽然网络上有很多左滑删除的示例,但大多数封装不够完善。因此,我们尝试自己封装一个更加灵活和通用的解决方案。 ... [详细]
  • WinMain 函数详解及示例
    本文详细介绍了 WinMain 函数的参数及其用途,并提供了一个具体的示例代码来解析 WinMain 函数的实现。 ... [详细]
  • MySQL 5.7 学习指南:SQLyog 中的主键、列属性和数据类型
    本文介绍了 MySQL 5.7 中主键(Primary Key)和自增(Auto-Increment)的概念,以及如何在 SQLyog 中设置这些属性。同时,还探讨了数据类型的分类和选择,以及列属性的设置方法。 ... [详细]
  • 使用Tkinter构建51Ape无损音乐爬虫UI
    本文介绍了如何使用Python的内置模块Tkinter来构建一个简单的用户界面,用于爬取51Ape网站上的无损音乐百度云链接。虽然Tkinter入门相对简单,但在实际开发过程中由于文档不足可能会带来一些不便。 ... [详细]
  • 本文介绍了如何使用Python爬取妙笔阁小说网仙侠系列中所有小说的信息,并将其保存为TXT和CSV格式。主要内容包括如何构造请求头以避免被网站封禁,以及如何利用XPath解析HTML并提取所需信息。 ... [详细]
  • 三角测量计算三维坐标的代码_双目三维重建——层次化重建思考
    双目三维重建——层次化重建思考FesianXu2020.7.22atANTFINANCIALintern前言本文是笔者阅读[1]第10章内容的笔记,本文从宏观的角度阐 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • 本文介绍如何使用线段树解决洛谷 P1531 我讨厌它问题,重点在于单点更新和区间查询最大值。 ... [详细]
author-avatar
blankworld
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有