Flutter基礎(chǔ)知識

1,Widget

在 Flutter 中一切的顯示都是 Widget ,包括對齊(alignment),填充(padding)和布局(layout)等,他們都是以widget的形式提供的。 Widget 是一切的基礎(chǔ),利用響應(yīng)式模式進行渲染。

我們可以通過修改數(shù)據(jù),再用setState 設(shè)置數(shù)據(jù),F(xiàn)lutter 會自動通過綁定的數(shù)據(jù)更新 Widget , 所以你需要做的就是實現(xiàn) Widget 界面,并且和數(shù)據(jù)綁定起來。

Widget 分為 有狀態(tài) 和 無狀態(tài) 兩種,在 Flutter 中每個頁面都是一幀,無狀態(tài)就是保持在那一幀,而有狀態(tài)的 Widget 當數(shù)據(jù)更新時,其實是創(chuàng)建了新的 Widget,只是 State 實現(xiàn)了跨幀的數(shù)據(jù)同步保存。

Tip:

這里有個小 Tip ,當代碼框里輸入 stl 的時候,可以自動彈出創(chuàng)建無狀態(tài)控件的模板選項,而輸入 stf 的時,就會彈出創(chuàng)建有狀態(tài) Widget 的模板選項。

2,有狀態(tài)StatefulWidget,State生命周期

initState :初始化,理論上只有初始化一次,第二篇中會說特殊情況下。
didChangeDependencies:在 initState 之后調(diào)用,此時可以獲取其他 State 。
dispose :銷毀,只會調(diào)用一次。

看到?jīng)],F(xiàn)lutter 其實就是這么簡單!你的關(guān)注點只要在:創(chuàng)建你的 StatelessWidget 或者 StatefulWidget 而已。你需要的就是在 build 中堆積你的布局,然后把數(shù)據(jù)添加到 Widget 中,最后通過 setState 改變數(shù)據(jù),從而實現(xiàn)畫面變化。

3,Column、Row 布局

mainAxisAlignment://主軸方向,Column的豎向、Row的橫向
crossAxisAlignment: //副軸方向,Column的橫向、Row的豎向

1,代碼縮進

提示: 將代碼粘貼到應(yīng)用中時,縮進可能會變形。您可以使用Flutter工具自動修復(fù)此問題:

1,Android Studio / IntelliJ IDEA: 右鍵單擊Dart代碼,然后選擇 Reformat Code with dartfmt.
2,VS Code: 右鍵單擊并選擇 Format Document.
3,Terminal: 運行 flutter format <filename>.

2,open ios/Runner.xcworkspace

在你Flutter項目目錄中通過 open ios/Runner.xcworkspace 打開默認的Xcode workspace.

3,運行flutter項目:

flutter run

4,下載依賴包:

flutter packages get

5,開發(fā)依賴項

開發(fā)依賴項是不包含在我們的應(yīng)用程序源代碼中的依賴項,它是開發(fā)過程中的一些輔助工具、腳本,和node中的開發(fā)依賴項相似。

比如要包含json_serializable到我們的項目中,我們需要一個常規(guī)和兩個開發(fā)依賴項:

dependencies:

Your other regular dependencies here

json_annotation: ^2.0.0

dev_dependencies:

Your other dev_dependencies here

build_runner: ^1.0.0
json_serializable: ^2.0.0

6,dependencies和dev_dependencies

dependencies:應(yīng)用或包依賴的其他包或插件。

dev_dependencies:開發(fā)環(huán)境依賴的工具包(而不是Flutter應(yīng)用本身依賴的包)。

dependencies依賴的包將作為APP的源碼的一部分參與編譯,生成最終的安裝包。而dev_dependencies依賴的包只是作為開發(fā)階段的一些工具包,主要用于幫助我們提高開發(fā)和測試效率,比如Flutter的自動化測試包等。

6,平臺通道

由于Flutter本身只是一個UI系統(tǒng),它本身是無法提供一些系統(tǒng)能力,比如使用藍牙、相機、GPS等,因此要在Flutter APP中調(diào)用這些能力就必須和原生平臺進行通信。為此,F(xiàn)lutter中提供了一個平臺通道(platform channel),用于Flutter和原生平臺的通信。平臺通道正是Flutter和原生之間通信的橋梁,它也是Flutter插件的底層基礎(chǔ)設(shè)施。

7,CPU和GPU

CPU和GPU的任務(wù)是各有偏重的,CPU主要用于基本數(shù)學(xué)和邏輯計算,而GPU主要執(zhí)行和圖形處理相關(guān)的復(fù)雜的數(shù)學(xué),如矩陣變化和幾何計算,GPU的主要作用就是確定最終輸送給顯示器的各個像素點的色值。

8,插槽

所謂插槽,就是指預(yù)留的一個接口或位置,這個接口和位置是由其它對象來接入或占據(jù)的,這個接口或位置在軟件中通常用預(yù)留變量來表示。(14.3)

9,vsync

垂直同步信號

10,F(xiàn)PS(Frame Per-Second)

我們之前說的Flutter可以實現(xiàn)60fps,就是指一秒鐘可以觸發(fā)60次重繪,F(xiàn)PS值越大,界面就越流暢。(14.4)

11,全局變量和共享狀態(tài)

全局變量就是單純指會貫穿整個APP生命周期的變量,用于單純的保存一些信息,或者封裝一些全局工具和方法的對象。而共享狀態(tài)則是指哪些需要跨組件或跨路由共享的信息,這些信息通常也是全局變量,而共享狀態(tài)和全局變量的不同在于前者發(fā)生改變時需要通知所有使用該狀態(tài)的組件,而后者不需要。(15.4)

12,dependOnInheritedWidgetOfExactType() 和 getElementForInheritedWidgetOfExactType()的區(qū)別

區(qū)別就是前者會注冊依賴關(guān)系,而后者不會。(7.3)

13,GlobalKey

Flutter還有一種通用的獲取State對象的方法——通過GlobalKey來獲?。?步驟分兩步:

1,給目標StatefulWidget添加GlobalKey。

//定義一個globalKey, 由于GlobalKey要保持全局唯一性,我們使用靜態(tài)變量存儲
static GlobalKey<ScaffoldState> _globalKey= GlobalKey();
...
Scaffold(
    key: _globalKey , //設(shè)置key
    ...  
)

2,通過GlobalKey來獲取State對象

_globalKey.currentState.openDrawer()

GlobalKey是Flutter提供的一種在整個APP中引用element的機制。如果一個widget設(shè)置了GlobalKey,那么我們便可以通過globalKey.currentWidget獲得該widget對象、globalKey.currentElement來獲得widget對應(yīng)的element對象,如果當前widget是StatefulWidget,則可以通過globalKey.currentState來獲得該widget對應(yīng)的state對象。

注意:使用GlobalKey開銷較大,如果有其他可選方案,應(yīng)盡量避免使用它。另外同一個GlobalKey在整個widget樹中必須是唯一的,不能重復(fù)。

14,遇到問題求助:Stack Overflow, GitHub issue

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容