前端開發是否迎來大統一?flutter是否可以勝任原生開發的效能?帶著一個有一個的疑問,去了解flutter。 flutter開發語言上的選擇。為什麼最終使用了dart一個曾經js熱度大增的時刻卻不溫不火的語言。以及dart對現有語言特性優點的吸收。 這裡不講述flutter開發app的優點以及和reactNative、ionic的一些對比。有需要了解到自行百度或者google。
知識簡介
- flutter使用dart語法開發
- flutter開發環境搭建
- fullter一套程式碼多端執行。ios android web 伺服器。
- dart支援型別檢查
- flutter在GitHub上目前有5000+Issues
1.dart語言
- 在Dart中,一切都是物件,一切物件都是class的例項,哪怕是數字型別、方法甚至null都是物件,所有的物件都是繼承自Object
- 雖然Dart是強型別語言,但變數型別是可選的因為Dart可以自動推斷變數型別
- Dart支援範型,List表示一個整型的資料列表,List則是一個物件的列表,其中可以裝任意物件
- Dart支援頂層方法(如main方法),也支援類方法或物件方法,同時你也可以在方法內部建立方法
- Dart支援頂層變數,也支援類變數或物件變數
- 跟Java不同的是,Dart沒有public protected private等關鍵字,如果某個變數以下劃線(_)開頭,代表這個變數在庫中是私有的,具體可以看這裡
- Dart中變數可以以字母或下劃線開頭,後面跟著任意組合的字元或數字
1)資料型別
- numbers 數字型別 可細分為int和double
- strings 字串型別
- booleans 布林型別
- lists(或者是arrays) 資料型別
- maps 鍵值對
- runes(UTF-32字符集的字元)
- symbols
2)變數的宣告
var const final int double String bool List Map等等。
這裡說一下var const final定義變數的區別:
如果你絕不想改變一個變數,使用final或const,不要使用var或其他型別,一個被final修飾的變數只能被賦值一次,一個被const修飾的變數是一個編譯時常量(const常量毫無疑問也是final常量)。可以這麼理解:final修飾的變數是不可改變的,而const修飾的表示一個常量。
注意:例項變數可以是final的但不能是const的 類的靜態屬性是可以使用const的
區別一:final 要求變數只能初始化一次,並不要求賦的值一定是編譯時常量,可以是常量也可以不是。而 const 要求在宣告時初始化,並且賦值必需為編譯時常量。
區別二:final 是惰性初始化,即在執行時第一次使用前才初始化。而 const 是在編譯時就確定值了。
3)函式
- dart程式碼的執行是從主入口函式main開始的。void函式返回值型別,無引數。
//定義函式的形式
void main()=>runStart();
//類似於js的箭頭函式
void main(){
runStart();
}
//和上面是一個意思
複製程式碼
- 函式引數的傳遞 必傳引數和可選引數
//第一個num函式返回值型別,其他是變數的型別 其中a,b,c為必傳引數
num add(num a,num b,num c){
return a+b+c;
}
void main()=>add(1,2,3);
複製程式碼
/**
第一個num函式返回值型別,其他是變數的型別 其中a,b,c為非必傳引數
下面函式為非不傳引數給出了初始值
*/
num add({num a=0,num b=0,num c=0}){
return a+b+c;
}
void main()=>add(a:1,b:2);
複製程式碼
/**
第一個num函式返回值型別,其他是變數的型別 其中a必傳,b和c非必傳引數
下面函式為非不傳引數給出了初始值
*/
num add(num a,{num b=0,num c=0){
return a+b+c;
}
void main()=>add(1,b:1,c:2);
複製程式碼
3)運算子
js有隱式型別轉化和除了0 false null NaN undefied ''為假其他全是真值的特性。 但是dart沒有。dart是強型別語言。
- 算術運算子
int a = 5;
int b = 10;
print(a+b); //15
print(a-b); //-5
print(a*b); 50
print(a/b); 0.5
print(a~/b);0 除以並取整數位
//--和++和% 和其他一樣就不在接列啦
//其中+運算子也可以用於字串拼接和js相同
複製程式碼
- 關係運算子
//dart中沒有===操作符。
//==操作符可以比較不同資料型別的值但是會提示型別不相關
//可以在根目錄下新建analysis_option.yaml檔案 不同型別==就會報錯
//!=和==用法一樣
linter:
rules:
- unrelated_type_equality_checks
analyzer:
error:
unrelated_type_equality_checks: error
/**其餘的還有
>
<
>=
<=
*/
//共的說來不同資料型別的值的比較需要先轉化資料型別才能比較。
複製程式碼
- 邏輯運算子
/**
用於bool型別的值
||或運算子
&&且運算非
!非運算子
*/
print(!false); //true
print(!true); //fasle
複製程式碼
- 賦值運算子 (= | += | -= | ??= )
//這裡面說一下??=運算子
int a = 10;
a??=20;
print(a); //輸出10
int b;
b??=20;
print(b); //輸出20
//??=就是前面的變數沒有值的時候會被賦值
複製程式碼
- 條件表示式
//三目運算子:condition ? expr1 : expe 不在多說都知道
// ??運算子:expr1 ?? expr2
//如果 expr1 為非null,則返回其值; 否則,計算並返回 expr2 的值
print(1??2); //1
print(null??2); //2
print(fasle??2); //false
複製程式碼
4)類
dart語言類和介面是統一的。抽象類不能被例項化。
dart支援泛型
學過java的同學肯定知道。知道ts的同學理解起來也不會很難。有時候發現語言都是有類似的地方。相互借鑑優點。 不懂的就google一下吧。
T getVal<T>(T a){
return a;
}
//這裡面的T就是泛型。沒有指明具體的資料型別。因為有些邏輯是需要複用封裝的。在類中廣泛使用著泛型
複製程式碼
class Person{
String name;
int age;
Person(this.name,this.age);
//可以定義多個建構函式。做不同的處理
Person.create(String name){
this.name = name;
this.age = 10;
}
}
複製程式碼
//類中的範型使用
class A<T>{
T val;
String name;
A(this.val,this.name);
}
class B{
int age;
int sex;
B(this.age,this.sex);
}
main(){
A<B> a=new A<B>(new B(1,2),'b');
print(a);
}
複製程式碼
*** 這裡並沒有列出全部內容,flutter開發中基本夠用。當然這裡附上dart官網文件如有需要可以檢視更多。中文文件和英文官網 ***
2.flutter環境的安裝
這裡以mac安裝為例。windows安裝流程基本一致。
1)flutter SDk安裝
vi ~/.bash_profile
//使用映象加速,把下面新增到環境變數
export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
複製程式碼
vi ~/.bash_profile
//pwd是你的flutter安裝目錄
//flutter安裝之後dart是捆綁安裝的,也可以把dart設定環境變數,方便測試api和學習dart語言
//dart-sdk放在flutter/bin/cache/dart-sdk目錄
export PATH=`pwd`/flutter/bin:$PATH
export PATH=`pwd`/flutter/bin/cache/dart-sdk/bin:$PATH
複製程式碼
修改完之後儲存退出。
source ~/.bash_profile
//之後可以檢視對應版本
flutter --version
dart --version
複製程式碼
2)xcode和Android Studio安裝
xcode可以直接在App store安裝,不多說。
- 下載安裝Android Studio
- 啟動Android Studio,然後執行“Android Studio安裝嚮導”。這將安裝最新的Android SDK,Android SDK平臺工具和Android SDK構建工具,這是Flutter為Android開發時所必需的
- 安裝Plugins flutter
3)flutter doctor
flutter doctor //檢查flutter環境
複製程式碼
出現上面的圖就是環境沒問題,只是沒有連結裝置
open -a Simulator //開啟模擬器
flutter doctor //再次檢查 ok
複製程式碼
一般情況下都會或多或少出現問題,根據報的問題處理。
- cocoapods沒有安裝的常見問題處理
//1.沒安裝browhome,安裝browhome
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
//2、更新,安裝cocoapods
brew update //更新沒安裝browhome
brew install --HEAD libimobiledevice
brew install ideviceinstaller ios-deploy cocoapods //安裝
pod setup //啟動
複製程式碼
到此一般環境沒啥問題,選擇一款自己喜歡的開發工具。我這裡用vscode。vscode需要安裝外掛Flutter ~
建立flutter工程
//前提是開啟裝置或者虛擬裝置
flutter create myapp
cd myapp
flutter run
複製程式碼
準備就緒。。。
之前寫了一個混合開發的android 嵌入flutter 踩坑記錄
flutter開發流程和常用widget以及圖片資源,常用包的安裝使用。東西比較多暫定上中下三篇。感興趣的可以關注一下~