Flutter屏幕和字體適配(ScreenUtil)

一、簡介

flutter_screenutil?是一個 Flutter 插件,專門用于處理屏幕適配問題。它簡化了不同設備間尺寸差異的處理,確保你的應用在各種屏幕上都能保持良好的顯示效果。開發者可以通過簡單的調用來設置基于設計圖尺寸的控件寬高和字體大小。

項目地址:https://github.com/OpenFlutter/flutter_screenutil.git

二、屬性

屬性類型默認值描述
designSizeSizeSize(360,690)設計稿中設備的尺寸(建議dp)
builderWidget Function()Container()一般返回一個 MaterialApp 類型的 Function()
orientationOrientationportrait屏幕方向
splitScreenModebooltrue支持分屏尺寸

三、使用方法

(1)添加依賴

在你的項目?pubspec.yaml?文件中添加?flutter_screenutil?依賴:

dependencies:

????????flutter_screenutil: ^5.9.3

然后執行?pub get?來下載并安裝依賴。

(2)初始化

flutter_screenutil?提供了兩種方式進行初始化:ScreenUtilInit?方式和?ScreenUtil.init?方式。首先在使用的地方導入包:

import 'package:flutter_screenutil/flutter_screenutil.dart';

ScreenUtilInit 方式

使用 ScreenUtilInit 方式進行初始化,需要將項目的 MaterialApp 進行一層包裹,然后在?builder?中返回項目本身的 MaterialApp ,在 ScreenUtilInit 的?designSize?參數中傳入設計圖的尺寸,實現如下:

class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return ScreenUtilInit(designSize: Size(360, 690), // 傳入設計圖尺寸builder: () => MaterialApp(...),);}
}

ScreenUtil.init 方式:

直接使用?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?中進行初始化,會報如下錯誤?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 ) 獲取到屏幕寬高

(3)使用

初始化以后就可以使用?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 類型擴展了一系列屬性可以方便開發者調用,上面的 api 可以通過擴展屬性進行如下轉換:

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),),
);

四、字體適配

除了上面 4 種擴展屬性以外,還提供了?sm?以及?sw、?sh

  • sm?:取數值本身與?sp?的值最小的值,如?12.sm?則取?12?與?12.sp?的值進行比較,取最小的值。

  • sw?:screen width 的縮寫,即屏幕寬度,作用是按屏幕寬度比例返回值。如?0.2.sw?則返回屏幕寬度的 20%,1.sw?則是整個屏幕寬度

  • sh?:screen height 的縮寫,及屏幕高度,作用與sw類似,返回指定比例的屏幕高度值。如?1.sh?為整個屏幕高度

使用?sp?作為字體單位,默認是會隨著系統字體縮放進行變化,如果不想字體隨著系統縮放而變化,可設置?textScaleFactor?為?1.0?來實現。

// 示例代碼:
Column(crossAxisAlignment: CrossAxisAlignment.start,children: <Widget>[Text('我的文字大小在設計稿上是20dp,因為設置了`textScaleFactor`,所以不會隨著系統的文字縮放比例變化',style: TextStyle(color: Colors.black,fontSize: 20.sp,),textScaleFactor: 1.0,),Text('我的文字大小在設計稿上是20dp,會隨著系統的文字縮放比例變化',style: TextStyle(color: Colors.black,fontSize: 20.sp,),),],
)

設置字體不隨系統字體大小進行改變

項目中可對?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("text", textScaleFactor: 1.0)

五、API 參考

ScreenUtil().setWidth(540)  (sdk>=2.6 : 540.w)   // 根據屏幕寬度適配尺寸
ScreenUtil().setHeight(200) (sdk>=2.6 : 200.h)   // 根據屏幕高度適配尺寸(一般根據寬度適配即可)
ScreenUtil().radius(200)    (sdk>=2.6 : 200.r)   // 根據寬度或高度中的較小者進行調整
ScreenUtil().setSp(24)      (sdk>=2.6 : 24.sp)   // 適配字體ScreenUtil.pixelRatio       // 設備的像素密度
ScreenUtil.screenWidth   (sdk>=2.6 : 1.sw)   // 設備寬度
ScreenUtil.screenHeight  (sdk>=2.6 : 1.sh)   // 設備高度
ScreenUtil.bottomBarHeight  // 底部安全區距離,適用于全面屏下面有按鍵的
ScreenUtil.statusBarHeight  // 狀態欄高度 劉海屏會更高
ScreenUtil.textScaleFactor // 系統字體縮放比例ScreenUtil().scaleWidth  // 實際寬度設計稿寬度的比例
ScreenUtil().scaleHeight // 實際高度與設計稿高度度的比例ScreenUtil().orientation  // 屏幕方向0.5.sw  // 屏幕寬度的0.5倍
0.5.sh  // 屏幕高度的50%

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/93098.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/93098.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/93098.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mimiconda+vscode

