欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

flutter布局詳解,flutter 布局詳解,必知必會(huì)

Flutter 基礎(chǔ)布局Widgets之ConstrainedBox詳解

ConstrainedBox即創(chuàng)建一個(gè)Widget,該Widget對(duì)其子child施加附加約束。之前在constrain也有簡單使用,即該組件一般集成在constrain中使用。

成都創(chuàng)新互聯(lián)堅(jiān)信:善待客戶,將會(huì)成為終身客戶。我們能堅(jiān)持多年,是因?yàn)槲覀円恢笨芍档眯刨?。我們從不忽悠初訪客戶,我們用心做好本職工作,不忘初心,方得始終。10年網(wǎng)站建設(shè)經(jīng)驗(yàn)成都創(chuàng)新互聯(lián)是成都老牌網(wǎng)站營銷服務(wù)商,為您提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)、網(wǎng)站設(shè)計(jì)、H5開發(fā)、網(wǎng)站制作、高端網(wǎng)站設(shè)計(jì)、小程序設(shè)計(jì)服務(wù),給眾多知名企業(yè)提供過好品質(zhì)的建站服務(wù)。

Flutter入門這一篇效率文章就夠了

本文面向 Flutter 初學(xué)者,旨在用易懂的方式帶大家入門。除了 Flutter 代碼,還會(huì)介紹到語法、原理、特性等基礎(chǔ)知識(shí)。相信本文能幫助你學(xué)習(xí)和理解 Flutter。

我們先看一下目前的一些跨平臺(tái)方案,從前端渲染的角度來分類的話,大致可以分為以下幾種方案。

WebView 渲染

這種方案就很好理解,現(xiàn)在很多項(xiàng)目都會(huì)嵌入 H5 的頁面。就是用 JavaScript 等前端技術(shù)進(jìn)行開發(fā),在客戶端上用 WebView 來進(jìn)行渲染。微信小程序目前使用的就是這種方案。

它的優(yōu)點(diǎn)很明顯,使用成熟的前端技術(shù)進(jìn)行開發(fā),學(xué)習(xí)成本低,開發(fā)效率高,并且支持動(dòng)態(tài)發(fā)布代碼。

但缺點(diǎn)也很明顯,在性能體驗(yàn)上,和原生還是存在較大差距的。

原生控件渲染

既然 WebView 的性能不夠好,于是就有了使用原生控件進(jìn)行渲染的方案。這種方案,同樣也是使用 JavaScript 開發(fā),區(qū)別是它最終是調(diào)用原生控件進(jìn)行渲染的。這種方案的代表是 Facebook 的 React Native。

由于使用原生控件進(jìn)行渲染,性能體驗(yàn)也會(huì)更接近原生。但也只是更接近,和原生還是有差距的,因?yàn)樗枰l繁的進(jìn)行 JavaScript 和原生之間的通信,這個(gè)通信效率是比較低的。

另外,由于需要適配各個(gè)平臺(tái)的控件,那就有可能出現(xiàn),系統(tǒng)控件更新了,而框架本身還沒有更新,由此產(chǎn)生了一些問題。換句話說,這種方案是受到原生控件限制的。

繪圖引擎渲染

接下來就是主角了。

在前端,如果完全不使用原生控件,我們可以通過系統(tǒng)的繪圖 API 繪制出一個(gè)用戶界面。從這個(gè)角度出發(fā),可以在各個(gè)平臺(tái)使用一個(gè)統(tǒng)一接口的繪圖引擎來進(jìn)行界面繪制,這個(gè)引擎最終調(diào)用的是系統(tǒng)的 API 繪制的。這樣的話,它的性能可以做到接近原生,并且又不受原生控件的限制,在不同平臺(tái)上能夠做到 UI 統(tǒng)一。

Flutter 就是這樣的一個(gè)開發(fā)框架。

一個(gè)跨平臺(tái) UI 解決方案

Flutter 是由 Google 開發(fā)的,一個(gè)跨平臺(tái) UI 解決方案。換句話說,它原則上只管 UI 的問題,如果涉及到平臺(tái)本身的一些功能,比如調(diào)用藍(lán)牙、攝像頭,一般還是需要原生代碼去操作。但現(xiàn)在也會(huì)有一些第三方庫幫我們解決這些問題。

