当前位置: 首页 > news >正文

Flutter 学习之旅 之 flutter 使用 flutter_screenutil 简单进行屏幕适配

Flutter 学习之旅 之 flutter 使用 flutter_screenutil 简单进行屏幕适配

目录

Flutter 学习之旅 之 flutter 使用 flutter_screenutil 简单进行屏幕适配

一、简单介绍

二、简单介绍 flutter_screenutil

三、安装 carousel_slider

四、简单案例实现

五、关键代码

六、补充说明


一、简单介绍

Flutter 是一款开源的 UI 软件开发工具包,由 Google 开发和维护。它允许开发者使用一套代码同时构建跨平台的应用程序,包括移动设备(iOS 和 Android)、Web 和桌面平台(Windows、macOS 和 Linux)。

Flutter 使用 Dart 编程语言,它可以将代码编译为 ARM 或 Intel 机器代码以及 JavaScript,从而实现快速的性能。Flutter 提供了一个丰富的预置小部件库,开发者可以根据自己的需求灵活地控制每个像素,从而创建自定义的、适应性强的设计,这些设计在任何屏幕上都能呈现出色的外观和感觉。

二、简单介绍 flutter_screenutil

网址:flutter_screenutil | Flutter package

flutter_screenutil 是一个用于 Flutter 应用的屏幕适配插件。它通过设置设计稿的尺寸,自动计算屏幕缩放比例,从而实现宽度、高度和字体大小的自适应调整。使用 .w、.h 和 .sp 等单位,开发者可以轻松实现跨设备的布局适配,确保应用在不同屏幕尺寸和分辨率的设备上保持一致的显示效果。

中文文档地址:flutter_screenutil/README_CN.md at master · OpenFlutter/flutter_screenutil · GitHub

属性类型默认值描述
designSizeSizeSize(360, 690)设计稿中设备的尺寸(单位随意,建议dp,但在使用过程中必须保持一致)
deviceSizeSizenull物理设备的大小
builderWidget Function()Container()一般返回一个MaterialApp类型的Function()
orientationOrientationportrait屏幕方向
splitScreenModeboolfalse支持分屏尺寸
minTextAdaptboolfalse是否根据宽度/高度中的最小值适配文字
contextBuildContextnull传入context会更灵敏的根据屏幕变化而改变
childWidgetnullbuilder的一部分,其依赖项属性不使用该库
rebuildFactorFunctiondefault返回屏幕指标更改时是否重建。

 注意:builder和child中必须填写至少一项

三、安装 carousel_slider

1、直接运行命令

使用 Flutter:flutter pub add flutter_screenutil

flutter_screenutil/README_CN.md at master · OpenFlutter/flutter_screenutil · GitHub

2、或者在 pubspec.yaml 添加

dependencies:flutter_screenutil: ^5.9.3

四、简单案例实现

1、这里使用 Android Studio 进行创建 Flutter 项目

2、创建一个 application 的 Flutter 项目

3、编写代码,进行简单屏幕适配功能

4、连接设备,运行项目,简单效果如下

五、关键代码

