真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網站制作重慶分公司

flutter重要概念,flatter和flutter

Flutter 之 可滾動組件 -- 理論知識點(十四)

Flutter 中有兩種布局模型:

創(chuàng)新互聯(lián)建站2013年至今,是專業(yè)互聯(lián)網技術服務公司,擁有項目網站設計制作、做網站網站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元大姚做網站,已為上家服務,為大姚各地企業(yè)和個人服務,聯(lián)系電話:028-86922220

基于 RenderBox 的盒模型布局。

基于 Sliver ( RenderSliver ) 按需加載列表布局。

通??蓾L動組件的子組件可能會非常多、占用的總高度也會非常大;如果要一次性將子組件全部構建出將會非常昂貴!為此,F(xiàn)lutter中提出一個Sliver(中文為“薄片”的意思)概念,Sliver 可以包含一個或多個子組件。Sliver 的主要作用是配合:加載子組件并確定每一個子組件的布局和繪制信息,如果 Sliver 可以包含多個子組件時,通常會實現(xiàn)按需加載模型。

只有當 Sliver 出現(xiàn)在視口中時才會去構建它,這種模型也稱為“基于Sliver的列表按需加載模型”??蓾L動組件中有很多都支持基于Sliver的按需加載模型,如 ListView 、 GridView ,但是也有不支持該模型的,如 SingleChildScrollView 。

Flutter 中的可滾動主要由三個角色組成: Scrollable 、 Viewport 和 Sliver :

具體布局過程:

比如有一個 ListView,大小撐滿屏幕,假設它有 100 個列表項(都是RenderBox)且每個列表項高度相同,結構如圖6-1所示:

圖中白色區(qū)域為設備屏幕,也是 Scrollable 、 Viewport 和 Sliver 所占用的空間,三者所占用的空間重合,父子關系為:Sliver 父組件為 Viewport,Viewport的 父組件為 Scrollable 。注意ListView 中只有一個 Sliver,在 Sliver 中實現(xiàn)了子組件的按需加載。

其中頂部和底部灰色的區(qū)域為 cacheExtent,它表示預渲染的高度,需要注意這是在可視區(qū)域之外,如果 RenderBox 進入這個區(qū)域內,即使它還未顯示在屏幕上,也是要先進行構建的,預渲染是為了后面進入 Viewport 的時候更絲滑。cacheExtent 的默認值是 250,在構建可滾動列表時我們可以指定這個值,這個值最終會傳給 Viewport。

用于處理滑動手勢,確定滑動偏移,滑動偏移變化時構建 Viewport,我們看一下其關鍵的屬性:

在可滾動組件的坐標描述中,通常將滾動方向稱為主軸,非滾動方向稱為縱軸。由于可滾動組件的默認方向一般都是沿垂直方向,所以默認情況下主軸就是指垂直方向,水平方向同理。

Viewport 比較簡單,用于渲染當前視口中需要顯示 Sliver。

需要注意的是:

Sliver 主要作用是對子組件進行構建和布局,比如 ListView 的 Sliver 需要實現(xiàn)子組件(列表項)按需加載功能,只有當列表項進入預渲染區(qū)域時才會去對它進行構建和布局、渲染。

Sliver 對應的渲染對象類型是 RenderSliver,RenderSliver 和 RenderBox 的相同點是都繼承自 RenderObject 類,不同點是在布局的時候約束信息不同。RenderBox 在布局時父組件傳遞給它的約束信息對應的是 BoxConstraints ,只包含最大寬高的約束;而 RenderSliver 在布局時父組件(列表)傳遞給它的約束是對應的是 SliverConstraints 。關于 Sliver 的布局協(xié)議,我們將在本章最后一節(jié)中介紹。

幾乎所有的可滾動組件在構造時都能指定 scrollDirection (滑動的主軸)、 reverse (滑動方向是否反向)、 controller 、 physics 、 cacheExtent ,這些屬性最終會透傳給對應的 Scrollable 和 Viewport,這些屬性我們可以認為是可滾動組件的通用屬性,后續(xù)再介紹具體的可滾動組件時將不再贅述。