繪圖引擎 Skia

Flutter 使用 Skia 作為它的繪圖引擎。Skia 已經(jīng)被 Google 收購,目前很多 Google 旗下的產(chǎn)品都是用 Skia 繪制的,包括 Android。

Android 內(nèi)置了 Skia,但 iOS 沒有,所以在打 iOS 安裝包的時(shí)候,會(huì)把 Skia 一起打進(jìn)去。這就導(dǎo)致了,用同一份 Flutter 代碼打包之后,iOS 的包要比 Android 的包大一些。

開發(fā)語言 Dart

Flutter 使用的開發(fā)語言,叫 Dart。Dart 也是 Google 自家的,它是一門面向?qū)ο蟮恼Z言,從它身上會(huì)看到一些其他開發(fā)語言的影子。學(xué)習(xí)起來難度不大的。

前面講跨平臺(tái)方案的時(shí)候,可以發(fā)現(xiàn)別的方案基本都是用 JavaScript 作為開發(fā)語言的,但為什么 Flutter 不用?就因?yàn)?Dart 是谷歌自家的嗎?這個(gè)問題先留著,我們后面會(huì)提到。

這里部分就簡單點(diǎn)帶過了,具體的搭建流程可以在官網(wǎng)查看:

主要的搭建步驟如下:

下載 Flutter SDK

官網(wǎng)下載地址:

由于在國內(nèi)訪問可能受限,官方為中國開發(fā)者搭建了鏡像:

更新環(huán)境變量

解壓后,將 flutter\bin 的全路徑添加到環(huán)境變量 PATH 中。

安裝開發(fā)工具

理論上,任何文本編輯器都可以用來開發(fā) Flutter 應(yīng)用,但推薦的開發(fā)工具是 Android Studio、IntelliJ 以及 VS Code。因?yàn)樵谶@些開發(fā)工具上,可以安裝官方的 Flutter 和 Dart 插件,得到更好的開發(fā)體驗(yàn)。文章里使用 Android Studio 來演示。

如果你打算開發(fā) iOS 應(yīng)用,則還需要安裝 Xcode。

安裝插件

在開發(fā)工具的插件設(shè)置中,安裝上面說到的 Flutter 和 Dart 插件。Flutter 插件用于支持 Flutter 的運(yùn)行、調(diào)試、熱重載等功能,而 Dart 插件則提供了代碼的輸入校驗(yàn)、代碼補(bǔ)全等功能。

萬物始于 Hello World,我們先來創(chuàng)建一個(gè)顯示 Hello World 的 Flutter 項(xiàng)目。

在 Android Studio 的歡迎頁面選擇 Start a new Flutter project ,或者通過菜單欄的 File New New Flutter Project ,創(chuàng)建一個(gè)新的 Flutter 項(xiàng)目。

創(chuàng)建好的項(xiàng)目里面包含了 android 和 ios 兩個(gè)文件夾,它們是標(biāo)準(zhǔn)的 Android 和 iOS 項(xiàng)目。我們的 Flutter 代碼,存放在 lib 文件夾里。項(xiàng)目創(chuàng)建好后,會(huì)默認(rèn)帶一個(gè)計(jì)數(shù)器的示例,我們不管它,把 main.dart 的代碼改成 Hello World:

啟動(dòng)一個(gè)模擬器,或者連上真機(jī),點(diǎn)擊 Run 運(yùn)行一下,就能看這樣一個(gè)界面了:

具體代碼先混個(gè)眼熟就好,具體的后面會(huì)再講到。

在寫 Flutter 之前,還要先跟大家簡單介紹一下 Dart 的語法。如果你有 Java 或 JavaScript 的開發(fā)經(jīng)驗(yàn),以及面向?qū)ο蟮木幊趟枷?,學(xué)起來是很快的。

我們可以在 test 文件夾下新建一個(gè) dart 文件,用來寫測試代碼。

指定類型

var

但和 JavaScript 不同的是,以下代碼在 JavaScript 是不會(huì)報(bào)錯(cuò)的,但在 Dart 里會(huì)報(bào)錯(cuò):

Object

