【Flutter】線性布局彈性布局層疊布局

🔥 本文由 程序喵正在路上 原創,CSDN首發!
💖 系列專欄:Flutter學習
🌠 首發時間:2024年5月25日
🦋 歡迎關注🖱點贊👍收藏🌟留言🐾

目錄

  • 線性布局
    • Row水平布局組件
    • Column垂直布局組件
    • double.infinity和double.maxFinite
  • 彈性布局
    • 水平彈性布局
    • 垂直彈性布局
    • 使用Row或Column結合Expanded實現案例
  • 層疊布局
    • Stack組件
    • Align組件
    • Positioned組件
    • MediaQuery獲取屏幕寬度和高度
    • Stack結合Positioned固定導航案例

線性布局

Row水平布局組件

在這里插入圖片描述

實現如下效果:

在這里插入圖片描述

因為圖中有3個差不多的盒子,都是一個盒子里面放一個圖標,所以我們將其寫成了一個類 IconContainer,以減少代碼量

class MyHomePage extends StatelessWidget {const MyHomePage({super.key});Widget build(BuildContext context) {return Container(height: double.infinity, //無窮大width: double.infinity,color: Colors.white,child: Row(crossAxisAlignment: CrossAxisAlignment.center,mainAxisAlignment: MainAxisAlignment.spaceEvenly,children: [IconContainer(Icons.home, color: Colors.red),IconContainer(Icons.search),IconContainer(Icons.send, color: Colors.orange),],),);}
}class IconContainer extends StatelessWidget {Color color; //盒子顏色double iconSize; //圖標大小IconData icon; //圖標//盒子默認為藍色,圖標大小默認32IconContainer(this.icon,{super.key, this.color = Colors.blue, this.iconSize = 32});Widget build(BuildContext context) {return Container(height: 100,width: 100,color: color,//圖標顏色默認為白色child: Center(child: Icon(icon, size: iconSize, color: Colors.white)),);}
}

Column垂直布局組件

在這里插入圖片描述

實現如下效果:

在這里插入圖片描述

將前面代碼中的 Row 改成 Column 即可:

在這里插入圖片描述

double.infinity和double.maxFinite

double.infinitydouble.maxFinite 可以讓當前元素的 width 或者 height 達到父元素的尺寸

如下可以讓Container鋪滿整個屏幕

class MyHomePage extends StatelessWidget {const MyHomePage({super.key});Widget build(BuildContext context) {return Container(height: double.infinity,width: double.infinity,color: Colors.white,child: Column(crossAxisAlignment: CrossAxisAlignment.center,mainAxisAlignment: MainAxisAlignment.spaceEvenly,children: [IconContainer(Icons.home, color: Colors.red),IconContainer(Icons.search),IconContainer(Icons.send, color: Colors.orange),],),);}
}

如下可以讓Container的寬度和高度等于父元素的寬度高度

class MyHomePage extends StatelessWidget {const MyHomePage({super.key});Widget build(BuildContext context) {return Container(height: 500,width: 300,color: Colors.red,child: Container(height: double.maxFinite,width: double.infinity,color: Colors.yellow,child: Column(crossAxisAlignment: CrossAxisAlignment.center,mainAxisAlignment: MainAxisAlignment.spaceEvenly,children: [IconContainer(Icons.home, color: Colors.red),IconContainer(Icons.search),IconContainer(Icons.send, color: Colors.orange),],),),);}
}

在這里插入圖片描述

彈性布局

水平彈性布局

Flex 組件可以沿著水平或垂直方向排列子組件,如果你知道主軸方向,使用 RowColumn 會方便一些,因為 RowColumn 都繼承自 Flex ,參數基本相同,所以能使用 Flex 的地方基本上都可以使用 RowColumnFlex 本身功能是很強大的,它也可以和 Expanded 組件配合實現彈性布局 。

實現如下效果:

在這里插入圖片描述

class MyHomePage extends StatelessWidget {const MyHomePage({super.key});Widget build(BuildContext context) {return Flex(direction: Axis.horizontal, //水平方向children: [//flex: 占用多少位置Expanded(flex: 2, child: IconContainer(Icons.home, color: Colors.red)),Expanded(flex: 1, child: IconContainer(Icons.search))],);}
}class IconContainer extends StatelessWidget {Color color; //盒子顏色double iconSize; //圖標大小IconData icon; //圖標//盒子默認為藍色,圖標大小默認32IconContainer(this.icon,{super.key, this.color = Colors.blue, this.iconSize = 32});Widget build(BuildContext context) {return Container(height: 100,width: 100,color: color,//圖標顏色默認為白色child: Center(child: Icon(icon, size: iconSize, color: Colors.white)),);}
}

因為 Row 繼承自 Flex ,所以我們將代碼中的 Flex 換成 Row,同樣是可以的,而且我們還不用設置方向。當我們能確定主軸的方向時,推薦使用 RowColumn

class MyHomePage extends StatelessWidget {const MyHomePage({super.key});Widget build(BuildContext context) {return Row(children: [//flex: 占用多少位置Expanded(flex: 2, child: IconContainer(Icons.home, color: Colors.red)),Expanded(flex: 1, child: IconContainer(Icons.search))],);}
}

垂直彈性布局

class MyHomePage extends StatelessWidget {const MyHomePage({super.key});Widget build(BuildContext context) {return Column(children: [//flex: 占用多少位置Expanded(flex: 2, child: IconContainer(Icons.home, color: Colors.red)),Expanded(flex: 1, child: IconContainer(Icons.search))],);}
}

在這里插入圖片描述

使用Row或Column結合Expanded實現案例

實現如下效果:

在這里插入圖片描述

class MyHomePage extends StatelessWidget {const MyHomePage({super.key});Widget build(BuildContext context) {return ListView(children: [Container(width: double.infinity,height: 200,color: Colors.blue,child: Image.network("https://xixi-web-tlias.oss-cn-guangzhou.aliyuncs.com/1.jpg",fit: BoxFit.cover)),const SizedBox(height: 10),Row(children: [Expanded(flex: 2,child: SizedBox(height: 200,child: Image.network("https://xixi-web-tlias.oss-cn-guangzhou.aliyuncs.com/2.jpg",fit: BoxFit.cover),)),const SizedBox(width: 10),Expanded(flex: 1,child: SizedBox(height: 200,child: Column(children: [Expanded(flex: 1,child: SizedBox(width: double.infinity,child: Image.network("https://xixi-web-tlias.oss-cn-guangzhou.aliyuncs.com/3.jpg",fit: BoxFit.cover),),),const SizedBox(height: 10),Expanded(flex: 1,child: SizedBox(width: double.infinity,child: Image.network("https://xixi-web-tlias.oss-cn-guangzhou.aliyuncs.com/4.jpg",fit: BoxFit.cover),),),],),),),],),const SizedBox(height: 10),Row(children: [Expanded(flex: 1,child: SizedBox(height: 200,child: Column(children: [Expanded(flex: 1,child: SizedBox(width: double.infinity,child: Image.network("https://xixi-web-tlias.oss-cn-guangzhou.aliyuncs.com/5.jpg",fit: BoxFit.cover),),),const SizedBox(height: 10),Expanded(flex: 1,child: SizedBox(width: double.infinity,child: Image.network("https://xixi-web-tlias.oss-cn-guangzhou.aliyuncs.com/6.jpg",fit: BoxFit.cover),),),]),),),const SizedBox(width: 10),Expanded(flex: 1,child: SizedBox(height: 200,child: Column(children: [Expanded(flex: 1,child: SizedBox(width: double.infinity,child: Image.network("https://xixi-web-tlias.oss-cn-guangzhou.aliyuncs.com/7.jpg",fit: BoxFit.cover),),),const SizedBox(height: 10),Expanded(flex: 1,child: SizedBox(width: double.infinity,child: Image.network("https://xixi-web-tlias.oss-cn-guangzhou.aliyuncs.com/8.jpg",fit: BoxFit.cover),),),]),),),],),],);}
}

層疊布局

Stack組件

Stack 表示堆的意思,我們可以用 Stack 或者 Stack 結合 Align 或者 Stack 結合 Positiond 來實現頁面的定位布局

屬性說明
alignment配置所有子元素的顯示位置
children子組件
class MyApp extends StatelessWidget {const MyApp({super.key});Widget build(BuildContext context) {return Center(child: Stack(alignment: Alignment.topLeft,children: [Container(height: 400,width: 300,color: Colors.blue,),const Text("我是一個文本",style: TextStyle(fontSize: 40, color: Colors.white),)],),);}
}

在這里插入圖片描述

Align組件

Align 組件可以調整子組件的位置 , Stack 組件中結合 Align 組件也可以控制每個子元素的顯示位置

屬性說明
alignment配置所有子元素的顯示位置
child子組件

Align結合Container的使用

我們先來看一個簡單的例子:

FlutterLogoFlutter SDK 提供的一個組件,內容就是 Flutterlog

class MyApp extends StatelessWidget {const MyApp({super.key});Widget build(BuildContext context) {return Container(height: 300,width: 300,color: Colors.blue.shade50,child: const Align(alignment: Alignment.topRight,child: FlutterLogo(size: 100,),),);}
}

在這里插入圖片描述

Align結合Container的使用

class MyApp extends StatelessWidget {const MyApp({super.key});Widget build(BuildContext context) {return Container(height: 300,width: 300,color: Colors.blue.shade50,child: const Align(alignment: Alignment(2, 0),child: FlutterLogo(size: 100,),),);}
}

在這里插入圖片描述

Alignment Widget 會以矩形的中心點作為坐標原點,即 Alignment(0, 0) 。 x 、y 的值從 -1 到 1 分別代表矩形左邊到右邊的距離和頂部到底邊的距離,因此 2 個水平(或垂直)單位則等于矩形的寬(或高),如 Alignment(-1, -1) 代表矩形的左側頂點,而 Alignment(1, 1) 代表右側底
部終點,而 Alignment(1, -1) 則正是右側頂點,即 Alignment.topRight。為了使用方便,矩形的原點、四個頂點,以及四條邊的終點在 Alignment 類中都已經定義為了靜態常量。

Alignment 可以通過其坐標轉換公式將其坐標轉為子元素的具體偏移坐標:

(Alignment.x*childWidth/2+childWidth/2, Alignment.y*childHeight/2+childHeight/2)

其中 childWidth 為子元素的寬度, childHeight 為子元素高度。

現在我們再看看上面的示例,我們將 Alignment(2, 0) 帶入上面公式, ( 2 × 300 / 2 + 300 / 2 , 0 × 300 / 2 + 300 / 2 ) (2 \times 300 / 2 + 300 / 2, 0 \times 300 / 2 + 300 / 2) (2×300/2+300/2,0×300/2+300/2) ,可得 FlutterLogo 的實際偏移坐標正是 (450,150)

Align結合Stack的使用

class MyApp extends StatelessWidget {const MyApp({super.key});Widget build(BuildContext context) {return Center(child: Container(height: 400,width: 300,color: Colors.blue,child: const Stack(children: [Align(alignment: Alignment(1, -0.2),child: Icon(Icons.home, size: 40, color: Colors.white),),Align(alignment: Alignment.center,child: Icon(Icons.search, size: 30, color: Colors.white),),Align(alignment: Alignment.bottomRight,child: Icon(Icons.settings_applications,size: 30, color: Colors.white),),],),),);}
}

在這里插入圖片描述

Positioned組件

Stack 組件中結合 Positioned 組件也可以控制每個子元素的顯示位置

屬性說明
top子元素距離頂部的距離
bottom子元素距離底部的距離
left子元素距離左側距離
right子元素距離右側距離
child子組件
width組件的高度(注意:寬度和高度必須是固定值,不能使用 double.infinity
height子組件的高度
class MyApp extends StatelessWidget {const MyApp({super.key});Widget build(BuildContext context) {return Center(child: Container(height: 400,width: 300,color: Colors.blue,child: const Stack(children: [Positioned(left: 10,child: Icon(Icons.home, size: 40, color: Colors.white),),Positioned(bottom: 0,left: 100,child: Icon(Icons.search, size: 30, color: Colors.white),),Positioned(right: 0,child: Icon(Icons.settings_applications,size: 30, color: Colors.white),),],),),);}
}

在這里插入圖片描述

MediaQuery獲取屏幕寬度和高度

前面說到 Positioned 組件的高度和寬度不能使用 double.infinity,在這種情況下,如果我們可以在組件的 build 方法中可以通過 MediaQuery.of(context).size; 來設置

final size = MediaQuery.of(context).size;
final width = size.width;
final height = size.height;

Stack結合Positioned固定導航案例

實現如下效果:

在這里插入圖片描述

class MyApp extends StatelessWidget {const MyApp({super.key});Widget build(BuildContext context) {final size = MediaQuery.of(context).size;return Stack(children: [ListView(padding: const EdgeInsets.only(top: 45),children: const [ListTile(title: Text("我是標題1"),),ListTile(title: Text("我是標題2"),),ListTile(title: Text("我是標題3"),),ListTile(title: Text("我是標題4"),),ListTile(title: Text("我是標題5"),),ListTile(title: Text("我是標題6"),),ListTile(title: Text("我是標題7"),),ListTile(title: Text("我是標題8"),),ListTile(title: Text("我是標題9"),),ListTile(title: Text("我是標題10"),),ListTile(title: Text("我是標題11"),),ListTile(title: Text("我是標題12"),),ListTile(title: Text("我是標題13"),),ListTile(title: Text("我是標題14"),),ListTile(title: Text("我是標題15"),),],),Positioned(top: 0,left: 0,height: 40,width: size.width,child: Container(alignment: Alignment.center,color: Colors.blue,child: const Text("二級導航",style: TextStyle(color: Colors.white),),),),]);}
}

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

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

相關文章

4、PHP的xml注入漏洞(xxe)

青少年ctf&#xff1a;PHP的XXE 1、打開網頁是一個PHP版本頁面 2、CTRLf搜索xml&#xff0c;發現2.8.0版本&#xff0c;含有xml漏洞 3、bp抓包 4、使用代碼出發bug GET /simplexml_load_string.php HTTP/1.1 補充&#xff1a; <?xml version"1.0" encoding&quo…

內網穿透--Nps-自定義-上線

免責聲明:本文僅做技術交流與學習... 目錄 Nps項目: 一圖通解: 1-下載nps/npc 2-服務端啟動 訪問web網頁: 添加客戶端&#xff0c;生成密匙. 3-kali客戶端連接服務端 4-添加協議隧道. 5-kali生成后門&#xff1a; 6-kali創建監聽: Nps項目: https://github.com/ehang…

藍橋杯Web開發【模擬題一】15屆

1.動態的Tab欄 日常在使用移動端 APP 或訪問 PC 端網站的時候&#xff0c;常常發現在一些有工具欄或者 Tab 欄的頁面會有頂欄固定的效果。簡單來說&#xff0c;在頁面未開始滾動時頂欄處在其原有的位置上&#xff0c;當頁面向下滾動一定區域后&#xff0c;頂欄會跟隨滾動固定在…

HTTPS證書——網站如何實現HTTPS訪問?

實現網站HTTPS訪問可以簡化為以下四個基本步驟&#xff0c;確保過程既通俗易懂又條理清晰&#xff1a; 1. 申請SSL證書 - 目的&#xff1a;SSL證書是實現HTTPS加密的關鍵&#xff0c;它驗證了網站的身份&#xff0c;并提供了加密數據所需的密鑰。 - 操作&#xff1a;首先&…

超鏈接的魅力:HTML中的 `<a>` 標簽全方位探索!

&#x1f310;超鏈接的魅力&#xff1a;HTML中的 標簽全方位探索&#xff01; &#x1f3de;?基礎營地&#xff1a;認識 <a> 標簽&#x1f6e0;?基本語法&#x1f4da;屬性擴展 &#x1f680;實戰演練&#xff1a;超鏈接的多樣玩法&#x1f308;內鏈與外鏈&#x1f4c…

TypeScript(持續更新中...)

1.TypeScript是什么&#xff1f; TypeScript是javaScript的超集。 2.使用TypeScript 1&#xff09;全局安裝nodejs 2&#xff09;安裝TypeScript編譯器 npm i -g typescript 3.編譯ts文件 //注意&#xff1a;需要在ts文件同級目錄執行此命令&#xff0c;否則會報找不到…

遙感、GIS和GPS技術在水文、氣象、災害、生態、環境及衛生等領域中的應用

【科研必備】遙感、GIS和GPS技術在水文、氣象、災害、生態、環境及衛生等領域中的應用 (qq.com)https://mp.weixin.qq.com/s?__bizMzg2NDYxNjMyNA&mid2247565057&idx4&snecec1f5396132122acf02b188f7b74ac&chksmce6515eaf9129cfc9a6c4a16413c0d746003cc192132…

PostgreSQL 教程

## PostgreSQL 教程 ### 1. PostgreSQL 概述 PostgreSQL 是一個開源的對象關系型數據庫管理系統&#xff08;ORDBMS&#xff09;&#xff0c;以其高擴展性和合規性聞名&#xff0c;支持 SQL 和 JSON 查詢。 ### 2. 安裝與配置 - **下載與安裝**&#xff1a;從 PostgreSQL 官方…

C++ Primer Plus第十七章復習題

1、iostream文件在CI/O中扮演這種角色&#xff1f; 答&#xff1a; iostream文件定義了用于管理輸入和輸出的類、常量和操縱符,這些對象管理用于處理I/O的流和緩沖區。該文件還創建了一些標準對象(cin、cout、cerr和 clog以及對應的寬字符對象)&#xff0c;用于處理與每個程序…

【論文筆記】| 微調LLM晶體生成

【論文筆記】| 微調LLM晶體生成 Fine-Tuned Language Models Generate Stable Inorganic Materials as Text NYU, ICLR 2024 Theme&#xff1a;Material Generation Main work&#xff1a; 微調大型語言模型以生成穩定的材料 可靠性&#xff1a;在樣本結構中&#xff0c;90% …

如何修改WordPress網站的域名

我的網站用的是Hostease的虛擬主機&#xff0c;但是域名是之前在其他平臺買的&#xff0c;而且已經快到期了&#xff0c;因為主機和域名在不同的平臺上&#xff0c;管理不太方便&#xff0c;所以我又在Hostease重新注冊了一個域名&#xff0c;然后把網站換成了新的域名&#xf…

(Java企業 / 公司項目)配置Linux網絡-導入虛擬機

公司給了我一個IP地址 &#xff0c;提供了一個虛擬機或者自己搭建虛擬機&#xff0c;還有提供登錄的賬號密碼 可以查看我之前的文章 VMware Workstation Pro 17虛擬機超級詳細搭建&#xff08;含redis&#xff0c;nacos&#xff0c;docker, rabbitmq&#xff0c;sentinel&…

Oracle數據庫中的PCTUSED解析

PCTUSED是Oracle數據庫中與數據塊空間管理相關的另一個參數&#xff0c;它與PCTFREE共同作用于表空間的段管理。PCTUSED定義了一個數據塊中空閑空間的比例&#xff0c;低于這個比例時&#xff0c;塊被視為“足夠空閑”&#xff0c;可以再次用于插入新的數據行。其主要作用是提高…

3D透視圖模型轉模型變形?---模大獅模型網

3D建模是數字藝術和設計領域中的重要技術&#xff0c;它可以為我們帶來豐富多彩的視覺體驗和創意表達。在本文中&#xff0c;我們將探討一個引人注目的話題&#xff1a;3D透視圖中模型轉換是否會導致變形?通過深入探討這個問題&#xff0c;我們希望能夠幫助您更好地理解在3D建…

GitHub的原理及應用詳解(四)

本系列文章簡介&#xff1a; GitHub是一個基于Git版本控制系統的代碼托管平臺&#xff0c;為開發者提供了一個方便的協作和版本管理的工具。它廣泛應用于軟件開發項目中&#xff0c;包括但不限于代碼托管、協作開發、版本控制、錯誤追蹤、持續集成等方面。 GitHub的原理可以簡單…

【C++風云錄】數字邏輯設計優化:電子設計自動化與集成電路

集成電路設計&#xff1a;打開知識的大門 前言 本文將詳細介紹關于數字芯片設計&#xff0c;電子設計格式解析&#xff0c;集成電路設計工具&#xff0c;硬件描述語言分析&#xff0c;電路驗證以及電路優化六個主題的深入研究與實踐。每一部分都包含了主題的概述&#xff0c;…

如何通過軟件SPI讀寫W25Q64

STM32F1之SPI通信軟件SPI代碼編寫-CSDN博客 目錄 1. W25Qxx系列簡介 2. W25Q64硬件電路 3. W25Q64框圖 4. Flash操作注意事項 5. 代碼編寫 5.1 初始化 5.2 W25Q64讀取ID號 5.3 W25Q64寫使能 5.4 W25Q64等待忙 5.5 W25Q64頁編程 5.6 W25Q64扇區擦除&#x…

WebRTC | 網絡傳輸協議 RTP 和 RTCP

WebRTC | 網絡傳輸協議 RTP 和 RTCP WebRTC | 網絡傳輸協議 RTP 和 RTCP如何選擇 TCP 與 UDPRTP概述工作機制報文結構RTP 的使用RTP 拓展頭RTP 中的填充數據翻譯器和混合器同步控制報文大小wireshark 抓取 RTP 報文 RTCP概述工作機制分組類型報文結構WebRTC 的反饋報文RTPFBPSF…

深入淺出遞歸算法

文章目錄 遞歸思想遞歸的題目1.漢諾塔問題問題分析代碼展示 2.合并兩個有序鏈表問題分析代碼展示 3.反轉鏈表問題分析代碼展示 4.兩兩交換 鏈表中的節點問題分析代碼展示 總結 遞歸思想 遞歸就是將一個很大的問題拆分成子問題&#xff0c;然后再將子問題繼續拆分&#xff0c;拆…

經典正則表達式實例

1、由26個字母組成的字符串 ^[A-Za-z]$2、 由26個字母和數字組成的字符串 ^[A-Za-z0-9]$3、整數形式的字符串 ^-?\d$4、正整數形式的字符串 ^[0-9]*[1-9][0-9]*$5、中國境內郵政編碼,6位 [1-9\d{5}6、匹配中文字符 [\u4e00-\u9fa5]7、國內電話號碼,010-6872**** \d{3}-…