變量
變量的定義:dart中萬物皆對象,包括java中認(rèn)為的基礎(chǔ)數(shù)據(jù)類型也是對象,所以我們初始化任何對象的時候,只要沒賦值,默認(rèn)值都是null(null也是對象)
-
變量的分類(根據(jù)聲明方式,不再細(xì)說有哪些內(nèi)置類型):
String str = "Bob"; //顯示聲明 var str = "Bob"; // 隱式聲明 Object str = "Bob"; //通用對象聲明 dynamic str = 'Bob'; //動態(tài)對象聲明,這里dynamic和Object是等價的,二者可 被賦值為其他類型的對象 final str = "Bob"; //不可變對象 int value ; assert(value == null);
這里需要指出一個不同點,java中成員變量如果是int類型,默認(rèn)情況下會賦值為0,但是dart中萬物皆對象,int類型不賦值的話value的值依然跟其他對象一樣是null。
注意:生產(chǎn)代碼中將忽略assert()調(diào)用。在開發(fā)期間,assert(condition)會拋出異常,除非條件為真
常量和Final
如果您從不打算更改變量,請使用final或const,而不是var或類型。最終變量只能設(shè)置一次;const變量是編譯時常量。(Const變量是隱式最終的。)最終的頂級或類變量在第一次使用時被初始化,對于要成為編譯時常量的變量,請使用const。如果const變量在類級別,則將其標(biāo)記為static const。在聲明變量的地方可以通過關(guān)鍵字const將值設(shè)置為編譯時常量,例如int類型、String字符串類型、const變量以及通過其他變量常量通過算術(shù)運算之后的結(jié)果也可以作為常量
注意:實例變量可以是final,但不能是const(cost只能表示常量),F(xiàn)inal實例變量必須在構(gòu)造函數(shù)體啟動之前初始化最終實例變量 - 在變量聲明,構(gòu)造函數(shù)參數(shù)或構(gòu)造函數(shù)的初始化列表中。
Final變量和Cost常量的聲明
final name = 'Bob'; // Without a type annotation
final String nickname = 'Bobby';
const bar = 1000000; // Unit of pressure (dynes/cm2)
const double atm = 1.01325 * bar; // 這是其他常量算術(shù)結(jié)果賦值為新的常量
const關(guān)鍵字不僅用于聲明常量變量。您還可以使用它來創(chuàng)建常量值,以及聲明創(chuàng)建常量值的構(gòu)造函數(shù)。任何變量都可以具有常量值。
var foo = const [];
final bar = const [];
const baz = []; // Equivalent to `const []`
部分情況下Dart是允許省略const關(guān)鍵字的,比如:

您可以更改非final,非const變量的值,即使它曾經(jīng)有一個const值,但是你不能更改一個被聲明成const的值,比如:
baz = [2,3,4]; //you can't do like this
內(nèi)置類型
Dart語言特別支持以下類型:
- number
- string
- boolean
- list
- map
- rune (用于在字符串中表示Unicode字符)
- symbole
您可以使用文字初始化任何這些特殊類型的對象。
例如,'this is a string'是一個字符串文字,true是一個布爾文字。
因為Dart中的每個變量都是一個對象 、 一個類的實例 -,您通常可以使用構(gòu)造函數(shù)來初始化變量。一些內(nèi)置類型有自己的構(gòu)造函數(shù)。例如,您可以使Map()構(gòu)造函數(shù)來創(chuàng)建Map
Number
Number類型只有兩種形式:int 和 double,比java少多了。
int
整數(shù)值不大于64位,具體取決于平臺,在Dart VM上,值可以是-263到263 - 1.編譯為JavaScript的Dart使用JavaScript編號,允許從-253到253 - 1的值。double 64位(雙精度)浮點數(shù),由IEEE 754標(biāo)準(zhǔn)規(guī)定。
int和double都是num的子類型。
num類型包括基本運算符,如+, - ,/和*,也是你可以找到abs(),ceil()和floor()以及其他方法的地方。(按位運算符,如>>,在int類中定義。)如果num及其子類型沒有您要查找的內(nèi)容,則dart:math庫可能提供你想要的
int 和double可以跟String之間相互轉(zhuǎn)換
// String -> int
var one = int.parse('1');
assert(one == 1);
// String -> double
var onePointOne = double.parse('1.1');
assert(onePointOne == 1.1);
// int -> String
String oneAsString = 1.toString();
assert(oneAsString == '1');
// double -> String
String piAsString = 3.14159.toStringAsFixed(2);
assert(piAsString == '3.14');
int類型指定傳統(tǒng)的按位移位(<<,>>),AND(&)和OR(|)運算符。例如:
assert((3 << 1) == 6); // 0011 << 1 == 0110
assert((3 >> 1) == 1); // 0011 >> 1 == 0001
assert((3 | 4) == 7); // 0011 | 0100 == 0111
String
您可以使用$ {expression}將表達(dá)式的值放在字符串中。如果表達(dá)式是標(biāo)識符,則可以跳過{}。要獲取對應(yīng)于對象的字符串,Dart調(diào)用對象的toString()方法。這點和Koltin很相似
var a = "一"
var b = "個"
print("我是$a個小鴨子");
print('我是${a+b}小鴨子')
你也可以跟java一樣中間用+號來連接兩個字符串
創(chuàng)建多行字符串的另一種方法:使用帶有單引號或雙引號的三重引號:
var s1 = '''
You can create
multi-line strings like this one.
''';
var s2 = """This is also a
multi-line string.""";
這點很贊~直接不用操作符可以換行
你也可以通過前面加個r來輸出原始字符串
//字符串的格式化
var s = r'In a raw string, not even \n gets special treatment.';
print(s);
輸出結(jié)果是:In a raw string, not even \n gets special treatment.
這種把\n換行符直接輸出的方法比java中需要一些轉(zhuǎn)換符才能完整輸出特定的字符的方法好不少!??
List
var list = [1, 2, 3]; //初始化的方式
assert(list.length == 3);
assert(list[1] == 2);
list[1] = 1;
assert(list[1] == 1);
如果要創(chuàng)建一個常量集合(不可變),可以這樣寫
var constantList = const [1, 2, 3];
可能有學(xué)過java的同學(xué)看到[]符號,下意識認(rèn)為是數(shù)組,數(shù)組什么特性?長度定義好了就不可變,只能修改里面的元素值啊,但是Dart等于集合了數(shù)組和List集合的優(yōu)勢,可以通過一些方法來實現(xiàn)增刪改查
var list = [1,2,3];
list.add(4);
print(list.toString());
list.removeAt(0);
print(list.toString());
print(list.contains(2).toString());
/**
上面表達(dá)式輸出的結(jié)果為
[1, 2, 3, 4]
[2, 3, 4]
true
**/
Map
Dart中的map不僅僅跟常規(guī)map一樣可以通過string類型來做key,他的key可以是任何一個object類型
var gifts = {
// Key: Value
'first': 'partridge',
'second': 'turtledoves',
'fifth': 'golden rings'
};
var nobleGases = {
2: 'helium',
10: 'neon',
18: 'argon',
};
你也可以通過構(gòu)造方法來構(gòu)造map
var gifts = Map();
gifts['first'] = 'partridge';
gifts['second'] = 'turtledoves';
gifts['fifth'] = 'golden rings';
var nobleGases = Map();
nobleGases[2] = 'helium';
nobleGases[10] = 'neon';
nobleGases[18] = 'argon';
nobleGases.remove(10); //根據(jù)key來移除鍵值對
注意:您可能希望看到新的Map()而不僅僅是Map()。從Dart 2開始,new關(guān)鍵字是可選的
如果需要創(chuàng)建一個編譯期間的常量map,這樣做
final constantMap = const {
2: 'helium',
10: 'neon',
18: 'argon',
};
Runes(符號文字)
就是可以通過文字轉(zhuǎn)換成符號表情或者代表特定的文字,截取一段官網(wǎng)代碼自行了解

Symbols(不常用,翻譯自官網(wǎng))
Symbol對象表示在Dart程序中聲明的運算符或標(biāo)識符。您可能永遠(yuǎn)不需要使用符號,但它們對于按名稱引用標(biāo)識符的API非常有用,因為縮小會更改標(biāo)識符名稱而不會更改標(biāo)識符符號。要獲取標(biāo)識符的符號,請使用符號文字,它只是#后跟標(biāo)識符:
# radix
#bar