如果非要上面這樣寫,那也可以。把 var 換成 Object 就不報(bào)錯(cuò)了:

和 Java 類似,Object 是所有對(duì)象的根基類。但是這樣的話,如果想打印一下 num 的字符串長度,是會(huì)報(bào)錯(cuò)的:

因?yàn)?length 是屬于 String 的,但系統(tǒng)只知道 num 是一個(gè)對(duì)象,并不知道它是一個(gè) String。

dynamic

如果還是非要這樣寫,那也可以。Dart 有一個(gè)特有的關(guān)鍵字 dynamic,把 Object 改成 dynamic 就不報(bào)錯(cuò)了:

我們運(yùn)行一下這個(gè)文件,可以在控制臺(tái)看到正確打印出了字符串長度。

函數(shù)

dynamic

在 Dart 里,函數(shù)也是可以不寫返回類型的,不寫的話會(huì)被當(dāng)做 dynamic 來處理。這樣的話,函數(shù)的類型就是 return 的類型,如果沒有 return 則是 void 類型。比如可以這樣:

運(yùn)行之后是能正確打印出字符串長度的。

用于傳參

Dart 里的函數(shù)也是一個(gè)對(duì)象,所以可以把函數(shù)作為參數(shù)來傳遞,比如:

可選參數(shù)

在 Dart 的函數(shù)傳參里,有一個(gè)叫可選參數(shù)的概念,我們以文字控件 Text 為例,在源碼里可以看到 Text 的構(gòu)造函數(shù)是這樣的:

首先,在參數(shù)里有一個(gè) data,它是要顯示的文字內(nèi)容,是一個(gè)必填項(xiàng)。而 data 后面的一堆參數(shù),是用一個(gè)大括號(hào)括起來的,這些參數(shù)就叫做可選參數(shù),意思是這些參數(shù)可傳可不傳。

假如我們要顯示一個(gè)比較長的文字,又想限制它最多顯示兩行,就可以這樣來創(chuàng)建一個(gè) Text:

可選參數(shù),在 Flutter 里面用的非常多。

異步

Future

在 Dart 里使用 Future 來處理異步任務(wù),比如我們現(xiàn)在延時(shí)一秒打印 666,代碼如下:

Future 的語法和 Promise 非常像。任務(wù)執(zhí)行成功會(huì)調(diào)用 then,執(zhí)行失敗會(huì)調(diào)用 catchError,而無論成功還是失敗,都會(huì)調(diào)用 whenComplete。

async/await

如果你不喜歡上面那種寫法,或者是想把異步轉(zhuǎn)成同步,就可以用 async 和 await 這兩個(gè)關(guān)鍵字來轉(zhuǎn)換。

我們把上面的代碼轉(zhuǎn)換一下,寫一個(gè) getString 方法,返回的類型是 Future,它會(huì)延時(shí)返回一個(gè)字符串。在 main 函數(shù)后面加上 async 關(guān)鍵字,在 getString() 前面加上 await,代碼如下:

運(yùn)行之后可以看到,能正常延時(shí)一秒后,把字符串打印出來。這里 getString() 返回的類型是 Future,而 await getString() 則是返回了延時(shí)之后返回的字符串。await 要在 async 的函數(shù)里面才能使用。

async 和 await 其實(shí)是一個(gè)語法糖,它最終也是轉(zhuǎn)換成 Future 調(diào)用鏈的形式執(zhí)行的。

接下來回到 Flutter,F(xiàn)lutter 里最重要的一個(gè)概念是 Widget(下面翻譯作控件)。

在原生開發(fā)里面,我們可能會(huì)在界面上區(qū)分,這是一個(gè) View,這是一個(gè) Layout,這是一個(gè) View Controller。但在 Flutter 里面,它們?nèi)紝儆谝粋€(gè)統(tǒng)一的模型 Widget。可以說,在 Flutter 界面里,所有東西都是 Widget。

以前學(xué)面向?qū)ο蟮臅r(shí)候,我們都聽過一句話,叫萬物皆對(duì)象。我這里套用一下,在 Flutter 里, 萬物皆控件 。

具體有哪些控件,我做了一下簡單的分類。

根控件