// 导入 Flutter 的基础组件库
import 'package:flutter/material.dart';
// 导入 flutter_screenutil 插件,用于屏幕适配
import 'package:flutter_screenutil/flutter_screenutil.dart';// 主函数,程序的入口点
void main() {runApp(MyApp());
}// 定义一个 StatelessWidget,作为应用的根组件
class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {// 使用 ScreenUtilInit 包裹整个应用,初始化屏幕适配功能return ScreenUtilInit(// 设计稿的尺寸,根据设计稿的宽度和高度设置designSize: Size(375, 812), // 设计稿尺寸(例如 iPhone X 的尺寸)// 是否开启最小文本适配,确保文本在不同设备上保持可读性minTextAdapt: true,// builder 是一个函数,用于构建应用的根组件builder: (context, child) { // 注意这里的参数和返回值return MaterialApp(// 应用的标题,显示在任务栏或窗口标题中title: 'Flutter ScreenUtil Demo',// 定义应用的主题,设置主色调为蓝色theme: ThemeData(primarySwatch: Colors.blue,),// 设置应用的默认颜色为黑色(可选)color: Colors.black,// 应用的首页,将 MyHomePage 作为 child 传入home: child,);},// 将主页组件 MyHomePage 作为 ScreenUtilInit 的子组件传入child: MyHomePage(), // 将主页作为 child 传入);}
}// 定义主页组件
class MyHomePage extends StatelessWidget {@overrideWidget build(BuildContext context) {// 使用 Scaffold 构建页面结构return Scaffold(// 设置 Scaffold 的背景颜色为黑色backgroundColor: Colors.black,// 定义页面的顶部导航栏appBar: AppBar(// 设置 AppBar 的背景颜色为黑色backgroundColor: Colors.black,// 设置导航栏的标题title: Text('Flutter ScreenUtil 示例',// 设置标题的文本颜色为白色style: TextStyle(color: Colors.white),),// 将标题居中显示centerTitle: true,),// 定义页面的主体内容body: Center(// 使用 Center 包裹子组件,确保子组件居中显示child: Container(// 设置容器的宽度,使用 ScreenUtil 的适配单位width: 300.w,// 设置容器的高度,使用 ScreenUtil 的适配单位height: 100.h,// 设置容器的背景颜色为蓝色color: Colors.blue,// 容器的子组件是一个 Text 文本child: Text('适配后的容器',// 设置文本的字体大小,使用 ScreenUtil 的适配单位style: TextStyle(fontSize: 16.sp, color: Colors.white), // 字体颜色为白色// 设置文本居中对齐textAlign: TextAlign.center,),),),);}
}

代码说明:

  1. 导入库:代码开头导入了必要的库,包括 Flutter 的基础组件库和 flutter_screenutil 插件。

  2. ScreenUtilInit:这是 flutter_screenutil 的入口组件,用于初始化屏幕适配功能。designSize 设置了设计稿的尺寸,minTextAdapt 用于开启最小文本适配。

  3. MaterialApp:这是 Flutter 的一个基础组件,用于构建 Material Design 风格的应用。theme 设置了应用的主题,home 设置了应用的首页。

  4. Scaffold:这是 Flutter 中用于构建页面结构的组件,包含导航栏(AppBar)和页面主体(body)。

  5. AppBarContainer:分别用于设置导航栏和页面主体的样式。TextStyle 用于设置文本的样式,包括字体大小和颜色。

六、补充说明

使用 flutter_screenutil 的注意事项

    正确初始化:
        在使用 flutter_screenutil 之前,必须在应用的入口处(如 main.dart)初始化 ScreenUtilInit,并设置设计稿的尺寸。
    示例:

    return ScreenUtilInit(designSize: Size(375, 812), // 设计稿尺寸minTextAdapt: true, // 文本自适应优化builder: (_, child) => MaterialApp(home: child),child: MyHomePage(),);
  • 选择合适的设计稿尺寸:

    设计稿尺寸应与 UI 设计师提供的原始尺寸一致,通常以像素为单位。例如,移动端可选择 375×812(iPhone 13),平板可选择 768×1024。

  • 适配单位的使用:

    .w 和 .h 用于宽度和高度的适配。
    .sp 用于字体大小的适配,会考虑系统字体缩放设置。
     .ssp 和 .nsp 分别用于强制跟随系统字体缩放和禁用系统字体缩放。

  • 适配圆形元素:

    对于圆形或正方形元素,可以使用 .r 单位,它会根据宽高中的较小值进行适配。

  • 安全区域处理:

    使用 ScreenUtil().bottomBarHeight 和 ScreenUtil().statusBarHeight 来适配刘海屏和全面屏。

  • 百分比布局:

    可以使用 .sw 和 .sh 来设置屏幕宽度和高度的百分比,例如 0.5.sw 表示屏幕宽度的 50%。

  • 横竖屏适配:

    可以通过 ScreenUtilInit 的 orientation 参数强制设置横竖屏适配。

  • 避免过度适配:

    对于简单布局,建议使用 Flex 或 MediaQuery,而不是过度依赖 flutter_screenutil。

  • 测试不同设备:

    即使使用了 flutter_screenutil,仍需在不同屏幕尺寸和分辨率的设备上测试应用,确保布局的正确性和美观性。

  • 性能优化:

    全局只初始化一次 ScreenUtil,避免重复计算。

  • 字体缩放策略:

    如果需要禁用字体缩放,可以设置 allowFontScaling: false。

  • 动态适配屏幕方向:

    在屏幕方向变化时,可能需要重新初始化 ScreenUtil。

使用建议

  • 全局初始化:推荐在 MaterialApp 外层包裹 ScreenUtilInit,并设置 minTextAdapt: true 以优化文本适配。

  • 测试与验证:在编写测试时,确保使用 tester.pumpAndSettle() 等待布局稳定。

  • 灵活使用:对于复杂布局或定制化设计,flutter_screenutil 可以确保元素大小更精确地反映设计意图。


常见问题及解决方法

  1. 图片模糊:使用 .r 单位保证宽高比。

  • 布局溢出:结合 SingleChildScrollView 或其他滚动组件。

  • 字体过大:设置 textScaleFactor: 1.0

  • 横竖屏切换异常:使用 OrientationBuilder 动态适配。

相关文章:

Flutter 学习之旅 之 flutter 使用 flutter_screenutil 简单进行屏幕适配

Flutter 学习之旅 之 flutter 使用 flutter_screenutil 简单进行屏幕适配 目录 Flutter 学习之旅 之 flutter 使用 flutter_screenutil 简单进行屏幕适配 一、简单介绍 二、简单介绍 flutter_screenutil 三、安装 carousel_slider 四、简单案例实现 五、关键代码 六、补…...

实验一:在Windows 10/11下配置和管理TCP/IP

目录 1.【实训目标】 2.【实训环境】 3.【实训内容】 4.【实训步骤】 1.【实训目标】 1.了解网络基本配置中包含的协议、服务、客户端。 2.了解Windows支持的网络协议及参数设置方法。 3.掌握TCP/IP协议的配置。 2.【实训环境】 硬件环境:每人一台计算机&a…...

基于hive的电信离线用户的行为分析系统

标题:基于hive的电信离线用户的行为分析系统 内容:1.摘要 随着电信行业的快速发展,用户行为数据呈现出海量、复杂的特点。为了深入了解用户行为模式,提升电信服务质量和精准营销能力,本研究旨在构建基于 Hive 的电信离线用户行为分析系统。通…...

Rust WebAssembly 入门教程

一、开发环境搭建 1. 基础工具安装 # 安装 Rust curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh# 安装 wasm-pack cargo install wasm-pack# 安装开发服务器 cargo install basic-http-server# 安装文件监听工具 cargo install cargo-watch2. VSCode 插件安装…...

部署RabbitMQ集群详细教程

部署RabbitMQ集群详细教程 下面是一份在 Ubuntu 环境下部署 RabbitMQ 集群的详细步骤说明,涉及主机名设置、Erlang & RabbitMQ 安装、管理插件启用、集群通信 Cookie 配置、节点加入集群、镜像队列策略设置以及集群验证等。为了演示方便,以下示例假…...

20250306JIRA添加企业微信邮箱通知

文章目录 一,参考链接如下二,补充内容1,登录企业邮箱2,设置密码3,设置收发信设置 一,参考链接如下 参考链接:https://blog.csdn.net/icett/article/details/142520823 二,补充内容…...

代码随想录算法训练营第五十七天 | 101. 孤岛的总面积 102. 沉没孤岛 103. 水流问题 104.建造最大岛屿

101. 孤岛的总面积 题目链接:KamaCoder 文档讲解:代码随想录 状态:AC Java代码: import java.util.*;class Main {static int count 0;static int res 0;static boolean island true;public static int[][] dir new int[][]{…...

llamafactory大模型微调教程(周易大模型案例)

1.环境说明 操作系统:ubuntu 20 基础模型:Qwen2.5-1.5B-Instruct 工具:llamafactory GPU:四张4090 2、环境部署 2.1 下载基础模型 # 1、下载 modelscope pip install modelscope#2、模型下载 cd /data/ cat >> download…...

excel 斜向拆分单元格

右键-合并单元格 右键-设置单元格格式-边框 在设置好分割线后,你可以开始输入文字。 需要注意的是,文字并不会自动分成上下两行。 为了达到你期望的效果,你可以通过 同过左对齐、上对齐 空格键或使用【AltEnter】组合键来调整单元格中内容的…...

【JAVA架构师成长之路】【JVM实战】第2集:生产环境内存飙高排查实战

课程标题:生产环境内存飙高排查实战——从堆转储到代码修复的15分钟指南 目标:掌握内存泄漏与OOM问题的系统性排查方法,快速定位代码或配置缺陷 0-1分钟:问题引入与核心现象 线上服务内存持续增长,触发频繁Full GC甚至OOM(OutOfMemoryError),导致服务崩溃。常见诱因:…...

MATLAB实现遗传算法优化风电_光伏_光热_储热优化

1. 问题定义 目标:最小化输出负荷与需求负荷的偏差平方和。决策变量:每个时间步长的风电、光伏、光热和储热输出功率。约束条件: 风电、光伏、光热的输出功率不得超过其最大容量。储热系统的输出功率(充放电)不得超过…...

JCRQ1河马算法+四模型对比!HO-CNN-GRU-Attention系列四模型多变量时序预测

JCRQ1河马算法四模型对比!HO-CNN-GRU-Attention系列四模型多变量时序预测 目录 JCRQ1河马算法四模型对比!HO-CNN-GRU-Attention系列四模型多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于HO-CNN-GRU-Attention、CNN-GRU-Attent…...

react中的fiber和初次渲染

源码中定义了不同类型节点的枚举值 组件类型 文本节点HTML标签节点函数组件类组件等等 src/react/packages/react-reconciler/src/ReactWorkTags.js export const FunctionComponent 0; export const ClassComponent 1; export const IndeterminateComponent 2; // Befo…...

LLM 大模型基础认知篇

目录 1、基本概述 2、大模型工作原理 3、关键知识点 (1)RAG 知识库 (2)蒸馏 (3)微调 (4)智能体 1、基本概述 大型语言模型(Large Language Model, LLM&#xff09…...

leetcode700-二叉搜索树中的搜索

leetcode 700 思路 我们需要先了解一下二叉搜索树的特性&#xff1a; 左子树的所有节点值 < 当前节点的值。右子树的所有节点值 > 当前节点的值。这个特性适用于树中的每个节点 那么根据这个特性&#xff0c;我们可以通过根节点的值和目标值的大小来判断后序的走向&…...

《MySQL三大核心日志解析:Undo Log/Redo Log/Bin Log对比与实践指南》

MySQL三大核心日志解析&#xff1a;Undo Log/Redo Log/Bin Log对比与实践指南 一、核心日志全景概览 在MySQL数据库体系中&#xff0c;Undo Log、Redo Log和Bin Log构成了事务处理和数据安全的三大基石。这三大日志各司其职&#xff0c;协同保障了数据库的ACID特性与高可用架…...

java中实体类常见的设计模式

实体类常见的设计模式 1. Set 链式编程 在实体类中实现链式调用通常是指让 setter 方法返回当前对象实例&#xff08;this&#xff09;&#xff0c;从而允许连续调用多个 setter 方法设置属性值。这种方式可以使代码更加简洁和直观。 例如实体类为&#xff1a; public clas…...

【够用就好006】如何从零开发游戏上架steam面向AI编程的godot独立游戏制作实录001流程

记录工作实践 这是全新的系列&#xff0c;一直有个游戏制作梦 感谢AI时代&#xff0c;让这一切变得可行 长欢迎共同见证&#xff0c;期更新&#xff0c;欢迎保持关注&#xff0c;待到游戏上架那一天&#xff0c;一起玩 面向AI编程的godot独立游戏制作流程实录001 本期是第…...

发行思考:全球热销榜的频繁变动

几点杂感&#xff1a; 1、单机游戏销量与在线人数的衰退是剧烈的&#xff0c;有明显的周期性&#xff0c;而在线游戏则稳定很多。 如去年的某明星游戏&#xff0c;最高200多万在线&#xff0c;如今在线人数是48名&#xff0c;3万多。 而近期热门的是MH&#xff0c;在线人数8…...

docker目录挂载与卷映射的区别

在 Docker 中&#xff0c;目录挂载&#xff08;Bind Mount&#xff09;和卷映射&#xff08;Volume Mount&#xff09;的命令语法差异主要体现在路径格式上&#xff0c;具体表现为是否以斜杠&#xff08;/&#xff09;开头。以下是两者的核心区别及使用场景的总结&#xff1a; …...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...