Flutter 知識點

Flutter:一個移動應用開發框架,它使用 Dart、C++、Skia 開發,對外提供了徹底不依賴系統平臺的 Widget 的能力,只經過自繪圖形的方式工做,具備極其優秀的跨平臺性。目前已經支持了 iOS、Android、Fuchsia。web

macOS 下,安卓模擬器的進程名爲:sdkqemu-system-i386,可在任務管理器強行關閉。編程

若是提示:Please configure Android SDK,須要將 ANDROID_HOME 環境變量設置爲相應的 SDK 安裝目錄app

構建UI界面的邏輯在build方法中框架

Scaffold 是Material庫中提供的頁面腳手架,它包含導航欄和Body以及FloatingActionButton(若是須要的話)異步

路由(Route)在Android中一般指一個Activity,在iOS中指一個ViewController。ide

在原生開發中,Android使用Gradle來管理依賴,iOS用Cocoapods或Carthage來管理依賴。
而 Flutter 使用配置文件 pubspec.yaml(位於項目根目錄)來管理第三方依賴包。佈局

在構建期間,Flutter將asset放置到稱爲 asset bundle 的特殊存檔中,應用程序能夠在運行時讀取它們(但不能修改)。測試

聲明分辨率相關的圖片 assets:
AssetImage 能夠將asset的請求邏輯映射到最接近當前設備像素比例(dpi)的asset。爲了使這種映射起做用,必須根據特定的目錄結構來保存asset。字體

注意,AssetImage 並不是是一個widget, 它其實是一個ImageProvider,有些時候你可能指望直接獲得一個顯示圖片的widget,那麼你可使用Image.asset()方法。ui

依賴包中的資源圖片

要加載依賴包中的圖像,必須給AssetImage提供package參數。
例如,假設您的應用程序依賴於一個名爲「my_icons」的包,它具備以下目錄結構:

…/pubspec.yaml
…/icons/heart.png
…/icons/1.5x/heart.png
…/icons/2.0x/heart.png
…etc.

而後加載圖像,使用:

new AssetImage('icons/heart.png', package: 'my_icons')

new Image.asset('icons/heart.png', package: 'my_icons')

注意:包在使用自己的資源時也應該加上package參數來獲取。

Dart分析器大量使用了代碼中的類型註釋來幫助追蹤問題。咱們鼓勵您在任何地方使用它們(避免var、無類型的參數、無類型的列表文字等),由於這是追蹤問題的最快的方式。

可使用 debugger() 語句插入編程式斷點。要使用這個,你必須添加 import 'dart:developer'; 到相關文件頂部;debugger()語句採用一個可選when參數。

微任務一般來源於Dart內部,而且微任務很是少。
值得注意的是,咱們能夠經過Future.microtask(…)方法向微任務隊列插入一個任務。

在事件循環中,當某個任務發生異常並無被捕獲時,程序並不會退出,而直接致使的結果是當前任務的後續代碼就不會被執行了,也就是說一個任務中的異常是不會影響其它任務執行的。

Flutter 中真正表明屏幕上顯示元素的類是 Element,Widget 只是 Element 的配置數據。而且一個Widget能夠對應多個Element。

Key: 這個key屬性相似於React/Vue中的key,主要的做用是決定是否在下一次build時複用舊的widget,決定的條件在canUpdate()方法中。

didChangeDependencies()、didUpdateWidget()

  1. didChangeDependencies():當State對象的依賴發生變化時會被調用;例如:在以前build() 中包含了一個InheritedWidget,而後在以後的build() 中InheritedWidget發生了變化,那麼此時InheritedWidget的子widget的didChangeDependencies()回調都會被調用。典型的場景是當系統語言Locale或應用主題改變時,Flutter framework會通知widget調用此回調。
  2. didUpdateWidget():在widget從新構建時,Flutter framework會調用Widget.canUpdate來檢測Widget樹中同一位置的新舊節點,而後決定是否須要更新,若是Widget.canUpdate返回true則會調用此回調。正如以前所述,Widget.canUpdate會在新舊widget的key和runtimeType同時相等時會返回true,也就是說在在新舊widget的key和runtimeType同時相等時didUpdateWidget()就會被調用。

deactivate()、dispose()

  1. deactivate():當State對象從樹中被移除時,會調用此回調。在一些場景下,Flutter framework會將State對象從新插到樹中,如包含此State對象的子樹在樹的一個位置移動到另外一個位置時(能夠經過GlobalKey來實現)。若是移除後沒有從新插入到樹中則緊接着會調用dispose()方法。
  2. dispose():當State對象從樹中被永久移除時調用;一般在此回調中釋放資源。