所有的控件都屬于 StatefulWidget 或 StatelessWidget 。它們的區(qū)別是,StatefulWidget 擁有狀態(tài) State ,而 StatelessWidget 沒有。

StatefulWidget

當(dāng)一個(gè)控件是可變的時(shí)候,就要使用 StatefulWidget 來構(gòu)建。StatefulWidget 本身不可變,但它持有的狀態(tài) State 是可變的。

StatelessWidget

當(dāng)一個(gè)控件狀態(tài)是固定不可變的時(shí)候,就可以使用 StatelessWidget。前面我們寫的 Hello World 就是使用 StatelessWidget。

容器控件

容器類控件一般是將某些屬性或配置,作用在它的子控件上,比如控件所在的寬高、背景、位置等。

常用的容器控件有 Container、Center、Padding 等。

布局控件

布局控件可以類比作原生開發(fā)中的 Layout,通常它會(huì)擁有一個(gè) children 的屬性,用于接收一個(gè)控件數(shù)組,對(duì)這些控件進(jìn)行特定的排版。

常用的布局控件有 Row、Column、Stack、Flex 等。

基礎(chǔ)控件

基礎(chǔ)控件就是常用的文字、按鈕、圖片等控件。

常用的基礎(chǔ)控件有 Text、TextField、Button、Image 等。

功能控件

在 Flutter 里還有一類控件,它們不影響 UI 布局,但帶有一些特定的功能,比如頁面跳轉(zhuǎn)、事件監(jiān)聽、定義主題等。我們把這一類控件稱作功能控件。

常用的功能控件有 Navigator、NotificationListener、Theme 等。

開始寫 Flutter 代碼了。還記不記得,在 Flutter 項(xiàng)目創(chuàng)建之后,是自帶一個(gè)計(jì)數(shù)器 demo 的,現(xiàn)在我們用自己的代碼實(shí)現(xiàn)一遍。代碼修改成如下:

運(yùn)行之后,就可以看到這樣的界面了:

按鈕每點(diǎn)擊一次,數(shù)字就會(huì)加一。下面我們來分析一下這段代碼,看下里面用到的一些 Widget。

StatefulWidget

由于頁面中的數(shù)字是跟隨狀態(tài)變化的,所以該頁面改用 StatefulWidget。StatefulWidget 并不會(huì)直接返回一個(gè) Widget,而是返回狀態(tài) State,在 State 里再返回 Widget。

Scaffold

Scaffold 是一個(gè)標(biāo)準(zhǔn)的 Material Design 頁面,它包含了標(biāo)題欄、浮動(dòng)按鈕、側(cè)滑菜單、底部導(dǎo)航欄等配置。我們這里用到了標(biāo)題欄 appBar、頁面內(nèi)容 body、浮動(dòng)按鈕 floatingActionButton。

AppBar

AppBar 就是標(biāo)題欄,通過查看控件的構(gòu)造方法,我們可以知道它可配置的屬性。

AppBar 的可選參數(shù)除了標(biāo)題 title,還可以配置標(biāo)題前的內(nèi)容 leading,右側(cè)的操作按鈕 anctions,控件垂直高度 elevation 等。我們只傳了 title,其他屬性都用默認(rèn)值。

Center

Center 是一個(gè)容器類控件,它的作用就是讓它的子控件居中顯示。

FloatingActionButton

熟悉安卓開發(fā)的應(yīng)該對(duì)這個(gè)控件比較熟悉,它就是頁面右下角一個(gè)特定樣式的 Button,參數(shù)里面的 onPressed 是一個(gè)必填項(xiàng),要傳一個(gè)點(diǎn)擊之后的回調(diào)函數(shù)。

根據(jù)這個(gè)例子,下面給大家介紹一下 Flutter 兩個(gè)比較重要的特性。

點(diǎn)擊 Button 之后,我們把 num 變量加一,并使用 setState 通知狀態(tài)發(fā)生了改變,F(xiàn)lutter 會(huì)根據(jù)新的狀態(tài)更新 UI。如果有接觸過小程序開發(fā),setState 就和小程序的 setData 類似。

在 Flutter 里面我們不需要用 set 方法來更新 UI,可變控件是和狀態(tài)綁定的,這就是 Flutter 的響應(yīng)式 UI 編程。