可滾動組件都有一個 controller 屬性,通過該屬性我們可以指定一個 ScrollController 來控制可滾動組件的滾動,比如可以通過ScrollController來同步多個組件的滑動聯(lián)動。由于 ScrollController 是需要結合可滾動組件一起工作,所以本章中,我們會在介紹完 ListView 后詳細介紹 ScrollController。

Scrollbar是一個Material風格的滾動指示器(滾動條),如果要給可滾動組件添加滾動條,只需將Scrollbar作為可滾動組件的任意一個父級組件即可,如:

Scrollbar 和 CupertinoScrollbar 都是通過監(jiān)聽滾動通知來確定滾動條位置的。關于的滾動通知的詳細內容我們將在本章最后一節(jié)中專門介紹。

CupertinoScrollbar是 iOS 風格的滾動條,如果你使用的是Scrollbar,那么在iOS平臺它會自動切換為CupertinoScrollbar

離不開DART的Flutter(dart篇)

hello world例子

在終端打印字符串‘Hello World!’

計算斐波那契數(shù)列

一個簡單的類

計算兩點距離

異步并發(fā)示例

使用了Isolate

1.面向對象

對于面向對象這個概念,相信了解Java的同學對這個概念一定不會陌生。

例如:我們有個Person Object他有很多特征和行為。

這些都是這個Person Object的屬性。

也就是因為有了這些特征,行為等等才決定了這個人是誰。

那么回到Dart當中,所有的都是對象,那么在就可以可以跟進對象的屬性的特征,方法等等來進行編程。

之所以我們在這里又特別強調了一下面向對象的概念,是因為這個概念在Dart語言當中,至關重要!

2.最重要的幾個概念

3.Dart的部分特性

4.Dart的內置庫

包名

描述

dart:asynv

異步編程,提供Future,Stream類

dart:collection

集合

dart:convert

不同類型的字符編碼解碼

dart:core

Dart語言核心功能,內置類型

dart:html

網頁開發(fā)用到的庫

dart:io

文件讀寫,IO相關

dart:math

數(shù)字常量以及函數(shù),隨機算法等

dart:svg

事件和動畫矢量圖支持

綜上述所說要想學Flutter,先學Dart!關于Flutter下篇我會講到。為什么離不開dart!

有關更多面經、核心技術筆記;自己也是從事Android開發(fā)5年有余了;整理了一些Android開發(fā)技術核心筆記和面經題綱, 如有需要的同學請私信我回復“核心筆記”或“面試”領??!

Flutter了解之可滑動組件

Flutter官方并沒有對Widget進行官方分類,對其分類主要是為了對Widget進行功能區(qū)分。

當組件內容超過當前顯示窗口時,如果沒有特殊處理,F(xiàn)lutter則會提示Overflow錯誤。為此,F(xiàn)lutter提供了多種可滾動組件用于顯示列表和長布局。

在可滾動組件的坐標描述中,通常將滾動方向稱為主軸,非滾動方向稱為縱軸。由于可滾動組件的默認方向一般都是沿垂直方向,所以默認情況下主軸就是指垂直方向,水平方向同理。

通常可滾動組件的子組件可能會非常多、占用的總高度也會非常大;如果要一次性將子組件全部構建出將會非常昂貴!為此,F(xiàn)lutter中提出一個Sliver(中文為“薄片”的意思)概念,如果一個可滾動組件支持Sliver模型,那么該滾動可以將子組件分成好多個“薄片”(Sliver),只有當Sliver出現(xiàn)在視口中時才會去構建它,這種模型也稱為“基于Sliver的延遲構建模型”。

可滾動組件中有很多都支持基于Sliver的延遲構建模型,如ListView、GridView,但是也有不支持該模型的,如SingleChildScrollView。

在很多布局系統(tǒng)中都有ViewPort的概念,在Flutter中,術語ViewPort(視口),如無特別說明,則是指一個Widget的實際顯示區(qū)域。例如: 一個ListView的顯示區(qū)域高度是800像素,雖然其列表項總高度可能遠遠超過800像素,但是其ViewPort仍然是800像素。

可滾動組件都直接或間接包含一個Scrollable組件

如果要給可滾動組件添加滾動條,只需將Scrollbar作為可滾動組件的任意一個父級組件。

沿一個方向線性排布所有子組件。支持基于Sliver的延遲構建模型。

ListView高度邊界無法確定時會異常。

