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()方法中。
Flutter提供了一套豐富、強大的基礎widget,在基礎widget庫之上Flutter又提供了一套Material風格(Android默認的視覺風格)和一套Cupertino風格(iOS視覺風格)的widget庫。要使用基礎widget庫,須要先導入:
import 'package:flutter/widgets.dart';
因爲Material和Cupertino都是在基礎widget庫之上的,因此若是你的應用中引入了這二者之一,則不須要再引入flutter/widgets.dart了,由於它們內部已經引入過了。
在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