在 Android Q 和 iOS 13 里都加入了暗黑模式,我們也換一個(gè)暗黑主題來玩一下。MaterialApp 里有一個(gè) theme 的屬性,我們把它配置一下:

這次改完之后不點(diǎn) Run 了,我們點(diǎn)一下閃電圖標(biāo) Flutter Hot Reload ,就能看到界面發(fā)生了變化:

這就是 Flutter 的 熱重載 ,在修改完代碼之后,通過熱重載就能馬上在設(shè)備上看到修改結(jié)果,可以很大程度上增加開發(fā)效率。

下面再給大家介紹幾個(gè) Flutter 里的常見操作。

在 Flutter 里,使用 Navigator 來管理頁面跳轉(zhuǎn),比如要跳轉(zhuǎn)到一個(gè) NewPage 可以這樣寫:

進(jìn)棧使用 push,出棧則是 pop。

使用 MaterialPageRoute 會(huì)模擬出 Android 上頁面跳轉(zhuǎn)的過場效果。

我們來看看怎么顯示一張本地圖片。

先在根目錄新建一個(gè)存放圖片的文件夾,比如叫 images,把圖片 picture.png 放進(jìn)去。

找到根目錄下的 pubspec.yaml 文件,這個(gè)便是 Flutter 依賴配置文件,我們需要在這里配置一下剛才的圖片:

這樣,我們就能使用 Image 控件把這張圖片顯示出來了:

和 node 的 npm 以及 Android 的 jcenter 類似,F(xiàn)lutter 也擁有一個(gè)公共倉庫 pub.dev。pub.dev 是 Google 官方的 Dart 倉庫,在上面可以找到我們需要的包和插件。

Flutter 本身沒有 Toast,我們來接入一個(gè)。在 pub.dev 上搜索后,我決定使用 fluttertoast:

按照說明,在 pubspec.yaml 文件里的 dependencies 下配置:

點(diǎn)一下 Android Studio 右上角的 Packages get 同步之后就可以使用了:

我們上面使用的都是 Material Design 的控件,它們都是在 flutter/material.dart 包里面的。如果要使用 iOS 風(fēng)格的控件,則要用到 flutter/cupertino.dart 包:

iOS 風(fēng)格的控件,基本都以 Cupertino 開頭。我們把計(jì)時(shí)器頁面里的控件替換一下:

效果如下:

代碼的部分就到這里了,接下來跟大家聊一下編譯方式,編程語言的編譯方式有兩種。

關(guān)于它們孰優(yōu)孰劣,就要看從哪個(gè)角度去對(duì)比了。JIT 的話,它的一大特點(diǎn)就是支持動(dòng)態(tài)發(fā)布代碼,也就是支持熱更新。但要是從性能的角度考慮,AOT 會(huì)更好,因?yàn)樵谶\(yùn)行的時(shí)候不用再進(jìn)行編譯的操作的,運(yùn)行的效率會(huì)更高一些。

回到我們一開始的時(shí)候留下的問題,為什么別的跨平臺(tái)方案都是用 JavaScript,而 Flutter 要用 Dart 來開發(fā)。JavaScript 的編譯方式是 JIT 的,它不支持 AOT。而 Dart 同時(shí)支持 JIT 和 AOT。

Flutter 在開發(fā)階段使用 JIT,讓我們用上了熱重載,增加了開發(fā)效率。在打包時(shí)改用 AOT,保證了正式版應(yīng)用的性能。

最后講一下大家比較關(guān)心的一個(gè)東西,F(xiàn)lutter 是否支持熱更新?前面說到 Dart 支持 JIT,所以從技術(shù)層面它是支持的。但是目前是不支持的,在官方的計(jì)劃文檔中,可以看到:

至于原因,官方在這里進(jìn)行了說明??偟膩碚f,是由于政策的限制,以及出于對(duì)性能和安全性的考慮,暫時(shí)不支持了。

到這就結(jié)束啦。由于想把 Flutter 基礎(chǔ)在一篇內(nèi)講完,沒有涉及太多細(xì)節(jié),如果要寫 Flutter 代碼還需要深入學(xué)習(xí)。但相信理解之后再學(xué),會(huì)輕松很多。

