Dart语言简介 Flutter是使用Dart语言开发的。 Dart语言是基于类的纯面向对象语言。 Dart 中的所有东西都是对象,包括数字、函数等,它们都继承自 Object,并且对象的默认值都是 null(包括数字)。 Dart 中类和接口是统一的,类就是接口。 Dart语法和java比较相似,熟悉java开发或者安卓开发会更容易理解Dart语言的语法规范。官宣: Dart语言的语法比JAVA更富有表现力。 总的来说,谷歌的Flutter既然使用Dart语言开发,说明Dart语言在某些方面还是有比其他语言更突出的优势的。安卓开发者应该考虑去熟悉一下。 ① 注释的方式 Dart的文档注释除了有 /** /外 ,还有 /// 。 三斜杠一般单行文档注释使用,多行时每行有个三斜杠效果和/* */ 一样。 推荐使用///作为注释。 Dart的文档注释中可以有markdown的标记语法,有兴趣可以百度下使用方法。
② 变量的声明 可以使用var声明一个变量: var str1 = ‘abc’; 也可以使用具体的类型声明: String str1 = ‘abc’;
用final声明终态变量,不可二次赋值: final String str1 = 'abc';如果声明的变量没有赋值,就始终是null,成员变量也是null int number; 声明量一个成员变量,但是此时number = null; 而不是0。因为number并没有初始化。
> 私有变量的声明:
变量前声明了下划线,代表是私有的,只能在本类中使用。如果未声明私有,就是公有的。 var _list; 代表 _list变量是私有的,只有当前class域可以调用。
需要注意的是: 变量名是 _list,而不是list。③ 字符串的声明和使用 字符串既可以用双引号声明,也可以用单引号声明。 不仅双引号中可以嵌套使用单引号,单引号中也可以嵌套使用双引号。 var str2 = ‘中国’; var str2 = “中国”; var str2 = ‘中国"春节"快到了’; var str2 = “中国’春节’快到了”; 如果要声明的字符串中有单引号,可以外层使用双引号,内层使用单引号。 如果要声明的字符串中有双引号,可以内层使用双引号,外层使用单引号。 一般用单引号声明变量,因为双引号出现在字符串中的频率高一些,所以外层使用单引号。
如果要声明多行的字符串,可以用三引号。所谓的三引号,就是三个单引号或者三个双引号。 var str3 = '''中国 `春节'''; var str3 = """中国 `春节""";这样声明出来的字符串就是换行的。 注意: 三引号的使用会包含编辑器自带的tab对齐标签,一般换行仍可以使用 \n 的形式。 字符串的拼接方式: var str4 = ‘hello’ ‘my’ ‘world’; var str4 = “hello” “my” “world”; var str4 = ‘hello’ + ‘my’ + “world”; // flutter中可以使用加号连接字符串。 字符串拼接除了用加号拼接,还可以直接写在一起。但是要防止有3个单引号或者3个双引号写在一起,写成了多行字符串形式,一般在要拼接的字符串中间加上空格。 字符串拼接变量的方式:
var str5 = 'hello$str1'; var str5 = ”$str1 hello“;在字符串中,$ 符号后面加变量可以直接引用变量的值赋给字符串:var str5 的值是: helloabc。 如果字符串拼接变量的后面仍有字符串,可以加个空格隔开,也可以用{ }把 $str1 包裹起来。 字符串拼接表达式的方式:
int n = 3; var str6 = 'hello${n * 2}';字符串中使用表达式通过${}的方式 var str6的值是:hello6。 ④ 集合变量的声明 List List list1 = new List(); 这么写只能是空List。 而且这种写法不能在后面赋值。 List list2 = [1,3,5,7]; list.length 是4。 List list = [‘12’, ‘13’, ‘16’]; 带泛型的List。
Map Map map1 = new Map(); 空集合。 Map map2 = {‘key1’:3,‘key2’:5, ‘key3’:7}; Map的第二种写法。集合用 [ ] , 键值对用 { } 。 对于 map2: map2[‘key4’] = 9; 如果map中没有key4,则新增了key4,map的长度加1,key4的值为 map2[‘key5’] == 0; 这是判断操作,由于map中没有key5,所以 map2[‘key5’] = null,表达式是false。 ⑤ 数字的处理 数字取整数值: floor()向下取整 round()四舍五入形式 ceil()向上取整 abs()取绝对值
字符串转整数: int i = int.parse(‘5’); 可以转换的最大整数:-9223372036854775808 ~ 9223372036854775807 = -2^63 ~ 2^63-1 double d = double.parse(‘5.10’); 小数点后15位之后就不准确了。
数字转字符串: String sd = 3.14159.toStringAsFixed(2); 保留几位小数。15位后的double会有问题。 String sd2 = 13.14159.toStringAsPrecision(4); 保留几位数,包括整数部分的位数。
数字的绝对值: bool b = -8.2.abs() == 8.2; 定义布尔变量用 bool 。
数字求商符号 ~/ : 10 ~/ 4 = 2; 10 ~/ 3 = 1;
??表达式: var exp = exp1 ?? exp2; 如果exp1不是null,exp就等于exp1;如果exp1是null,exp就等于exp2。 这是对3元运算符的简写,exp ? a : b; 如果只是对exp判空操作,就可以用 ?? 表达式。
重载操作符: 重载操作符就是让操作符在指定的作用域内有特殊的意义。 就是重新定义操作符的含义。 operator +(Vector other) {…} (!=不可以进行重载;若重载了==,必须同时重载hashCode)
级联操作符: 级联操作符就是对多行操作同一对象的代码进行简化。
var button = query('#button'); button.text = 'Click to Confirm'; button.classes.add('important'); button.onClick.listen((e) => window.alert('Confirmed!'));简化成:
var button = query('#button'); ..text = 'Click to Confirm'; ..classes.add('important'); ..onClick.listen((e) => window.alert('Confirmed!'));(级联操作符实验报错,请选择性相信)。 ⑥ 循环的格式
for (int x = 0; x < list.length; x++) {...} 和java一样的格式。 for (var x in list2) {...} 简化的循环格式,遍历集合的形式。 list.forEach( (element) { print(element.toString()); } );函数中仅 return 一个表达式,则循环可以简化成:
list.foeEach( (element) => print(element.toString(); );(Switch语句中如果执行一个非空并且没有break等结束语句的case,就会报错 fall-through.)
⑦ 抛异常的方式 throw new Exception(‘some Exception’);
throw ‘something wrong!’; 抛出一个字符串对象作为异常
手动处理 noSuchMethod 异常: 需要在类中覆盖noSuchMethod(InvocationMirror msg) { } 方法:
@override noSuchMethod(InvocationMirror msg){ if(msg.memberName != 'Xxx') { // 其他错误默认抛处理 super.noSouchMethod(msg); } else { // 处理调用Xxx引发的特殊错误 } }⑧ 函数的写法 函数是Function类型的对象,Function 有一个静态方法 apply 可以实现动态调用一个函数(当前版本尚未实现)。 函数都有返回值,定义返回值的函数必须返回同类对象,未定义返回值的默认返回null。 如果函数中返回了一个对象,最好在函数名中声明返回类型和相关注释。
var sayHello = (name) => ‘hello-$name’; 匿名函数 (name) { } 赋值给变量sayHello。 sayHello(‘张三’); 函数返回: hello-张三。 bool b = sayHello is Function; 判断类型用 is 关键字。所有函数都是Function对象,所以b = true;
addNum(num n) { return (num m) => n + m; } var number1 = addNum(5); // 变量number1 传参给了addNum,n = 5。 var number2 = number(7); // 变量number2传参给了addNum中的匿名函数,m = 7,函数返回了 5+7。⑨ 函数的可变参数 Dart语言允许参数可选。可选方式通过[]或{}指定。
固定参数: function(int a, String ,b) { } 直接 () 阔起来的参数,调用时必须传参。 可选无序参数:function(int a, {String back, int style, bool has}) { } 参数 a,为必传参数,不需要指定参数的名称。{ } 内有3个参数,可以选传,但是必须指定参数的名称,如: function(4, back:‘backcolor’, has:false);。 可选连续参数: 如果可选函数是用[]包裹的,就必须按照顺序指定参数值,允许后面的参数为空,但不允许参数不连续。 function(int a, [String back, int style, bool has]) { } 传参只能是: function(4, back:‘backcolor’); function(4, back:‘backcolor’, style:0); function(4, back:‘backcolor’, style:0, has:false); 不可以是 function(4, back:‘backcolor’, has:false); 因为参数不连续了。