安裝miniconda實現python包管理&#xff0c;并通過vscode進行編寫python代碼 miniconda簡單介紹 Miniconda 是 Anaconda 公司的一個輕量級 Python 發行版本&#xff0c;它包含了最基本的包管理器 conda 和 Python 環境&#xff0c;只帶最核心的組件&#xff0c;沒有額外的大量科…

Windows文件時間修改指南:從手動到自動化

修改文件的時間屬性可以滿足多種需求。比如&#xff0c;它可以幫助整理文件&#xff0c;使得文件按照特定的時間順序排列&#xff0c;有助于更好地管理資料。它的體積真小&#xff0c;才300多KB。能用來調整文件的創建時間、最后訪問和修改時間。文件時間屬性修改_NewFileTime.…

能刷java題的網站

以下是一些適合刷Java題的優質網站&#xff0c;涵蓋從基礎到進階、算法面試及實戰項目等多種需求&#xff1a; ?一、綜合編程練習平臺? ?LeetCode?&#xff08;leetcode.com&#xff09; ?特點?&#xff1a;全球最知名的算法題庫&#xff0c;含海量Java題目&#xff0c;分…

掘金數據富礦,永洪科技為山東黃金定制“數智掘金”實戰營

在黃金開采的轟鳴聲中&#xff0c;另一場靜水深流的“掘金行動”正悄然展開。山東黃金集團&#xff0c;這個行業的巨頭&#xff0c;在深挖地層寶藏的同時&#xff0c;也敏銳捕捉到數據洪流中蘊藏的價值富礦。然而&#xff0c;當海量業務數據匯聚&#xff0c;如何從中精準提煉決…

【論文閱讀】BEVFormer論文解析及Temporal Self-Attention、Spatial Cross-Attention注意力機制詳解及代碼示例

BEVFormer: Learning Bird’s-Eye-ViewRepresentation from Multi-Camera Images via Spatiotemporal Transformers|Temporal Self-Attention、Spatial Cross-Attention注意力機制詳解 BEVFormer&#xff08;Bird’s-Eye-View Former&#xff09;是一種先進的計算機視覺模型&am…

在 Ubuntu 中docker容器化操作來使用新建的 glibc-2.32

在 Ubuntu 中使用容器化操作來使用新建的 glibc-2.32,可以通過創建自定義 Docker 鏡像來實現。以下是完整的解決方案: 方案 1:創建包含 glibc-2.32 的 Docker 鏡像 1. 創建 Dockerfile dockerfile # 使用 Ubuntu 基礎鏡像 FROM ubuntu:20.04# 安裝編譯依賴 RUN apt-get …

GOOUUU ESP32-S3-CAM 果云科技開發板開發指南(二)(超詳細!)Vscode+espidf 攝像頭拍攝視頻實時傳輸到LCD,文末附源碼

書接上回&#xff0c;上一篇blog是使用esp32s3通過ov2640攝像頭拍攝到一幀照片&#xff0c;并把它保存到了SD卡中&#xff0c;這第二篇就通過LCD將拍攝到的圖片顯示到LCD上&#xff0c;本次分享硬件使用的 ESP32-S3-CAM 果云科技開發板&#xff0c;并且使用了配套的LCD擴展板&a…

攻防世界-ics-05(遠程文件執行)

一.審題大致瀏覽一下網頁&#xff0c;發現就這邊會有東西。看一下源碼會不會有東西或者稍微點擊一下這個頁面的內容看會不會出現東西。點擊了一下這個云平臺設備維護中心發現url變了&#xff0c;是get的方法傳page參數二.嘗試漏洞類型自己這邊試了sql注入發現不是&#xff0c;試…

Dell PowerEdge: Servers by generation (按代系劃分的服務器)

Dell PowerEdge: Servers by generation {按代系劃分的服務器}1. Table of 17th, 16th, 15th, and 14th Generation PowerEdge servers2. List of all PowerEdge server models including Type, CPU vendor, Generation, and Remote ManagementReferencesPowerEdge: Servers by…

Rust學習筆記(二)|變量、函數與控制流

本篇文章包含的內容1 變量與常量2 類型2.1 標量類型2.2 復合類型3 函數4 控制流4.1 分支4.2 循環1 變量與常量 在Rust中&#xff0c;使用let關鍵字聲明一個變量&#xff0c;變量默認是不可變的。如果要聲明可變變量&#xff0c;需要使用mut關鍵字將其聲明為可變變量。 let x …