Flutter 之 彈性布局 (Row、Column) (十一)

彈性布局允許子組件按照一定比例來分配父容器空間

Flex組件和Row、Column屬性主要的區(qū)別就是多一個(gè)direction。

當(dāng)direction的值為Axis.horizontal的時(shí)候,則是Row。

當(dāng)direction的值為Axis.vertical的時(shí)候,則是Column。

它們之中都有主軸(MainAxis)和交叉軸(CrossAxis)的概念:

Row可以沿水平方向排列其子widget。定義如下:

示例1 - 基本使用

示例2 - 基線對(duì)齊

基線是英文字母X的下端兩點(diǎn)連成的一條線

示例3 - 水平方向包裹

Column可以沿垂直方向排列其子widget。定義如下:

Column 基本使用 示例

再看一個(gè)示例

運(yùn)行效果如下:

我們發(fā)現(xiàn)文本并沒有居中?

解釋:

實(shí)際上,Row和Column都只會(huì)在主軸方向占用盡可能大的空間,而交叉軸的長度則取決于他們最大子元素的長度。如果我們想讓本例中的兩個(gè)文本控件在整個(gè)手機(jī)屏幕中間對(duì)齊,我們有兩種方法:

運(yùn)行效果如下:

如果Row里面嵌套R(shí)ow,或者Column里面再嵌套Column,那么只有最外面的Row或Column會(huì)占用盡可能大的空間,里面Row或Column所占用的空間為實(shí)際大小,下面以Column為例說明

如果要讓里面的Column占滿外部Column,可以使用Expanded 組件:

Flutter Stack 的布局規(guī)則

Stack 是可以將視圖根據(jù)children中子組件的順序進(jìn)行疊加的組件,根據(jù)子組件是否被Positioned包裹判斷布局的方式

Stack 的fit 屬性用來控制Stack如何將自己的父級(jí)組件的尺寸約束傳達(dá)給無位置組件,通過fit屬性約束Stack中無位置組件的尺寸,默認(rèn)值是 StackFie.loose. 如:Stack的父級(jí)組件要求Stack的尺寸是 200x200 ~ 500x500.在默認(rèn)的StackFit.loose(寬松狀態(tài))下,Stack 可以運(yùn)行其children在不違反父級(jí)約束的前提下,自由選擇尺寸,即可在0x0~500x500的范圍內(nèi)任意選擇。相反如何傳入的fit是StackFit.expand(擴(kuò)張狀態(tài))下,則會(huì)要求所有無位置children必須占滿父級(jí)約束的最大空間,即尺寸必須為500x500,最后當(dāng)傳入的StackFit.passthrough(穿透狀態(tài))時(shí),Stack會(huì)將自己父級(jí)組件的尺寸約束直接傳遞給子組件,即保留原有的200x200 ~ 500x500的約束。

StackFie.loose 和StackFit.passthrough的效果

StackFit.expand的效果

Flutter開發(fā)--如何布局?

相對(duì)于iOS開發(fā),F(xiàn)lutter的布局更具有靈活性,每個(gè)頁面設(shè)計(jì)都不一樣,相同頁面可選擇的布局方式也不一樣,如果單純的說應(yīng)該如何去布局,我覺得不現(xiàn)實(shí),大家可以參考下 Flutter官方的布局教程 。接下來,筆者,通過項(xiàng)目中的一個(gè)頁面,來一步一步的拆解布局的流程。整個(gè)過程,基本上按照拆解、組件封裝、具體布局這三步來的。

根據(jù)設(shè)計(jì)圖,可以看出整體可以分成兩部分,上面一部分是系統(tǒng)介紹模塊,下面一部分是真正的登錄內(nèi)容,因?yàn)樯婕暗蒋B加,因此考慮用Stack;

系統(tǒng)介紹模塊部分:整體也是涉及到疊加,考慮用Stack,分為四部分。最底部漸變色背景用一個(gè)contanier,無須指定位置,全視圖擴(kuò)展;載放logo圖標(biāo)在上一層,用Image。最后兩個(gè)Text同級(jí)放在最上層。Image,Text各用Positioned包裹去指定位置。

