新聞中心
Flutter_定義控件StatefulWidgets和StatelessWidget
Stateful(有狀態(tài)) 和 stateless(無狀態(tài)) widgets
創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的連江網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
stateless widget 沒有內(nèi)部狀態(tài). Icon、 IconButton, 和Text 都是無狀態(tài)widget, 他們都是 StatelessWidget的子類。
stateful widget 是動態(tài)的. 用戶可以和其交互 (例如輸入一個表單、 或者移動一個slider滑塊),或者可以隨時間改變 (也許是數(shù)據(jù)改變導(dǎo)致的UI更新). Checkbox, Radio, Slider, InkWell, Form, and TextField 都是 stateful widgets, 他們都是 StatefulWidget的子類。
StatefulWidget類
具有可變狀態(tài)的小部件。
狀態(tài)是(1)在構(gòu)建窗口小部件時可以同步讀取的信息,以及(2)在窗口小部件的生命周期內(nèi)可能會更改的信息。這是小工具實(shí)施者的責(zé)任,以確保國家的及時通知當(dāng)這種狀態(tài)的改變,使用State.setState。
有狀態(tài)窗口小部件是一個窗口小部件,它通過構(gòu)建一個更具體地描述用戶界面的其他窗口小部件來描述用戶界面的一部分。構(gòu)建過程以遞歸方式繼續(xù),直到用戶界面的描述完全具體(例如,完全由RenderObjectWidget組成,其描述具體的RenderObject)。
當(dāng)您描述的用戶界面部分可以動態(tài)更改時(例如由于具有內(nèi)部時鐘驅(qū)動狀態(tài)或依賴于某些系統(tǒng)狀態(tài)),狀態(tài)窗口小部件非常有用。對于僅依賴于對象本身中的配置信息以及窗口小部件膨脹的 BuildContext的組合,請考慮使用 StatelessWidget。
StatefulWidget實(shí)例本身是不可變的,并且將它們的可變狀態(tài)存儲在由createState方法創(chuàng)建的單獨(dú)State對象中 ,或者存儲在State訂閱的對象中,例如Stream或ChangeNotifier對象,其引用存儲在StatefulWidget的最終字段中本身。
框架在膨脹StatefulWidget時 調(diào)用createState,這意味著如果該窗口小部件已插入到多個位置的樹中,則多個State對象可能與同一StatefulWidget關(guān)聯(lián)。同樣,如果StatefulWidget從樹中移除,后來在樹再次插入時,框架將調(diào)用createState再創(chuàng)建一個新的國家目標(biāo),簡化的生命周期狀態(tài)的對象。
如果StatefulWidget的創(chuàng)建者使用GlobalKey作為其 鍵,則StatefulWidget在從樹中的一個位置移動到另一個位置時保持相同的State對象。由于具有GlobalKey的窗口小部件可以在樹中的至多一個位置使用,因此使用GlobalKey的窗口小部件最多只有一個關(guān)聯(lián)元素。當(dāng)通過將與該窗口小部件關(guān)聯(lián)的(唯一)子樹從舊位置移植到新位置(而不是在該位置重新創(chuàng)建子樹)時,框架利用此屬性將全局鍵從樹中的一個位置移動到另一個位置時利用此屬性。新的位置)。與StatefulWidget關(guān)聯(lián)的State對象與子樹的其余部分一起被移植,這意味著State對象在新位置被重用(而不是被重新創(chuàng)建)。但是,為了有資格進(jìn)行嫁接,必須將窗口小部件插入到從舊位置移除它的同一動畫幀中的新位置。
StatefulWidget有兩個主要類別。
首先是其中一個分配資源State.initState并在他們的處置State.dispose,但不依賴于InheritedWidget S或致電State.setState。這些小部件通常在應(yīng)用程序或頁面的根目錄中使用,并通過ChangeNotifier, Stream或其他此類對象與子小部件進(jìn)行通信。遵循這種模式的有狀態(tài)小部件相對便宜(就CPU和GPU周期而言),因?yàn)樗鼈儤?gòu)建一次然后永不更新。因此,它們可能有一些復(fù)雜和深刻的構(gòu)建方法。
第二類是使用State.setState或依賴于 InheritedWidget的小部件。這些通常會在應(yīng)用程序的生命周期內(nèi)重建多次,因此最小化重建此類窗口小部件的影響非常重要。(他們也可以使用State.initState或 State.didChangeDependencies并分配資源,但重要的是他們重建。)
可以使用幾種技術(shù)來最小化重建有狀態(tài)窗口小部件的影響:
StatelessWidget類
一個不需要可變狀態(tài)的小部件。
無狀態(tài)窗口小部件是一個窗口小部件,它通過構(gòu)建一個更具體地描述用戶界面的其他窗口小部件來描述用戶界面的一部分。構(gòu)建過程以遞歸方式繼續(xù),直到用戶界面的描述完全具體(例如,完全由RenderObjectWidget組成,其描述具體的RenderObject)。
當(dāng)您描述的用戶界面部分不依賴于對象本身的配置信息以及窗口小部件膨脹的BuildContext時,無狀態(tài)窗口小部件非常有用。對于可以動態(tài)更改的組合,例如由于具有內(nèi)部時鐘驅(qū)動狀態(tài)或依賴于某些系統(tǒng)狀態(tài),請考慮使用StatefulWidget。
無狀態(tài)窗口小部件的構(gòu)建方法通常僅在以下三種情況下調(diào)用:第一次將窗口小部件插入樹中,窗口小部件的父窗口更改其配置時,以及何時依賴于更改的InheritedWidget。
如果窗口小部件的父級將定期更改窗口小部件的配置,或者它依賴于經(jīng)常更改的繼承窗口小部件,則優(yōu)化構(gòu)建方法的性能以保持流暢的呈現(xiàn)性能非常重要。
可以使用幾種技術(shù)來最小化重建無狀態(tài)窗口小部件的影響:
Flutter小部件之圖片(Image)和圖標(biāo)(Icon)
在Flutter中,我們可以使用Image控件來顯示圖片,一般來講我們的圖片資源都來源于網(wǎng)絡(luò)或者本地圖片。
Flutter中的Image也是類似。
我們先來看看Image的構(gòu)造方法
下面我們來看看其常用的屬性
可以看到,其常用屬性跟前端中的css很像。
下面我們來簡單用一用Image控件
首先是必填參數(shù)image,它接收一個ImageProvider類型的值。ImageProvider是一個抽象類,他下面有下圖這些實(shí)現(xiàn)類,由下面這些實(shí)現(xiàn)類可以看出,image是可以從資源,內(nèi)存,網(wǎng)絡(luò),和文件中獲取圖片。
我們先來試試加載網(wǎng)絡(luò)圖片
首先看看NetworkImage構(gòu)造方法,很簡單,傳個url就可以了
如下:
嗯,就是這么簡單。其他3種情況使用也是類似的,自行看源碼即可。
實(shí)際上,F(xiàn)lutter給我們提供了擴(kuò)展方法,使用起來更加簡單,通常我們直接使用提供的擴(kuò)展方法即可
如下
可以看到,他們的構(gòu)造方法基本類似。
所以我們也可以這樣寫,跟上面的效果是一致的。
大致分為一下幾步
1.創(chuàng)建一個文件夾,用于存放圖片,如圖,我創(chuàng)建了一個imgs的文件夾,放了一張圖片
2.在pubspec.yaml中聲明資源,注意聲明的時候路徑和前面的-是有間隔的,不然的話會報#/properties/flutter/properties/assets: type: wanted [array] got -imgs/code.png
類似的錯誤,聲明完成后點(diǎn)擊右上方的packages get
或
下面我們再來看看其他屬性。
width,height
寬高沒什么好說的,就是設(shè)置寬度和高度
配合color使用,用于設(shè)置顏色的混合模式。BlendMode是一個枚舉,他有很多值
詳細(xì)解析還是看官方文檔吧,值太多了,我們隨便用用
用于設(shè)置圖片的填充方式,當(dāng)圖片本身小于設(shè)置的寬高或者比父控件的寬高小時,我們可以設(shè)置該屬性控制圖片的顯示。
其值的類型是BoxFit。是個枚舉
具體含義還是直接看文檔即可
設(shè)置圖片的對齊方式,接收一個Alignment類型的值,值如下,很好理解
為了方便看效果我們在外邊套了個Container,簡單的把它理解為一個容器布局就可以了,類似于html中的div或android中的Layout,我們給Container設(shè)置了寬高和背景顏色。
bottomLeft效果如下,其他的自行嘗試
相對于Image,ICON可以像web一樣使用字體圖標(biāo),并且可以使用矢量圖,無需擔(dān)心失真的問題,并且體積相對較小。
我們先來看看其構(gòu)造方法
很簡單,我們直接來用一用
默認(rèn)情況下,pubspec.yaml中uses-material-design的值為true.我們默認(rèn)就可以使用Material Design字體圖標(biāo)
Flutter入門這一篇效率文章就夠了
本文面向 Flutter 初學(xué)者,旨在用易懂的方式帶大家入門。除了 Flutter 代碼,還會介紹到語法、原理、特性等基礎(chǔ)知識。相信本文能幫助你學(xué)習(xí)和理解 Flutter。
我們先看一下目前的一些跨平臺方案,從前端渲染的角度來分類的話,大致可以分為以下幾種方案。
WebView 渲染
這種方案就很好理解,現(xiàn)在很多項(xiàng)目都會嵌入 H5 的頁面。就是用 JavaScript 等前端技術(shù)進(jìn)行開發(fā),在客戶端上用 WebView 來進(jìn)行渲染。微信小程序目前使用的就是這種方案。
它的優(yōu)點(diǎn)很明顯,使用成熟的前端技術(shù)進(jìn)行開發(fā),學(xué)習(xí)成本低,開發(fā)效率高,并且支持動態(tài)發(fā)布代碼。
但缺點(diǎn)也很明顯,在性能體驗(yàn)上,和原生還是存在較大差距的。
原生控件渲染
既然 WebView 的性能不夠好,于是就有了使用原生控件進(jìn)行渲染的方案。這種方案,同樣也是使用 JavaScript 開發(fā),區(qū)別是它最終是調(diào)用原生控件進(jìn)行渲染的。這種方案的代表是 Facebook 的 React Native。
由于使用原生控件進(jìn)行渲染,性能體驗(yàn)也會更接近原生。但也只是更接近,和原生還是有差距的,因?yàn)樗枰l繁的進(jìn)行 JavaScript 和原生之間的通信,這個通信效率是比較低的。
另外,由于需要適配各個平臺的控件,那就有可能出現(xiàn),系統(tǒng)控件更新了,而框架本身還沒有更新,由此產(chǎn)生了一些問題。換句話說,這種方案是受到原生控件限制的。
繪圖引擎渲染
接下來就是主角了。
在前端,如果完全不使用原生控件,我們可以通過系統(tǒng)的繪圖 API 繪制出一個用戶界面。從這個角度出發(fā),可以在各個平臺使用一個統(tǒng)一接口的繪圖引擎來進(jìn)行界面繪制,這個引擎最終調(diào)用的是系統(tǒng)的 API 繪制的。這樣的話,它的性能可以做到接近原生,并且又不受原生控件的限制,在不同平臺上能夠做到 UI 統(tǒng)一。
Flutter 就是這樣的一個開發(fā)框架。
一個跨平臺 UI 解決方案
Flutter 是由 Google 開發(fā)的,一個跨平臺 UI 解決方案。換句話說,它原則上只管 UI 的問題,如果涉及到平臺本身的一些功能,比如調(diào)用藍(lán)牙、攝像頭,一般還是需要原生代碼去操作。但現(xiàn)在也會有一些第三方庫幫我們解決這些問題。
繪圖引擎 Skia
Flutter 使用 Skia 作為它的繪圖引擎。Skia 已經(jīng)被 Google 收購,目前很多 Google 旗下的產(chǎn)品都是用 Skia 繪制的,包括 Android。
Android 內(nèi)置了 Skia,但 iOS 沒有,所以在打 iOS 安裝包的時候,會把 Skia 一起打進(jìn)去。這就導(dǎo)致了,用同一份 Flutter 代碼打包之后,iOS 的包要比 Android 的包大一些。
開發(fā)語言 Dart
Flutter 使用的開發(fā)語言,叫 Dart。Dart 也是 Google 自家的,它是一門面向?qū)ο蟮恼Z言,從它身上會看到一些其他開發(fā)語言的影子。學(xué)習(xí)起來難度不大的。
前面講跨平臺方案的時候,可以發(fā)現(xiàn)別的方案基本都是用 JavaScript 作為開發(fā)語言的,但為什么 Flutter 不用?就因?yàn)?Dart 是谷歌自家的嗎?這個問題先留著,我們后面會提到。
這里部分就簡單點(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)建一個顯示 Hello World 的 Flutter 項(xiàng)目。
在 Android Studio 的歡迎頁面選擇 Start a new Flutter project ,或者通過菜單欄的 File New New Flutter Project ,創(chuàng)建一個新的 Flutter 項(xiàng)目。
創(chuàng)建好的項(xiàng)目里面包含了 android 和 ios 兩個文件夾,它們是標(biāo)準(zhǔn)的 Android 和 iOS 項(xiàng)目。我們的 Flutter 代碼,存放在 lib 文件夾里。項(xiàng)目創(chuàng)建好后,會默認(rèn)帶一個計數(shù)器的示例,我們不管它,把 main.dart 的代碼改成 Hello World:
啟動一個模擬器,或者連上真機(jī),點(diǎn)擊 Run 運(yùn)行一下,就能看這樣一個界面了:
具體代碼先混個眼熟就好,具體的后面會再講到。
在寫 Flutter 之前,還要先跟大家簡單介紹一下 Dart 的語法。如果你有 Java 或 JavaScript 的開發(fā)經(jīng)驗(yàn),以及面向?qū)ο蟮木幊趟枷?,學(xué)起來是很快的。
我們可以在 test 文件夾下新建一個 dart 文件,用來寫測試代碼。
指定類型
var
但和 JavaScript 不同的是,以下代碼在 JavaScript 是不會報錯的,但在 Dart 里會報錯:
Object
如果非要上面這樣寫,那也可以。把 var 換成 Object 就不報錯了:
和 Java 類似,Object 是所有對象的根基類。但是這樣的話,如果想打印一下 num 的字符串長度,是會報錯的:
因?yàn)?length 是屬于 String 的,但系統(tǒng)只知道 num 是一個對象,并不知道它是一個 String。
dynamic
如果還是非要這樣寫,那也可以。Dart 有一個特有的關(guān)鍵字 dynamic,把 Object 改成 dynamic 就不報錯了:
我們運(yùn)行一下這個文件,可以在控制臺看到正確打印出了字符串長度。
函數(shù)
dynamic
在 Dart 里,函數(shù)也是可以不寫返回類型的,不寫的話會被當(dāng)做 dynamic 來處理。這樣的話,函數(shù)的類型就是 return 的類型,如果沒有 return 則是 void 類型。比如可以這樣:
運(yùn)行之后是能正確打印出字符串長度的。
用于傳參
Dart 里的函數(shù)也是一個對象,所以可以把函數(shù)作為參數(shù)來傳遞,比如:
可選參數(shù)
在 Dart 的函數(shù)傳參里,有一個叫可選參數(shù)的概念,我們以文字控件 Text 為例,在源碼里可以看到 Text 的構(gòu)造函數(shù)是這樣的:
首先,在參數(shù)里有一個 data,它是要顯示的文字內(nèi)容,是一個必填項(xiàng)。而 data 后面的一堆參數(shù),是用一個大括號括起來的,這些參數(shù)就叫做可選參數(shù),意思是這些參數(shù)可傳可不傳。
假如我們要顯示一個比較長的文字,又想限制它最多顯示兩行,就可以這樣來創(chuàng)建一個 Text:
可選參數(shù),在 Flutter 里面用的非常多。
異步
Future
在 Dart 里使用 Future 來處理異步任務(wù),比如我們現(xiàn)在延時一秒打印 666,代碼如下:
Future 的語法和 Promise 非常像。任務(wù)執(zhí)行成功會調(diào)用 then,執(zhí)行失敗會調(diào)用 catchError,而無論成功還是失敗,都會調(diào)用 whenComplete。
async/await
如果你不喜歡上面那種寫法,或者是想把異步轉(zhuǎn)成同步,就可以用 async 和 await 這兩個關(guān)鍵字來轉(zhuǎn)換。
我們把上面的代碼轉(zhuǎn)換一下,寫一個 getString 方法,返回的類型是 Future,它會延時返回一個字符串。在 main 函數(shù)后面加上 async 關(guān)鍵字,在 getString() 前面加上 await,代碼如下:
運(yùn)行之后可以看到,能正常延時一秒后,把字符串打印出來。這里 getString() 返回的類型是 Future,而 await getString() 則是返回了延時之后返回的字符串。await 要在 async 的函數(shù)里面才能使用。
async 和 await 其實(shí)是一個語法糖,它最終也是轉(zhuǎn)換成 Future 調(diào)用鏈的形式執(zhí)行的。
接下來回到 Flutter,F(xiàn)lutter 里最重要的一個概念是 Widget(下面翻譯作控件)。
在原生開發(fā)里面,我們可能會在界面上區(qū)分,這是一個 View,這是一個 Layout,這是一個 View Controller。但在 Flutter 里面,它們?nèi)紝儆谝粋€統(tǒng)一的模型 Widget。可以說,在 Flutter 界面里,所有東西都是 Widget。
以前學(xué)面向?qū)ο蟮臅r候,我們都聽過一句話,叫萬物皆對象。我這里套用一下,在 Flutter 里, 萬物皆控件 。
具體有哪些控件,我做了一下簡單的分類。
根控件
所有的控件都屬于 StatefulWidget 或 StatelessWidget 。它們的區(qū)別是,StatefulWidget 擁有狀態(tài) State ,而 StatelessWidget 沒有。
StatefulWidget
當(dāng)一個控件是可變的時候,就要使用 StatefulWidget 來構(gòu)建。StatefulWidget 本身不可變,但它持有的狀態(tài) State 是可變的。
StatelessWidget
當(dāng)一個控件狀態(tài)是固定不可變的時候,就可以使用 StatelessWidget。前面我們寫的 Hello World 就是使用 StatelessWidget。
容器控件
容器類控件一般是將某些屬性或配置,作用在它的子控件上,比如控件所在的寬高、背景、位置等。
常用的容器控件有 Container、Center、Padding 等。
布局控件
布局控件可以類比作原生開發(fā)中的 Layout,通常它會擁有一個 children 的屬性,用于接收一個控件數(shù)組,對這些控件進(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)建之后,是自帶一個計數(shù)器 demo 的,現(xiàn)在我們用自己的代碼實(shí)現(xiàn)一遍。代碼修改成如下:
運(yùn)行之后,就可以看到這樣的界面了:
按鈕每點(diǎn)擊一次,數(shù)字就會加一。下面我們來分析一下這段代碼,看下里面用到的一些 Widget。
StatefulWidget
由于頁面中的數(shù)字是跟隨狀態(tài)變化的,所以該頁面改用 StatefulWidget。StatefulWidget 并不會直接返回一個 Widget,而是返回狀態(tài) State,在 State 里再返回 Widget。
Scaffold
Scaffold 是一個標(biāo)準(zhǔn)的 Material Design 頁面,它包含了標(biāo)題欄、浮動按鈕、側(cè)滑菜單、底部導(dǎo)航欄等配置。我們這里用到了標(biāo)題欄 appBar、頁面內(nèi)容 body、浮動按鈕 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 是一個容器類控件,它的作用就是讓它的子控件居中顯示。
FloatingActionButton
熟悉安卓開發(fā)的應(yīng)該對這個控件比較熟悉,它就是頁面右下角一個特定樣式的 Button,參數(shù)里面的 onPressed 是一個必填項(xiàng),要傳一個點(diǎn)擊之后的回調(diào)函數(shù)。
根據(jù)這個例子,下面給大家介紹一下 Flutter 兩個比較重要的特性。
點(diǎn)擊 Button 之后,我們把 num 變量加一,并使用 setState 通知狀態(tài)發(fā)生了改變,F(xiàn)lutter 會根據(jù)新的狀態(tài)更新 UI。如果有接觸過小程序開發(fā),setState 就和小程序的 setData 類似。
在 Flutter 里面我們不需要用 set 方法來更新 UI,可變控件是和狀態(tài)綁定的,這就是 Flutter 的響應(yīng)式 UI 編程。
在 Android Q 和 iOS 13 里都加入了暗黑模式,我們也換一個暗黑主題來玩一下。MaterialApp 里有一個 theme 的屬性,我們把它配置一下:
這次改完之后不點(diǎn) Run 了,我們點(diǎn)一下閃電圖標(biāo) Flutter Hot Reload ,就能看到界面發(fā)生了變化:
這就是 Flutter 的 熱重載 ,在修改完代碼之后,通過熱重載就能馬上在設(shè)備上看到修改結(jié)果,可以很大程度上增加開發(fā)效率。
下面再給大家介紹幾個 Flutter 里的常見操作。
在 Flutter 里,使用 Navigator 來管理頁面跳轉(zhuǎn),比如要跳轉(zhuǎn)到一個 NewPage 可以這樣寫:
進(jìn)棧使用 push,出棧則是 pop。
使用 MaterialPageRoute 會模擬出 Android 上頁面跳轉(zhuǎn)的過場效果。
我們來看看怎么顯示一張本地圖片。
先在根目錄新建一個存放圖片的文件夾,比如叫 images,把圖片 picture.png 放進(jìn)去。
找到根目錄下的 pubspec.yaml 文件,這個便是 Flutter 依賴配置文件,我們需要在這里配置一下剛才的圖片:
這樣,我們就能使用 Image 控件把這張圖片顯示出來了:
和 node 的 npm 以及 Android 的 jcenter 類似,F(xiàn)lutter 也擁有一個公共倉庫 pub.dev。pub.dev 是 Google 官方的 Dart 倉庫,在上面可以找到我們需要的包和插件。
Flutter 本身沒有 Toast,我們來接入一個。在 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 開頭。我們把計時器頁面里的控件替換一下:
效果如下:
代碼的部分就到這里了,接下來跟大家聊一下編譯方式,編程語言的編譯方式有兩種。
關(guān)于它們孰優(yōu)孰劣,就要看從哪個角度去對比了。JIT 的話,它的一大特點(diǎn)就是支持動態(tài)發(fā)布代碼,也就是支持熱更新。但要是從性能的角度考慮,AOT 會更好,因?yàn)樵谶\(yùn)行的時候不用再進(jìn)行編譯的操作的,運(yùn)行的效率會更高一些。
回到我們一開始的時候留下的問題,為什么別的跨平臺方案都是用 JavaScript,而 Flutter 要用 Dart 來開發(fā)。JavaScript 的編譯方式是 JIT 的,它不支持 AOT。而 Dart 同時支持 JIT 和 AOT。
Flutter 在開發(fā)階段使用 JIT,讓我們用上了熱重載,增加了開發(fā)效率。在打包時改用 AOT,保證了正式版應(yīng)用的性能。
最后講一下大家比較關(guān)心的一個東西,F(xiàn)lutter 是否支持熱更新?前面說到 Dart 支持 JIT,所以從技術(shù)層面它是支持的。但是目前是不支持的,在官方的計劃文檔中,可以看到:
至于原因,官方在這里進(jìn)行了說明??偟膩碚f,是由于政策的限制,以及出于對性能和安全性的考慮,暫時不支持了。
到這就結(jié)束啦。由于想把 Flutter 基礎(chǔ)在一篇內(nèi)講完,沒有涉及太多細(xì)節(jié),如果要寫 Flutter 代碼還需要深入學(xué)習(xí)。但相信理解之后再學(xué),會輕松很多。
Flutter初學(xué) —— 常用控件使用
在編寫幾個 Flutter 項(xiàng)目后,發(fā)現(xiàn) Flutter 的強(qiáng)大之處在于業(yè)務(wù)中所有用到的控件以及場景都有對應(yīng)的處理方案;而 Dart 語言也與 Java 、 Kotlin 類似,所以對 Android 開發(fā)者來說門檻非常低;特意記錄一下常用的控件及其使用:
StatelessWidget 不需要額外的創(chuàng)建 State
StatefulWidget 創(chuàng)建 State 類,并可以在其中保存一些狀態(tài)
only 可以單獨(dú)設(shè)置每個方向的內(nèi)邊距
類似于 LinearLayout 中的 orientation 設(shè)置為 vertical , mainAxisAlignment 表示豎向的一個對齊方式, crossAxisAlignment 表示橫向的對齊方式
與 Column 相反,主軸是橫向,對齊方式類似, crossAxisAlignment 表示豎向的對齊方式
類似 SizedBox ,一個容器,但是主要功能是有一個 decoration —— 裝飾器,作用是繪制背景,或者使用 item 中的陰影
棧,先入后出,類似于 Android 上的 FrameLayout
通常配合 Stack 使用,固定顯示在某一個位置
配合多 child 使用,會填充剩余的空間
Image 功能強(qiáng)大,使用不同的方法可以加載不同來源的圖片
看到這些方法,突然覺得 Flutter 太香了,而且 Image 可以配置 clip 等裁剪出不同形狀的圖片,無論是圓形還是五角星都不在話下,然而 Android 要實(shí)現(xiàn)不規(guī)則的形狀,可是要下不少功夫的。
名字和 Android 的一模一樣,但是用法卻比 Android 的簡單很多:
主要就是 itemCount 與 itemBuilder ,其余就是配置樣式, itemBuilder 需要返回一個 widget ,當(dāng)然了,每個 ListView 都有其對應(yīng)的 item ,在里面的方法中編寫 widget 即可
與 ListView 類似,但是需要有一個 delegate 類,作用是設(shè)置有多少列,每一列之間的間距是多少
GridView 沒有 build , children 表示所有的子 view
最常用的控件之一,有非常多的樣式, Flutter 中通常是使用裝飾器來處理控件的,如背景使用 BoxDecoration , TextFiled 使用 InputDecoration ; 使用如下
文章題目:flutter下部件,flutter 控件庫
標(biāo)題來源:http://www.dlmjj.cn/article/hodjcp.html