Flutter提供了一套豐富、強大的基礎widget,在基礎widget庫之上Flutter又提供了一套Material風格(Android默認的視覺風格)和一套Cupertino風格(iOS視覺風格)的widget庫。要使用基礎widget庫,須要先導入:

import 'package:flutter/widgets.dart';

因爲Material和Cupertino都是在基礎widget庫之上的,因此若是你的應用中引入了這二者之一,則不須要再引入flutter/widgets.dart了,由於它們內部已經引入過了。

基礎widget

  1. Text:該 widget 可以讓您建立一個帶格式的文本。
  2. Row、 Column: 這些具備彈性空間的佈局類Widget可以讓您在水平(Row)和垂直(Column)方向上建立靈活的佈局。其設計是基於web開發中的Flexbox佈局模型。
  3. Stack: 取代線性佈局 (譯者語:和Android中的FrameLayout類似),Stack容許子 widget 堆疊, 你可使用 Positioned 來定位他們相對於Stack的上下左右四條邊的位置。Stacks是基於Web開發中的絕對定位(absolute positioning )佈局模型設計的。
  4. Container: Container 可以讓您建立矩形視覺元素。container 能夠裝飾一個BoxDecoration, 如 background、一個邊框、或者一個陰影。 Container 也能夠具備邊距(margins)、填充(padding)和應用於其大小的約束(constraints)。另外, Container可使用矩陣在三維空間中對其進行變換。

Text

  1. textAlign:文本的對齊方式;能夠選擇左對齊、右對齊仍是居中。注意,對齊的參考系是Text widget自己。本例中雖然是指定了居中對齊,但由於Text文本內容寬度不足一行,Text的寬度和文本內容長度相等,那麼這時指定對齊方式是沒有意義的,只有Text寬度大於文本內容長度時指定此屬性纔有意義。
  2. textScaleFactor:表明文本相對於當前字體大小的縮放因子,相對於去設置文本的樣式style屬性的fontSize,它是調整字體大小的一個快捷方式。該屬性的默認值能夠經過MediaQueryData.textScaleFactor得到,若是沒有MediaQuery,那麼會默認值將爲1.0。
  3. height:該屬性用於指定行高,但它並非一個絕對值,而是一個因子,具體的行高等於fontSize*height。
  4. fontSize:該屬性和Text的textScaleFactor都用於控制字體大小。可是有兩個主要區別:
  • fontSize能夠精確指定字體大小,而textScaleFactor只能經過縮放比例來控制。
  • textScaleFactor主要是用於系統字體大小設置改變時對Flutter應用字體進行全局調整,而fontSize一般用於單個文本。

在Flutter中使用字體分兩步完成。首先在pubspec.yaml中聲明它們,以確保它們會打包到應用程序中。而後經過TextStyle屬性使用字體。

按鈕:有一個onPressed屬性來設置點擊回調,當按鈕按下時會執行該回調,若是不提供該回調則按鈕會處於禁用狀態,禁用狀態不響應用戶點擊。

使用自定義字體圖標:在Flutter中,使用iconfont.cn上ttf格式的字體文件便可

容器的大小能夠經過width、height屬性來指定,也能夠經過constraints來指定,若是同時存在時,width、height優先。實際上Container內部會根據width、height來生成一個constraints。

Material Design 設計規範中有些是不能自定義的,如導航欄高度,ThemeData只包含了可自定義部分。

若是不想讓某個子樹響應PointerEvent的話,咱們可使用IgnorePointer和AbsorbPointer,這兩個Widget都能阻止子樹接收指針事件,不一樣之處在於AbsorbPointer自己會參與命中測試,而IgnorePointer自己不會參與,這就意味着AbsorbPointer自己是能夠接收指針事件的(但其子樹不行),而IgnorePointer不能夠。

GestureDetector內部是使用一個或多個GestureRecognizer來識別各類手勢的,而GestureRecognizer的做用就是經過Listener來將原始指針事件轉換爲語義手勢,GestureDetector直接能夠接收一個子Widget。GestureRecognizer是一個抽象類,一種手勢的識別器對應一個GestureRecognizer的子類。

在Flutter中自定義Widget有三種方式:經過組合其它Widget、自繪和實現RenderObject。
自繪:Flutter中提供了CustomPaint和Canvas供咱們自繪UI外觀。

際上Flutter提供的全部Widget最終都是調用Canvas繪製出來的。

經過HttpClient設置的header,對整個httpClient都生效;而經過HttpClientRequest設置的header,只對當前請求生效。

與Future返回單個異步響應不一樣,Stream類能夠隨着時間推移傳遞不少事件。

運行flutter build apk後,打包文件的路徑:build/app/outputs/apk/release/app-release.apk

相關文章
相關標籤/搜索