默認構造函數(shù)有一個children參數(shù),它接受一個Widget列表。

實際上通過此方式創(chuàng)建的ListView和使用SingleChildScrollView+Column的方式沒有本質的區(qū)別。

適合只有少量的子組件的情況,因為這種方式需要將所有children都提前創(chuàng)建好(這需要做大量工作),而不是等到子widget真正顯示的時候再創(chuàng)建,也就是說通過默認構造函數(shù)構建的ListView沒有應用基于Sliver的懶加載模型。

例(水平滾動)

適合列表項比較多(或者無限)的情況,因為只有當子組件真正顯示的時候才會被創(chuàng)建,也就說通過該構造函數(shù)創(chuàng)建的ListView是支持基于Sliver的懶加載模型的。

例(不同類型的item)

ListView.separated可以在生成的列表項之間添加一個分割組件,它比ListView.builder多了一個separatorBuilder參數(shù),該參數(shù)是一個分割組件生成器。

類似于Android中的ScrollView,它只能接收一個子組件。

通常內容不會超過屏幕太多時使用SingleChildScrollView,這是因為它不支持基于Sliver的延遲實例化模型,所以如果預計視口可能包含超出屏幕尺寸太多的內容時,那么使用SingleChildScrollView將會非常昂貴(性能差),此時應該使用一些支持Sliver延遲加載的可滾動組件,如ListView。

例(將大寫字母A-Z沿垂直方向顯示)

一個二維網格列表

GridView和ListView的大多數(shù)參數(shù)都是相同的。

橫軸為固定數(shù)量子元素。

GridView.count構造函數(shù)內部使用了SliverGridDelegateWithFixedCrossAxisCount。

例(GridView.count)

該子類實現(xiàn)了一個橫軸子元素為固定最大長度的layout算法

當子widget比較多時,可以通過GridView.builder來動態(tài)創(chuàng)建子widget。

GridView.builder 必須指定的參數(shù)有兩個,其中itemBuilder為子widget構建器。

舉個例子,假設有一個頁面,頂部需要一個GridView,底部需要一個ListView,而要求整個頁面的滑動效果是統(tǒng)一的,即它們看起來是一個整體。如果使用GridView+ListView來實現(xiàn)的話,就不能保證一致的滑動效果,因為它們的滾動效果是分離的。

所以這時就需要一個"膠水",把這些彼此獨立的可滾動組件"粘"起來,而CustomScrollView的功能就相當于“膠水”。

Sliver有細片、薄片之意,在Flutter中Sliver通常指可滾動組件子元素。在CustomScrollView中,需要粘起來的可滾動組件就是CustomScrollView的Sliver了,如果直接將ListView、GridView作為CustomScrollView是不行的,因為它們本身是可滾動組件而并不是Sliver。

因此,為了能讓可滾動組件能和CustomScrollView配合使用,F(xiàn)lutter提供了一些可滾動組件的Sliver版,如SliverList、SliverGrid等。

實際上Sliver版的可滾動組件和非Sliver版的可滾動組件最大的區(qū)別就是前者不包含滾動模型(自身不能再滾動),而后者包含滾動模型 ,也正因如此,CustomScrollView才可以將多個Sliver"粘"在一起,這些Sliver共用CustomScrollView的Scrollable,所以最終才實現(xiàn)了統(tǒng)一的滑動效果。

例(SliverList)

例(SliverGrid)

可以用ScrollController來控制可滾動組件的滾動位置

滾動位置恢復

ScrollPosition

ScrollController控制原理

滾動監(jiān)聽

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

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

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

WebView 渲染

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

它的優(yōu)點很明顯,使用成熟的前端技術進行開發(fā),學習成本低,開發(fā)效率高,并且支持動態(tài)發(fā)布代碼。

但缺點也很明顯,在性能體驗上,和原生還是存在較大差距的。

原生控件渲染

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

由于使用原生控件進行渲染,性能體驗也會更接近原生。但也只是更接近,和原生還是有差距的,因為它需要頻繁的進行 JavaScript 和原生之間的通信,這個通信效率是比較低的。

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

繪圖引擎渲染

接下來就是主角了。

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

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

一個跨平臺 UI 解決方案

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

繪圖引擎 Skia

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

