基本的Dart项目
//定义一个函数
printNumber(num aNumber) {
//打印到控制台
print('数字是:$aNumber');
}
//程序从这里开始执行
main(List<String> arguments) {
//声明并初始化一个变量
var number = 42;
//调用一个函数
printNumber(number);
}
代码中用到的知识点如下
//这是一个注释
表示后面是注释,另外还可以使用/*...*/
num
一种类型,其他的内置类型有String、int和bool
42
文字,在编译时是常量
print()
一种方便输出显示的方式
'...'和"..."
一个字符串
$aNumber和${aNumber}
在字符串中插入变量或表达式
main()
入口函数
var
声明一个任意类型的变量
注意:
dart的缩进为两个空格
和java不同,dart没有public、protected和private这些关键字,如果标识符前面加“_”,就是私有变量或者函数
变量
下面的例子创建变量并分配一个值
var name = 'Bob';
默认值
//所有变量最初都是null
int lineCount;
//assert在生产模式下会被忽略,在检查模式下非真就抛出一个异常
assert(lineCount == null);
final和const
如果你不打算改变一个变量,可以使用final和const,它们可以替代任何类型,只能在声明时初始化,且不能改变,const如果在类级要用static const标记成静态常量
final name = 'Bob';
//name = 'Alice'; 执行会出错
final monicker = name + '123';
const bar = 1000000;
//bar = 2000000; 执行会出错
const atm = 1.01325 * bar;
从使用上根本看不出区别,它们的区别在于,const是编译器常量,它的值在编译期就可以确定,final是运行时常量,它的初始值要到编译时才能确定,使用final能让程序启动更快
内置类型
数字
int
整数值,范围通常在-32768到32767之间,num的子类型
int x = 1;
int hex = 0xDEADBEEF;
int bigInt = 34653465834652437659238476592374958739845729;
double
64位双精度浮点数,按照IEEE754的标准,num的子类型
double y = 1.1;
double exponents = 1.42e5;
数字与字符串的转换
//String -> int
int one = int.parse('1');
assert(one == 1);
//String -> double
double 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');
位运算
//0011 << 1 == 0110
assert((3 << 1) == 6);
//0011 >> 1 == 0001
assert((3 >> 1) == 1);
//0011 | 0100 == 0111
assert((3 | 4) == 7);
字符串
dart的字符串是UTF-16编码的序列,可以用单引号或双引号创建字符串
String s1 = 'Single quotes work well for string literals.';
String s2 = "Double quotes work just as well.";
String s3 = 'It\'s easy to escape the string delimiter.';
String s4 = "It's even easier to use the other delimiter.";
使用${expression}在字符串中插入表达式,如果是标识符,可以省略{ },如果要获取对象对应的字符串,可以使用toString()方法
String s = 'string interpolation'
assert('Dart has $s, which is very handy.' ==
'Dart has string interpolation, which is very handy.');
assert('That deserves all caps. ${s.toUpperCase()} is very handy!' ==
'That deserves all caps. STRING INTERPOLATION is very handy!');
使用相邻方式或“+”都可以连接字符串
String s1 = 'String ' 'concatenation' " works even over line breaks.";
assert(s1 == 'String concatenation works even over line breaks.');
String s2 = 'The + operator ' + 'works, as well.';
assert(s2 == 'The + operator works, as well.');
使用三重单引号或三重双引号可以创建多行字符串
String s1 = '''
You can create
multi-line strings like this one.
''';
String s2 = """This is also a
multi-line string.""";
通过加前缀“r”可以创建原始字符串
String s = r"In a raw string, even \n isn't special.";
通过转义可以使用Unicode码
// \u2665 -> ♥
print('Unicode escapes work: \u2665');
布尔值
dart的布尔类型bool,只有两个布尔常量,true和false
String name = 'Bob';
if (name != null) {
print('You have a name!');
}
列表
在dart中,数组是List对象,所以通常叫列表
List list = [1, 2, 3];
列表索引从0开始,是第一个元素,list.length-1是最后一个元素
List list = [1, 2, 3];
assert(list.length == 3);
assert(list[1] == 2);
映射
通常Map是关联key和value的对象,key和value可以是任何对象,key是唯一的,value可以重复
Map gifts = {
//Keys Values
'first' : 'partridge',
'second' : 'turtledoves',
'fifth' : 'golden rings'
};
Map nobleGases = {
//Keys Values
2 : 'helium',
10 : 'neon',
18 : 'argon',
};
可以使用Map构造函数创建和上面相同的对象
Map gifts = new Map();
gifts['first'] = 'partridge';
gifts['second'] = 'turtledoves';
gifts['fifth'] = 'golden rings';
Map nobleGases = new Map();
nobleGases[2] = 'helium';
nobleGases[10] = 'neon';
nobleGases[18] = 'argon';
在现有的Map中添加一个新的键-值对
Map gifts = {'first' : 'partridge'};
//添加一个键-值对
gifts['fourth'] = 'calling birds';
在Map中检索值
Map gifts = {'first' : 'partridge'};
assert(gifts['first'] == 'partridge');
查找不存在的key,会返回null
Map gifts = {'first' : 'partridge'};
assert(gifts['fifth'] == null);
使用.length可以获取Map中键-值对的数量
Map gifts = {'first' : 'partridge'};
gifts['fourth'] = 'calling birds';
assert(gifts.length == 2);