Flutter 第三方 flutter_screenutil(屏幕适配)

news2024/11/18 9:29:14

一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希望未来技术之巅上有你们也有我。

推荐一篇写的非常不过的文章:Flutter应用框架搭建(二)屏幕适配

安装+导入

flutter_screenutil: ^5.9.0
import 'package:flutter_screenutil/flutter_screenutil.dart';

举例

iPhone 12 mini

初始化

初始化 - 设置参考尺寸1

ScreenUtilInit

在这里插入图片描述

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return ScreenUtilInit(
      designSize: const Size(750, 1334),//  iphone6 750 1334       iphone 12 mini 1080 2340
      minTextAdapt: true,
      splitScreenMode: true,
      builder: (_ , child) {
        return MaterialApp(
          debugShowCheckedModeBanner: false,
          title: 'First Method',
          // You can use the library anywhere in the app even in theme
          theme: ThemeData(
            primarySwatch: Colors.blue,
            textTheme: Typography.englishLike2018.apply(fontSizeFactor: 1.sp),
          ),
          // home: child,
          initialRoute: Home.routeName,
          routes: {
            Home.routeName: (context) => Home(),
          },
        );
      },
      // child: Home(),
    );
  }

}

初始化 - 设置方式2

ScreenUtil.init

可以在每个页面设置

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter_ScreenUtil',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: HomePage(title: 'FlutterScreenUtil Demo'),
    );
  }
}

class HomePage extends StatefulWidget {
  const HomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    //设置尺寸(填写设计中设备的屏幕尺寸)如果设计基于360dp * 690dp的屏幕
    ScreenUtil.init(context, designSize: const Size(360, 690));
    ...
  }
}

使用这种方式只需在使用 flutter_screenutil 前进行初始化即可,一般放在根路由即第一个页面加载的时候进行初始化。

注意:ScreenUtil.init 不能在 MyApp 中进行初始化,会报如下错误 No MediaQuery ancestor could be found starting from the context that was passed to MediaQuery.of(). This can happen because you have not added a WidgetsApp, CupertinoApp, or MaterialApp widget (those widgets introduce a MediaQuery), or it can happen if the context you use comes from a widget above those widgets. 因为这个时候还没加载 MaterialApp 无法使用 MediaQuery.of(context ) 获取到屏幕宽高

关于上面两种初始化方法,flutter_screenutil 作者推荐使用第二种方式。

使用

double screenWidth = MediaQuery.of(context).size.width;
double screenHeight = MediaQuery.of(context).size.height;
print('系统宽: $screenWidth');//375.0
print('系统高: $screenHeight');//812.0

double utilWidth = ScreenUtil().screenWidth;
double utilHeight = ScreenUtil().screenHeight;
print('ScreenUtil宽: $utilWidth');//设备宽度 375.0
print('ScreenUtil高: $utilHeight');//设备高度 812.0

double pixelRatio = ScreenUtil().pixelRatio ?? 0.0;
print('pixelRatio  $pixelRatio');//设备的像素密度 3.0

double bottomBarHeight = ScreenUtil().bottomBarHeight;
print('bottomBarHeight  $bottomBarHeight');//底部安全区距离,适用于全面屏下面有按键的 34.0

double statusBarHeight = ScreenUtil().statusBarHeight;
print('statusBarHeight  $statusBarHeight');//状态栏高度 刘海屏会更高 50.0

double textScaleFactor = ScreenUtil().textScaleFactor;
print('textScaleFactor  $textScaleFactor');//系统字体缩放比例 1.0

double scaleWidth = ScreenUtil().scaleWidth;// 实际宽度设计稿宽度的比例 0.5
print('scaleWidth  $scaleWidth');
double scaleHeight = ScreenUtil().scaleHeight;// 实际高度与设计稿高度度的比例 0.6
print('scaleHeight  $scaleHeight');

Orientation orientation = ScreenUtil().orientation;// 屏幕方向 .portrait
print('orientation  $orientation');

设置屏幕的Container的宽度是屏幕宽度的一半

/// 宽高是宽度的 0.5 倍 , 显示正方形
Container(
  width: 0.5.sw,
  height: 0.5.sw,
  color: Colors.green,
),

根据宽度进行设置

//方式一:
ScreenUtil().setWidth(540)  //根据屏幕宽度适配尺寸

//方式二:
540.w

根据高度进行设置

//方式一:
ScreenUtil().setHeight(200) //根据屏幕高度适配尺寸(一般根据宽度适配即可)

//方式二:
200.h

根据宽度或高度中的较小者进行调整

//方式一:
ScreenUtil().radius(200)    //根据宽度或高度中的较小者进行调整

