網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
flutter中的布局
flutter布局機(jī)制的核心是組件。在flutter中,幾乎所有的東西都是組件,布局模型也不例外。圖片,Icon, 文本等等,我們?cè)趂lutter客戶端中看到的所有內(nèi)容都是組件。我們看不到的東西,比如:rows,columns,等等等等也都是組件。
我們將簡(jiǎn)單的組件組合在一起,構(gòu)成復(fù)雜的組件。比如我們經(jīng)常寫的導(dǎo)航欄:
他的布局可能是這樣的:
用樹形圖來(lái)表示是這樣的:
圖中的大部分內(nèi)容應(yīng)該跟我們想象中的差不了多少,可能會(huì)有些人對(duì)Containter
有些疑惑,Containter
其實(shí)是一個(gè)容器組件,我們可以用它來(lái)控制一些子組件的展示,比如我們想要添加padding,margin,border,background- color等屬性時(shí),我們就可以用它來(lái)控制,用法和div基本一樣。
(使用)放置一個(gè)組件
在flutter中如何使用組件呢?很簡(jiǎn)單。
比如,我想要一個(gè)居中的效果,那么我就使用Center
組件;想要水平布局,我就使用row
組件,想要垂直效果,就使用column
組件。想要一個(gè)列表,那就listview
組件,如此而已。
比如:創(chuàng)建一個(gè)文本。
Text('Hello World'),
比如:創(chuàng)建一個(gè)圖片。
Image.asset( 'images/lake.jpg', fit: BoxFit.cover, )
比如:創(chuàng)建一個(gè)圖標(biāo)。
Icon( Icons.star, color: Colors.red[500], )
app 本身就是個(gè)組件
試想一下我們平時(shí)搭建的vue或者react項(xiàng)目,其實(shí)他們本身就都是一個(gè)組件而已。
從bootstrap開始,或者講的更透徹一些,從我們執(zhí)行:
let app = new vue() // let app = createapp() app.mount('#app', true)
mount執(zhí)行完成后,全局項(xiàng)目的大組件就已經(jīng)跑起來(lái)了。
然后我們又在各個(gè)模塊中創(chuàng)建了頁(yè)面,拆分了模塊...
flutter也一樣,如果你仔細(xì)對(duì)比一下vue,或者react項(xiàng)目的入口文件和flutter項(xiàng)目入口文件的區(qū)別:
import 'package:flutter/material.dart'; import 'mine.dart'; import './yours.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: const MyHomePage(title: 'Flutter Demo Home Page'), routes: {'/mine': (context) => Mine(), '/yours': (context) => Yours()}, ); } }
發(fā)現(xiàn)了嗎,其實(shí)是一樣的套路,實(shí)例化了一個(gè)全局的app
,一個(gè)全局的組件。
Material apps 和 Non-Material apps
對(duì)于Material app,我們可以使用app本身自帶的一些組件,比如:Scaffold提供了默認(rèn)的頂部導(dǎo)航,底部導(dǎo)航,抽屜等組件,開發(fā)起來(lái)非常方便。比如:
class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter layout demo', home: Scaffold( appBar: AppBar( title: const Text('Flutter layout demo'), ), body: const Center( child: Text('Hello World'), ), ), ); } }
而Non-Material apps 則沒有提供這些組件,我們想要實(shí)現(xiàn)那些東西,都需要我們自己動(dòng)手去封裝。比如:
class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return Container( decoration: const BoxDecoration(color: Colors.white), child: const Center( child: Text( 'Hello World', textDirection: TextDirection.ltr, style: TextStyle( fontSize: 32, color: Colors.black87, ), ), ), ); } }
自適應(yīng)和響應(yīng)式
flutter的一個(gè)主要目的是為我們提供一個(gè)組件庫(kù),讓我們可以很快的進(jìn)行開發(fā),并且開發(fā)出來(lái)的應(yīng)用可以運(yùn)行在多個(gè)平臺(tái)上。這意味著我們的應(yīng)用程序在不同尺寸的屏幕上,手機(jī),手表,或者顯示器都有可能。
所以,我們的應(yīng)用應(yīng)該是響應(yīng)式的,或者叫自適應(yīng)。
自適應(yīng)和響應(yīng)式聽起來(lái)很相似,但是它們是一回事兒?jiǎn)幔恳苍S未必如此。
自適應(yīng)和響應(yīng)式其實(shí)是兩個(gè)維度的東西。我們可以開發(fā)一個(gè)沒有響應(yīng)式的自適應(yīng)程序,也可以開發(fā)一個(gè)沒有自適應(yīng)的響應(yīng)式程序。也許有些人會(huì)很疑惑,沒有響應(yīng)式的自適應(yīng)程序,比如我要兼容三個(gè)設(shè)備,那么我寫三套代碼去兼容它們,這就是非響應(yīng)式的自適應(yīng)程序。
當(dāng)然,我們也可以開發(fā)出既是自適應(yīng),又是響應(yīng)式的程序。
什么是響應(yīng)式?通常情況下,自適應(yīng)的應(yīng)用程序的布局可以根據(jù)屏幕大小進(jìn)行調(diào)整。比如用戶調(diào)整了窗口大小,旋轉(zhuǎn)了設(shè)備方向,那么就會(huì)重新進(jìn)行布局。這一點(diǎn)在應(yīng)用運(yùn)行在不同的設(shè)備上時(shí),顯得尤為重要。
什么是自適應(yīng)?應(yīng)用程序在不同的設(shè)備上運(yùn)行,我們需要處理鼠標(biāo),鍵盤輸入以及觸摸輸入等功能,需要我們對(duì)程序的視覺效果,組件的工作方式,API在各個(gè)平臺(tái)上的兼容性有一定的了解。
如此看來(lái),響應(yīng)式似乎側(cè)重于布局,而自適應(yīng)則既要考慮布局,又要兼顧功能。
flutter實(shí)現(xiàn)響應(yīng)式的方法
使用flutter我們可以非常方便的開發(fā)出響應(yīng)式或自適應(yīng)的app。有兩種可行的方案:
一種是利用LayoutBuilder
這個(gè)類。通過它的builder
屬性,我們可以獲取到BoxConstraints
對(duì)象,檢查容器的約束性來(lái)決定展示什么。比如:如果我們的maxWidth
大于我們的屏幕寬度的臨界點(diǎn),就返回一個(gè)包含列表的Scaffold
對(duì)象。如果小于屏幕的臨界點(diǎn),就基別的因素進(jìn)行布局。
另外一種是使用媒體查詢技術(shù)MediaQuery.of()
。它可以獲取我們當(dāng)前應(yīng)用的size
,orientation
等信息,我們可以根據(jù)獲取的信息作出一些有利于我們應(yīng)用展示效果的決策。
其他的可以用來(lái)創(chuàng)建響應(yīng)式ui的組件有,比如:
- AspectRatio
- CustomSingleChildLayout
- CustomMultiChildLayout
- FittedBox
- FractionallySizedBox
- LayoutBuilder
- MediaQuery
- MediaQueryData
- OrientationBuilder
這些都可以用來(lái)開發(fā)響應(yīng)式的app應(yīng)用。
小結(jié)
原文鏈接:https://juejin.cn/post/7174078317539098654
相關(guān)推薦
- 2022-04-12 pandas讀取csv格式數(shù)據(jù)時(shí)header參數(shù)設(shè)置方法_python
- 2022-08-05 基于redis+lua進(jìn)行限流
- 2022-08-11 如何利用python繪制等高線圖_python
- 2023-12-12 Mybatis中一些優(yōu)化
- 2022-07-21 安裝MiniConda和Pytorch以及Cuda的筆記及心得
- 2022-09-17 C/C++?控制臺(tái)等待指令解析_C 語(yǔ)言
- 2022-08-28 隔代獲取dom,多個(gè)commit合并成一個(gè),計(jì)算屬性完整寫法
- 2024-07-15 SpringBoot使用Apache Poi導(dǎo)出word文檔
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支