學(xué)Flutter就和學(xué)iOS一樣,先學(xué)基本語言語法的使用,再學(xué)習(xí)搭UI,iOS是OC和Swift,F(xiàn)lutter么就是Dart,語言學(xué)多了語法都差球不多,特別是這些新的語言,很多東西都是相似的,但是長時間不用容易忘記,與其每次去網(wǎng)上瞎jb找,不如自己總結(jié)一些,以后看自己寫的東西就行了。文中個別結(jié)論是我自己總結(jié)出來的,不能保證準(zhǔn)確性,看到的同學(xué)僅供參考。
距上次寫文章也有一段時間了,本來打算去掘金重新開始的,因為感覺自己之前在簡書寫的這些東西技術(shù)含量太低了,后來因為簡書把我保存的草稿莫名其妙丟失了,加上百度出來的答案還是以簡書居多,決定還是待在這吧,雖然簡書這個環(huán)境大不如從前了,但是現(xiàn)在寫東西更多的是自己記錄和梳理的一個過程,還沒達到給別人指導(dǎo)的水平,和之前寫的文章對比對比,也算是記錄一段開發(fā)的心路歷程。
本章提綱:
1.變量定義
2.基本數(shù)據(jù)類型
3.集合類型及其相關(guān)操作
main函數(shù)
1.Dart語言也需要有一個main函數(shù)作為入口,該函數(shù)接收一個List類型的參數(shù),目前不知道有啥用,后期知道了再補充吧,這個main函數(shù)沒有返回值。
main(List<String> args) {
print('Hello World');
}
變量定義
1.定義變量有兩種方式,顯示申明和類型推斷,變量相互賦值的時候也會進行類型檢查,int和float不能相互賦值,這個和Swift相似。
2.字符串用單引號和雙引號都可以,字符串和其他變量或表達式拼接用${expression},如果表達式是一個標(biāo)識符,那么{}可以省略,查看一個變量的具體類型用runtimeType。
var name = 'tong';
print(name.runtimeType); // String
var a = 1;
print('num is $a');//num is 1
3.var就是基本的申明一個變量,不多講,dynamic感覺和OC里的id修飾的變量一樣,就是告訴編譯器不做靜態(tài)類型檢查了,反正怎么用都行,但是在運行的時候如果類型不匹配就可能產(chǎn)生問題。
//顯示聲明變量
String name = 'tong';
int i = 1;
float = 1.0;
//類型推導(dǎo)聲明變量,幾個關(guān)鍵字后面再講
var/dynamic/const/final name = xx;
4.const和final都是用來定義常量的,主要講一下區(qū)別,const修飾的變量值必須是在編譯期間就確定的值,你不能賦給它一個運行期間才能得到的值,而final可以。另外const放在賦值語句的右邊,可以共享對象,提高性能,這個后邊再補充。
String getName() {
return 'tong';
}
main(List<String> args) {
const name = getName(); // 錯誤的做法, 因為要執(zhí)行函數(shù)才能獲取到值
final name = getName(); // 正確的做法
}
5.Dart 沒有 public、private、protected 這些關(guān)鍵字,變量名以"_"開頭意味著對它的 lib 是私有的。
基本數(shù)據(jù)類型
1.基本數(shù)據(jù)類型常用的就int,double,和NSInteger和CGFloat一樣,他們可表示的精度范圍是根據(jù)平臺變化的。
2.字符串和數(shù)字之間的轉(zhuǎn)換,有幾個方法,直接上代碼:
// 字符串和數(shù)字轉(zhuǎn)化
// 1.字符串轉(zhuǎn)數(shù)字
var one = int.parse('111');
var two = double.parse('12.22');
print('${one} ${one.runtimeType}'); // 111 int
print('${two} ${two.runtimeType}'); // 12.22 double
// 2.數(shù)字轉(zhuǎn)字符串
var num1 = 123;
var num2 = 123.456;
var num1Str = num1.toString();
var num2Str = num2.toString();
var num2StrD = num2.toStringAsFixed(2); // 保留兩位小數(shù)
print('${num1Str} ${num1Str.runtimeType}'); // 123 String
print('${num2Str} ${num2Str.runtimeType}'); // 123.456 String
print('${num2StrD} ${num2StrD.runtimeType}'); // 123.46 String
3.布爾類型true和false,不能用非0或者非空判斷真假,if條件判斷的時候必須使用布爾類型,這個和Swift一樣。
枚舉類型
枚舉類型中有兩個比較常見的屬性:
index:用于表示每個枚舉常量的索引,從0開始。
values:包含每個枚舉值的List。
main(List<String> args) {
print(Colors.red.index);
print(Colors.green.index);
print(Colors.blue.index);
print(Colors.values);
}
enum Colors {
red,
green,
blue
}
集合類型
1.集合類型Dart內(nèi)置三種List / Set / Map,其中,List可以這樣來定義:
// List定義
// 1.使用類型推導(dǎo)定義
var letters = ['a', 'b', 'c', 'd'];
print('$letters ${letters.runtimeType}');//[a, b, c, d] List<String>
// 2.明確指定類型
List<int> numbers = [1, 2, 3, 4];
print('$numbers ${numbers.runtimeType}');//[1, 2, 3, 4] List<int>
Set可以這樣來定義:
其實,也就是把[]換成{}就好了。
Set和List最大的兩個不同就是:Set是無序的,并且元素是不重復(fù)的。
// Set的定義
// 1.使用類型推導(dǎo)定義
var lettersSet = {'a', 'b', 'c', 'd'};
print('$lettersSet ${lettersSet.runtimeType}');//{a, b, c, d} _CompactLinkedHashSet<String>
// 2.明確指定類型
Set<int> numbersSet = {1, 2, 3, 4};
print('$numbersSet ${numbersSet.runtimeType}');//{1, 2, 3, 4} _CompactLinkedHashSet<int>
最后,Map是我們常說的字典類型,它的定義是這樣的:
// Map的定義
// 1.使用類型推導(dǎo)定義
var infoMap1 = {'name': 'tong', 'age': 18};
print('$infoMap1 ${infoMap1.runtimeType}');//{name: tong, age: 18} _InternalLinkedHashMap<String, Object>
// 2.明確指定類型
Map<String, Object> infoMap2 = {'height': 1.88, 'address': '北京市'};
print('$infoMap2 ${infoMap2.runtimeType}');//{height: 1.88, address: 北京市} _InternalLinkedHashMap<String, Object>
集合操作
1.獲取集合長度,用length屬性:
// 獲取集合的長度
print(letters.length);
print(lettersSet.length);
print(infoMap1.length);
2.集合添加/刪除/包含操作:
// 添加/刪除/包含元素
numbers.add(5);//向List中添加數(shù)字5
numbersSet.add(5);//向Set中添加數(shù)字5
numbers.remove(1);//刪除List中的數(shù)字1
numbersSet.remove(1);
// List根據(jù)index刪除元素
numbers.removeAt(3);
print(numbers.contains(2));//判斷List是否包含數(shù)字2
print(numbersSet.contains(2));
3.Map相關(guān)操作
var infoMap1 = {'name': 'tong', 'age': 18};
// Map的操作
// 1.根據(jù)key獲取value
print('${infoMap1.entries} ${infoMap1.entries.runtimeType}'); // (MapEntry(name: tong), MapEntry(age: 18)) MappedIterable<String, MapEntry<String, Object>>
// 2.獲取所有的entries
print(infoMap1.entries); // (MapEntry(name: tong), MapEntry(age: 18))
// 3.獲取所有的keys
print('${infoMap1.keys} ${infoMap1.keys.runtimeType}'); // (name, age) _CompactIterable<String>
// 4.獲取所有的values
print('${infoMap1.values} ${infoMap1.values.runtimeType}'); // (tong, 18) _CompactIterable<Object>
// 5.判斷是否包含某個key或者value
print('${infoMap1.containsKey('age')} ${infoMap1.containsValue(18)}'); // true true
// 6.根據(jù)key刪除元素
infoMap1.remove('age');
print('${infoMap1}'); // {name: tong}