//方式二:
200.r

字体大小适配

ScreenUtil().setSp(24)      //字体大小适配

//方式一:
Text("Hello", style: TextStyle(fontSize: ScreenUtil().setSp(24)),),

//方式二:
Text("Hello", style: TextStyle(fontSize: 24.sp),),

除了上面 4 种扩展属性以外,还提供了 sm 以及 swsh

sm :取数值本身与 sp 的值最小的值,如 12.sm 则取 1212.sp 的值进行比较,取最小的值。
sw :screen width 的缩写,即屏幕宽度,作用是按屏幕宽度比例返回值。如 0.2.sw 则返回屏幕宽度的 20%,1.sw 则是整个屏幕宽度
sh :screen height 的缩写,及屏幕高度,作用与 sw 类似,返回指定比例的屏幕高度值。如 1.sh 为整个屏幕高度

注意

如果使用sp去设置字体,那么字体会根据屏幕的宽高缩放字体的,如果需要设置成,所有屏幕的字体大小都一样的可以像下面这么设计:

全局设置:

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("text", textScaleFactor: 1.0)

其他 Api

除了适配的 api 以外,flutter_screenutil 还提供了很多实用的 api ,如下 :

ScreenUtil().pixelRatio :设备的像素密度
ScreenUtil().screenWidth :屏幕宽度,等同于 1.sw
ScreenUtil().screenHeight :屏幕高度,等同于 1.sh
ScreenUtil().bottomBarHeight :底部导航高度,如全屏底部按键的高度
ScreenUtil().statusBarHeight :状态栏高度
ScreenUtil().textScaleFactor :系统字体缩放比例
ScreenUtil().scaleWidth :实际宽度与设计图宽度的比例
ScreenUtil().scaleHeight :实际高度与设计图高度的比例
ScreenUtil().orientation :屏幕方向

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1180663.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入浅出 JetPack Compose UI 自动更新原理

为什么需要学习 Compose 的底层原理&#xff1f; 我想学习底层原理的主要原因是我对 Jetpack Compose 是如何运作的非常感兴趣。相对于传统的 View 系统&#xff0c;JetPack Compose 写起来相当神奇。具体来说&#xff0c;Composable 函数不会有返回值&#xff1b;它会自动更新…

NVIDIA Jetson SOC 内存分配策略

CPU 是Host, GPU 是Device, 系统内存分配策略如下: 这段话的翻译如下&#xff1a; 集成的GPU会和CPU以及其他Tegra引擎共享DRAM&#xff08;动态随机存储器&#xff09;&#xff0c;并且CPU可以通过将DRAM的内容移动到交换区域&#xff08;SWAP area&#xff09;或者相反来控制…

每个 .vue 文件最多可以包含一个顶层 <template> 块

问题: 回答: 实际解决方法: 上图将template的#header写到了上一行的el-table-column中就出发这个问题

直播带货小程序的前端开发技巧与工具

当下&#xff0c;直播带货小程序已经成为了一个备受欢迎的选择&#xff0c;因为它能够将传统直播和电子商务相结合&#xff0c;为用户提供更好的购物体验。本文将深入探讨直播带货小程序的前端开发技巧和工具&#xff0c;以帮助开发人员更好地构建这一类型的应用。 1.小程序基础…

【Orangepi Zero2 全志H616】驱动OLED屏应用-IIC协议、设备的映射(mmap)

一、OLED屏幕 二、Orangepi的IIC接口 三、wiringPi库示例代码 四、Source insight 初步分析wiringP源码OLED_DEMO 五、设备的映射 六、mmap函数 七、简单OLED屏幕开发及实现 一、OLED屏幕 二、Orangepi的IIC接口 1) 由 26pin 的原理图可知&#xff0c; Orange Pi Zero 2 可用…

深度学习(CNN+RNN)笔记2

文章目录 第五课&#xff1a;序列模型(Sequence Models)第一周&#xff1a;循环神经网络&#xff08;Recurrent Neural Networks&#xff09;【序列模型、语言模型序列生成、对新序列采样。RNN、GRU、LSTM、双向RNN、深度RNN】第二周&#xff1a;自然语言处理与词嵌入&#xff…

从受众吸引到客户:提高海外社媒转化率的10个技巧!

在当今数字化时代&#xff0c;社交媒体已经成为企业与海外市场互动的关键工具。然而&#xff0c;只有吸引了足够的受众并将他们转化为客户&#xff0c;社交媒体才能实现其真正的潜力。本文Nox聚星将给大家分享提高海外社交媒体的转化率的10个实用技巧&#xff0c;将潜在受众转化…

互联网医院|湖南互联网医院|解决医疗资源不足问题

