Flutter是谷歌的移動UI框架沼沈,可以快速在iOS和Android上構(gòu)建高質(zhì)量的原生用戶界面盖奈。 Flutter可以與現(xiàn)有的代碼一起工作拆又。在全世界养晋,F(xiàn)lutter正在被越來越多的開發(fā)者和組織使用偏窝,并且Flutter是完全免費收恢、開源的武学。
Flutter特性:
1.快速開發(fā)
Flutter的熱重載可幫助您快速地進行測試、構(gòu)建UI伦意、添加功能并更快地修復(fù)錯誤火窒。通過將更新的源代碼文件注入正在運行的Dart VM(虛擬機)中工作。這不僅包括添加新類驮肉,還包括向現(xiàn)有類添加方法和字段熏矿,以及更改現(xiàn)有函數(shù)。在iOS和Android模擬器或真機上可以在亞秒內(nèi)重載离钝,并且不會丟失狀態(tài)票编。
2.富有表現(xiàn)力,漂亮的用戶界面
使用Flutter內(nèi)置美麗的Material Design和Cupertino(iOS風(fēng)格)widget卵渴、豐富的motion API慧域、平滑而自然的滑動效果和平臺感知,為您的用戶帶來全新體驗浪读。
3.訪問本地功能和SDK
通過平臺相關(guān)的API昔榴、第三方SDK和原生代碼讓您的應(yīng)用變得強大易用。 Flutter允許您復(fù)用現(xiàn)有的Java瑟啃、Swift或ObjC代碼论泛,訪問iOS和Android上的原生系統(tǒng)功能和系統(tǒng)SDK∮加欤可以使用Flutter作為視圖(View)層屁奏, 并可以使用已經(jīng)用Java / ObjC / Swift完成的部分(Flutter支持混合開發(fā))。
Flutter為什么能跨平臺且高效
首先错负,F(xiàn)lutter 自建了一個繪制引擎坟瓢,底層是由 C++ 編寫的引擎,負責渲染犹撒,文本處理折联,Dart VM 等;上層的 Dart Framework 直接調(diào)用引擎识颊。避免了以往 JS 解決方案的 JS Bridge诚镰、線程跳躍等問題。第二祥款,引擎基于 Skia 繪制清笨,操作 OpenGL、GPU刃跛,不需要依賴原生的組件渲染框架抠艾。第三,Dart 的引入桨昙,是 Flutter 團隊做了很多思考后的決定检号,Dart 有 AOT 和 JIT 兩種模式腌歉,線上使用時以 AOT 的方式編譯成機器代碼,保證了線上運行時的效率齐苛;而在開發(fā)期翘盖,Dart 代碼以 JIT 的方式運行,支持代碼的即時生效(HotReload)脸狸,提高開發(fā)效率最仑。第四,F(xiàn)lutter 的頁面和布局是基于 Widget 樹的方式炊甲,看似不習(xí)慣,但這種樹狀結(jié)構(gòu)解析簡單欲芹,布局卿啡、繪制都可以單次遍歷完成計算,而原生布局往往要往復(fù)多次計算菱父,“simple is fast”的設(shè)計效果颈娜。
Mac環(huán)境配置
1.使用鏡像
export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
2.下載Flutter SDK,添加flutter相關(guān)工具到path中:
export PATH=
pwd
/flutter/bin:$PATH
3.在Android studio中安裝Flutter和dart插件浙宜。
什么是Dart
Dart是Google于2011年發(fā)布的一門開源編程語言官辽,旨在幫助開發(fā)者克服JavaScript的缺點,當然現(xiàn)在Dart已經(jīng)是一門全平臺的語音粟瞬,不僅可以開發(fā)服務(wù)端同仆,現(xiàn)在借助于flutter也可以開發(fā)原生Android應(yīng)用。
語言特性
- Dart所有的東西都是對象裙品, 即使是數(shù)字numbers俗批、函數(shù)function、null也都是對象市怎,所有的對象都繼承自O(shè)bject類岁忘。
- Dart動態(tài)類型語言, 盡量給變量定義一個類型,會更安全区匠,沒有顯示定義類型的變量在 debug 模式下會類型會是 dynamic(動態(tài)的)干像。
- Dart 在 running 之前解析你的所有代碼,指定數(shù)據(jù)類型和編譯時的常量驰弄,可以提高運行速度麻汰。
- Dart中的類和接口是統(tǒng)一的,類即接口揩懒,你可以繼承一個類什乙,也可以實現(xiàn)一個類(接口),自然也包含了良好的面向?qū)ο蠛筒l(fā)編程的支持已球。
- Dart 提供了頂級函數(shù)(如:main())臣镣。
- Dart 沒有 public辅愿、private、protected 這些關(guān)鍵字忆某,變量名以"_"開頭意味著對它的 lib 是私有的点待。
- 沒有初始化的變量都會被賦予默認值 null。
dart語法關(guān)鍵字
變量
- 使用var來定義變量弃舒,變量的類型可以通過變量值推斷出來
var name = "LiBo";
var age = 28;
var height = 1.78;
- 當然了癞埠,也可以使用特定類型來定義變量
String name = "LiBo";
int age = 28;
double height = 1.78;
- 如果變量不限于單個類型,則可以使用dynamic或Object來定義變量
dynamic value = 20;
value = "hello";
Object value2 = 20;
value2 = "hello";
- 變量的默認值:因為變量中的內(nèi)容都是對象聋呢,如果變量聲明出初始值苗踪,那么該變量值就為null
int value1;
bool value2;
var value3;
dynamic value4;
常量
一個final變量只能被設(shè)置一次,而const變量是編譯時常量削锰,定義時必須賦值通铲。
class User {
final name;
static const sign = "我就是我,不一樣的煙火";
User(this.name);
}
內(nèi)置類型
num
dart中的num類型包括int類型和double類型器贩,沒有float類型颅夺。lists
Dart中使用的集合是數(shù)組或有序的對象組。Dart中數(shù)組是List對象蛹稍。
List array = ["user1", "user2", "user"];
運算符
- ?. : 判斷對象是否為null吧黄,如果為null,則返回null唆姐,如果不為null拗慨,則返回該屬性。
class Person {
var name;
Person(this.name);
}
void test() {
Person p;
var name = p?.name;
print("name = $name");
}
as:用來做類型轉(zhuǎn)化
is:判斷對象是否為某個類型
class Banana {
var weight;
Banana(this.weight);
}
class Apple {
var color;
Apple(this.color);
}
getFruit() => Banana(20);
調(diào)用:
var b = getFruit();
if(b is Apple) { //判斷對象是否為Apple類
print("The fruit is an apple");
} else if(b is Banana) { //判斷水果是否為Banana類
print("The fruit is a banana");
}
- ??
String name;
String nickName = name ?? "Nick"; //如果name不為null厦酬,則nickName值為name的值胆描,否則值為Nick
- ..
級聯(lián)操作允許對同一個對象進行一系列操作。
class Student {
var height;
var weight;
Student(this.height, this.weight);
void getHeight() {
print("height = $height");
}
void getWeight() {
print("weight = $weight");
}
}
//同時調(diào)用該對象的多個函數(shù)
Student(175, 65)
..getHeight()
..getWeight();
函數(shù)
Dart是一種真正的面向?qū)ο笳Z言仗阅,因此即使是函數(shù)也是對象并且具有類型Function昌讲。這意味著函數(shù)可以分配給變量或作為參數(shù)傳遞給其他函數(shù)。
main函數(shù)
void main() {
runApp(MyApp());
}
Dart中每個應(yīng)用程序都必須有一個頂級main()函數(shù)减噪,該函數(shù)作為應(yīng)用程序的入口點短绸。
函數(shù)作為參數(shù)
void loadData1() {
}
void loadData2(Function function) {
function();
}
void loadData3() {
loadData2(loadData1());
}