登錄內(nèi)容模塊是最外層是一個(gè)Contanier容器,去控制背景色和圓角。然后是一個(gè)Column元素,逐行排列。

第一行為Image,

第二行為Text,

第三行可以看成一個(gè)小Column,分兩塊進(jìn)行布局

第四行可以看成一個(gè)小Column,分兩塊進(jìn)行布局

第五行可以看作一個(gè)TextButton,

第六行可以看作一個(gè)Row,分三塊進(jìn)行布局

通過上面這樣一步一步的分析后,基本上對(duì)大致的布局有了一個(gè)了解,最外層的控件大致選對(duì)(只要能實(shí)現(xiàn)的話,就是復(fù)雜度以及效率的問題),然后一步一步的拆解每一行的元素,如果有重復(fù)的或者覺得可以封裝出來的部分,則進(jìn)行下一步。

每一行的拆解,大致也是按照這個(gè)思路來進(jìn)行,因此筆者在這里就不做講解了。

在做到第三第四行的時(shí)候,發(fā)現(xiàn)這兩個(gè)很相似,而且設(shè)計(jì)到一些交互邏輯,筆者就想對(duì)第三第四行的這種展示進(jìn)行封裝,覺得今后的布局可能會(huì)用到,因此在這一步,可以先把這一塊兒抽離出一個(gè)控件。利用TextField來實(shí)現(xiàn)這種輸入操作,具體的實(shí)現(xiàn)筆者不再詳細(xì)的描述了。

經(jīng)過這一步,整體的規(guī)劃設(shè)計(jì)圖已經(jīng)有了,各個(gè)組件也都有了,接下來的工作就是組裝了。

具體布局設(shè)計(jì)到一些細(xì)節(jié)的地方,例如整體Column的居中對(duì)齊(crossAxisAlignment)、間隔(Padding或Container包裹,筆者更喜歡用SizedBox占位)、居左居右居中(Align)、點(diǎn)擊事件(GestureDetector)以及圓角(BorderRadius)等一些特殊情況。

像第六行row是放在底部的,就可以在第六行前面增加一個(gè)Spacer()去填充空白區(qū)域。

對(duì)文字顏色大小等,可以用TextStyle直接設(shè)置。

對(duì)于輸入框的刪除按鈕,可以用Offstage這種Flutter特有的控制顯示隱藏的控件。

名稱欄目:flutter布局詳解,flutter 布局詳解,必知必會(huì)
標(biāo)題鏈接:http://aaarwkj.com/article28/dsiiecp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、網(wǎng)站收錄、網(wǎng)站策劃、虛擬主機(jī)、動(dòng)態(tài)網(wǎng)站、品牌網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)
亚洲一区二区三区小蜜桃| 午夜精品一区二区三区久久 | 日韩av网址在线免费观看| 日本福利资源在线观看| 亚洲精品露脸自拍高清在线观看| 青青草原这里只有精品| 免费无遮挡午夜视频网站| 国产精品大白屁股视频| 亚洲视频欧美视频自拍偷拍| 最新国产激情福利网站| 91午夜福利国产精品| 日韩不伦高清一区二区三区 | 国产精品av在线网站| 亚洲成人黄色片在线观看| 国产精品成人大片在线播放| 亚洲少妇精品视频在线| 日本一区两区三区不卡视频| 成人激情视频在线观看| 不卡的国产在线视频| 热热久久这里只有精品| 国产亚洲无线码一区二区| 日本一区二区三区三州免费观看 | 成人嚼牙特别黑黄怎么办| 丝袜美腿蜜汁一龙二凤| 中日韩中文字幕一区二区| 欧美成人精品免费在线| 欧美日韩亚洲激情一区| 国产自愉怕一区二区三区| 一卡二卡三卡四卡日韩| 亚洲成色在线综合剧情网站 | 青青草成人公开在线视频| 日韩av裸体在线播放| 久久国产亚洲欧美一区| 另类激情综合在线观看| 在线观看免费在线观看免费| 激情内射日本一区二区三区| 日韩二区三区精品视频| 亚洲精品一区二区午夜| 精品亚洲综合一区二区| 中文字幕在线成人影院| 国产精品一区二区三区国产|