随着科技的进步和互联网的普及&#xff0c;互联网医院作为一种新型的医疗模式&#xff0c;逐渐受到人们的关注和认可。本文将详细介绍互联网医院的功能和优势&#xff0c;帮助大家全面了解这种新型的医疗服务。 一、互联网医院的功能 1、在线问诊&#xff1a;互联网医院为患者…

[黑马程序员Pandas教程]——Pandas数据结构

目录&#xff1a; 学习目标认识Pandas中的数据结构和数据类型Series对象通过numpy.ndarray数组来创建通过list列表来创建使用字典或元组创建s对象在notebook中不写printSeries对象常用API布尔值列表获取Series对象中部分数据Series对象的运算DataFrame对象创建df对象DataFrame…

漏洞复现--用友NC accept.jsp任意文件上传

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

剑指JUC原理-14.ReentrantLock原理

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&…

为什么免费证书的有效期为90天

关心SSL证书的朋友们最近可能发现&#xff0c;包括阿里云&#xff0c;亚洲诚信在内的SSL证书服务商&#xff0c;都已经陆续的把之前一年期的免费证书调整为90天有效期&#xff0c;之前的一年期证书价格从免费上涨到几十到几百元不等&#xff0c;这是为什么呢&#xff1f;为什么…

阿里云双十一活动经济型e实例2核2G3M带宽配置云服务器搭建网站教程参考

阿里云2023双十一推出的优惠活动“金秋云创季”&#xff0c;轻量应用服务器2核2G3M带宽只要87元1年&#xff0c;2核4G4M带宽只要165元1年。云服务ECS下的经济型e实例2核2G 3M固定带宽&#xff0c;价格只要99元/1年&#xff0c;新老用户都可购买&#xff0c;同时在2026年3月31日…

19、Python单元测试基础:unittest模块的基本使用

文章目录 创建测试用例测试套件断言运行测试测试固件Python的unittest模块是基于Java的JUnit框架开发出来的,提供了编写和运行单元测试的工具。这篇文章将介绍unittest模块的基本使用,涵盖创建测试用例、测试套件、断言、运行测试以及测试固件的使用。 创建测试用例 在unit…

“菊风Juphoon”邀您莅临11月22-24日CNF南京应急展消防展 | 展位号:115-1

公司简介 菊风依托互联网和电信网音视频融合技术积累&#xff0c;提供智能化的音视频统一通信产品及服务。面向应急管理、消防救援、智慧城市等多个领域&#xff0c;菊风推出适用于全网通的统一通信一体机、统一通信平台。 此外&#xff0c;菊风还提供视频能力平台&#xff0…

2 创建svelte项目(应用程序)

官网方式搭建&#xff1a; npm create sveltelatest my-app cd my-app npm install npm run dev 官网中介绍&#xff1a; 如果您使用的是 VS Code&#xff0c;安装 Svelte for VS Code 就可以了&#xff0c;以便语法高亮显示。 然后&#xff0c;一旦您的项目设置好了&#…

网上书店项目

源码下载地址 支持&#xff1a;远程部署/安装/调试、讲解、二次开发/修改/定制 程序运行视频查看 管理员 图书管理 添加图书 删除图书(可批量删除) 修改图书 查看图书(分页查看) 图书上下架(可批量处理) 图书推荐&#xff08;新品推荐、精品推荐&#xff0c;可批量处理&#…

IGP高级特性简要介绍(OSPF-上篇)

OSPF高级特性 一、OSPF_提升故障收敛及网络恢复速度 1.FRR与BFD快速恢复故障 1.1 FRR 在传统转发模式下&#xff0c;当到达同一个目的网络存在多条路由时&#xff0c;路由器总是选择最优路由使用&#xff0c;并且下发到FIB表指导数据转发。 当最优路由故障时&#xff0c;需…

辐射骚扰整改思路及方法:参数选择与解决之道?|深圳比创达电子EMC

辐射骚扰整改思路及方法&#xff1a;参数选择与解决之道&#xff1f;相信不少人是有疑问的&#xff0c;今天深圳市比创达电子科技有限公司就跟大家解答一下&#xff01; 某产品首次EMC测试时&#xff0c;辐射、静电、浪涌均失败。本篇文章就“参数选择与解决之道”问题进行详细…

Go语言Gin框架前后端分离项目开发工程化实例

文章目录 基本数据配置配置文件管理数据库配置路由配置封装公共方法 数据库模型数据表内容model文件DTO文件 中间件错误异常捕获中间件跨域中间件token认证中间件JWT 控制器UserController 运行调试注册接口登录接口获取用户信息 构建发布项目前端VUE调用接口 基本数据配置 配…