Android 內置了 Skia,但 iOS 沒有,所以在打 iOS 安裝包的時候,會把 Skia 一起打進去。這就導致了,用同一份 Flutter 代碼打包之后,iOS 的包要比 Android 的包大一些。

開發(fā)語言 Dart

Flutter 使用的開發(fā)語言,叫 Dart。Dart 也是 Google 自家的,它是一門面向對象的語言,從它身上會看到一些其他開發(fā)語言的影子。學習起來難度不大的。

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

這里部分就簡單點帶過了,具體的搭建流程可以在官網查看:

主要的搭建步驟如下:

下載 Flutter SDK

官網下載地址:

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

更新環(huán)境變量

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

安裝開發(fā)工具

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

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

安裝插件

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

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

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

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

啟動一個模擬器,或者連上真機,點擊 Run 運行一下,就能看這樣一個界面了:

具體代碼先混個眼熟就好,具體的后面會再講到。

在寫 Flutter 之前,還要先跟大家簡單介紹一下 Dart 的語法。如果你有 Java 或 JavaScript 的開發(fā)經驗,以及面向對象的編程思想,學起來是很快的。

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

指定類型

var

但和 JavaScript 不同的是,以下代碼在 JavaScript 是不會報錯的,但在 Dart 里會報錯:

Object

如果非要上面這樣寫,那也可以。把 var 換成 Object 就不報錯了:

和 Java 類似,Object 是所有對象的根基類。但是這樣的話,如果想打印一下 num 的字符串長度,是會報錯的:

因為 length 是屬于 String 的,但系統(tǒng)只知道 num 是一個對象,并不知道它是一個 String。

dynamic

如果還是非要這樣寫,那也可以。Dart 有一個特有的關鍵字 dynamic,把 Object 改成 dynamic 就不報錯了:

我們運行一下這個文件,可以在控制臺看到正確打印出了字符串長度。

函數(shù)

dynamic

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

運行之后是能正確打印出字符串長度的。

用于傳參

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

可選參數(shù)

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

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

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

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

異步

Future

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

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

async/await

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

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

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

async 和 await 其實是一個語法糖,它最終也是轉換成 Future 調用鏈的形式執(zhí)行的。

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

在原生開發(fā)里面,我們可能會在界面上區(qū)分,這是一個 View,這是一個 Layout,這是一個 View Controller。但在 Flutter 里面,它們全都屬于一個統(tǒng)一的模型 Widget。可以說,在 Flutter 界面里,所有東西都是 Widget。

以前學面向對象的時候,我們都聽過一句話,叫萬物皆對象。我這里套用一下,在 Flutter 里, 萬物皆控件 。

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

根控件

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

StatefulWidget

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

StatelessWidget

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

容器控件

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

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

布局控件

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

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

基礎控件

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

常用的基礎控件有 Text、TextField、Button、Image 等。

功能控件

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

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

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

運行之后,就可以看到這樣的界面了:

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

StatefulWidget

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

Scaffold

Scaffold 是一個標準的 Material Design 頁面,它包含了標題欄、浮動按鈕、側滑菜單、底部導航欄等配置。我們這里用到了標題欄 appBar、頁面內容 body、浮動按鈕 floatingActionButton。

AppBar

AppBar 就是標題欄,通過查看控件的構造方法,我們可以知道它可配置的屬性。

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

Center

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

FloatingActionButton

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

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

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

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

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

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

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

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

在 Flutter 里,使用 Navigator 來管理頁面跳轉,比如要跳轉到一個 NewPage 可以這樣寫:

進棧使用 push,出棧則是 pop。

使用 MaterialPageRoute 會模擬出 Android 上頁面跳轉的過場效果。

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

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

找到根目錄下的 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 下配置:

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

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

iOS 風格的控件,基本都以 Cupertino 開頭。我們把計時器頁面里的控件替換一下:

效果如下:

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

關于它們孰優(yōu)孰劣,就要看從哪個角度去對比了。JIT 的話,它的一大特點就是支持動態(tài)發(fā)布代碼,也就是支持熱更新。但要是從性能的角度考慮,AOT 會更好,因為在運行的時候不用再進行編譯的操作的,運行的效率會更高一些。

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

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

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

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

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


本文名稱:flutter重要概念,flatter和flutter
網站網址:http://weahome.cn/article/dsgsjep.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部