【渲染流水線】[幾何階段]-[圖元裝配]以UnityURP為例

【從UnityURP開始探索游戲渲染】專欄-直達 前情提要 【渲染流水線】主線索引-從數據到圖像以UnityURP為例-CSDN博客 圖元裝配負責將離散頂點組裝成完整幾何圖元&#xff08;如點、線、三角形、三角形條帶&#xff09; &#xff08;對渲染的探索是個持續不斷完善的過程&#x…

jvm有哪些垃圾回收器,實際中如何選擇?

7.G1收集器一款面向服務端應用的垃圾收集器。 特點如下&#xff1a; 并行與并發&#xff1a;G1能充分利用多CPU、多核環境下的硬 件優勢&#xff0c;使用多個CPU來縮短Stop-The-World停頓時間。部分收集器原本需要停頓Java線程來執行GC動作&#xff0c;G1收 集器仍然可以通過并…

多語言與隱形攻擊:LLM安全防線為何被頻頻突破?

你是否曾以為&#xff0c;只要加裝了“防火墻”&#xff0c;大型語言模型&#xff08;LLM&#xff09;就能高枕無憂&#xff1f;Trendoyl 的實際測試卻讓我大吃一驚&#xff1a;即便部署了 Meta 的 Llama Guard&#xff0c;攻擊者還是能輕松用多語種、字符混淆&#xff0c;甚至…

分布式光伏氣象站:為光伏電站的 “氣象感知眼”

分布式光伏氣象站&#xff1a;為光伏電站的 “氣象感知眼”柏峰 【BF-GFQX】在全球能源轉型的浪潮中&#xff0c;分布式光伏發電憑借其就近消納、清潔高效的優勢&#xff0c;成為能源結構優化的重要力量。而分布式光伏氣象站&#xff0c;作為光伏電站的 “智慧感知眼”&#xf…

TCP與UDP:如何選擇最佳傳輸協議

應用場景選擇如果需要可靠傳輸&#xff0c;首選 TCP如果需要傳輸的數據包很大&#xff0c;也首選 TCP絕大部分的場景&#xff0c;都可以優先考慮 TCPUDP 相比于 TCP&#xff0c;最大的優點在于傳輸效率有些情況&#xff0c;既需要可靠性又需要性能&#xff0c;這個時候時候就需…

《Leetcode》-面試題-hot100-棧

題目列表 20. 有效的括號 簡單難度 leetcode鏈接 155. 最小棧 中等難度 leetcode鏈接 394. 字符串解碼 中等難度 leetcode鏈接 739. 每日溫度 中等難度 leetcode鏈接 84. 柱狀圖中最大的矩形 困難難度 leetcode鏈接 題目 &#xff08;1&#xff09;有效的括號 題目 給…

GPT-5、Claude-4 同臺亮相!OneEval發布全新“大模型+知識庫”評測白皮書!

OneEval官網地址&#xff1a;http://OneEval.OpenKG.cnOneEval文章鏈接&#xff1a;https://arxiv.org/abs/2506.12577要點導讀 今年4月&#xff0c;OpenKG發布“大模型知識庫”融合能力評估榜單OneEval v1.0。近期&#xff0c;OpenKG在此基礎上&#xff0c;組織撰寫了OneEv…

【最新版】沃德云商協系統全開源+uniapp小程序

一.介紹沃德云商協是一款基于FastAdmin&#xff08;thinkphp&#xff09;Uniapp開發的“多組織”的云服務平臺&#xff0c;打造總商會、總協會、總校友會、工商聯等多組織無障礙溝通合作平臺&#xff0c;讓各大分會、各大分校友會、分組織實現輕松管理&#xff0c;線上宣傳展示…

Wireshark專家模式定位網絡故障:14種TCP異常深度解剖

TCP連接如同精密運轉的傳送帶&#xff0c;每一個異常數據包都是故障的早期信號。作為網絡工程師的“外科手術刀”&#xff0c;Wireshark在TCP故障診斷領域的價值無可替代。本文將通過14個真實故障場景&#xff0c;揭示如何利用Wireshark專家系統&#xff08;Expert System&…

Python Day28 HTML 與 CSS 核心知識點 及例題分析

一、HTML 布局標簽&#xff08;含 H5 語義化標簽&#xff09;傳統布局多使用div標簽&#xff0c;H5 新增語義化標簽增強可讀性&#xff1a;核心知識點header&#xff1a;替代div#header&#xff0c;用于頁面頭部&#xff08;如標題、導航&#xff09;。footer&#xff1a;替代d…