Dart官网镇楼(英文版)
先从一段简单的Dart代码入手。
// 定义一个方法
printNumber(num aNumber) {//参数类型为num,
print('The number is $aNumber.'); // 打印信息到控制台,$aNumber等价于${aNumber},表示取aNumber变量的值。
}
// APP运行入口
main() {
var number = 42; //定义并初始化变量,var表示没有给变量制定类型
printNumber(number); // 调用方法
}
如果把Dart语言开发比喻成玩游戏,那么我们必须遵守它的游戏规则,Dart语言有下面这些规则:
*给变量赋值时,只能把对象赋值给变量,每一个对象都是类的实例。而且,数字,方法和null值都是对象,所有的对象继承自Object类。
*声明变量的时候指定具体类型(像num aNumber这样指定类型为num)可以清晰的表明你的意图,并且可以被工具静态检测,不过你也可以不指定。如果你没有为变量指定具体类型的话,那么你在调试程序的时候会看到该变量为特殊的类型dynamic
*Dart会在运行前对所有的代码进行语法分析。
*Dart支持顶层方法(比如说main()方法),同时支持类级别或对象级别的方法,你还可以在方法内部新建方法(嵌套方法或本地方法)。
*同样,Dart支持顶层变量,同时支持类级别或对象级别的变量,实例变量有时候被称为域或者属性。
*与Java不同的是,Dart没有关键词public,protected和private,不过可以用下划线(_)表示private。
*标识符(变量名或方法名等)可以以字母或下划线_开头,
*Dart工具能报告两类问题:告警warning和错误error。Warning仅仅暗示代码可能无法正常工作,但是程序还能运行。Error可能出现在编译时或运行时,而编译时出现错误后程序就无法运行,运行时错误就会出现异常。
*任何变量的初始值为null,即使num类型的初始值也是null,因为它也是对象。
Dart的七种数据类型
1.numbers
2.strings
3.booleans
4.lists (即arrays)
5.maps
6.runes (用字符串表示Unicode characters)
7.symbols
1.numbers包括int(范围为-2^53到2^53)和double,num类型操作符请查看dart:math。
//将string类型转换为number类型:
var one=int.parse('1');
//将int类型转换为string类型
String oneAsString = 1.toString();
2.Dart中的string是UTF-16编码单元的序列,可用单引号或双引号括起来。
var s1 = 'Single quotes work well for string literals.';
var s2 = "Double quotes work just as well.";
//字符串拼接的两种情况
var s1 = '这是 ' '字符串' " 拼接";
var s2 = '这是字符串 '+ '拼接';
//多行字符
var s1 = '''
这里是
多行
字符
''';
3.booleans
在Dart中,只有true值被认为是true,其他所有的值都被认为是false,所以像值1,”aString”等等都被认为是false,这点与JavaScript不同。
4.lists (即arrays)
以后单独讲解。
5.Maps
//map赋值的第一种方式
var myMap1={"one":"1","two":"2"};
var myMap2={1:"1",2:"2"};
//map赋值的第二种方式
var myMap3=new Map();
myMap3["one"]="1";
6.Runes(是字符串的UTF-32编码格式)
main() {
var clapping = '\u{1f44f}';
print(clapping);
print(clapping.codeUnits);
print(clapping.runes.toList());
Runes input = new Runes(
'\u2665 \u{1f605} \u{1f60e} \u{1f47b} \u{1f596} \u{1f44d}');
print(new String.fromCharCodes(input));
}
7.Functions
Dart是真正面向对象的语言,甚至方法也是对象,类型为Function,这意味着方法也能作为参数传递给另外一个方法。
可选参数
String say(String s1,[String s2]){//调用时可以只传第一个参数,也可以传两个参数
if(s2!=null)print(s1+s2);
}
//调用:
say('s1');
say('s1','s2');
条件表达式
condition ? expr1 : expr2
假如condition为 true, 返回 expr1 否则返回 expr2.
expr1 ?? expr2
假如expr1 为 non-null, 返回expr1,否则返回expr2.
串联符号..
querySelector('#button') // Get an object.
..text = 'Confirm' // Use its members.
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'));
等价于
var button = querySelector('#button');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));
语法糖
class Point {
num x;
num y;
// 设置x和y的语法糖
Point(this.x, this.y);
}
给指定的包加前缀
假如导入的两个包有冲突的地方,比如library1 和library2 都有Element类,如下
import 'package:lib1/lib1.dart';
import 'package:lib2/lib2.dart' as lib2;
Element element1 = new Element(); // 使用lib1的 Element
lib2.Element element2 = new lib2.Element(); // 使用lib2的 Element
假如你只需要导入包的部分内容,可如下操作:
// 只导入foo.
import 'package:lib1/lib1.dart' show foo;
// 不导入foo.
import 'package:lib2/lib2.dart' hide foo;
懒加载导包
懒加载是指只在需要的时候导入包,下面三种情况可能使用到懒加载:
*减少APP初始化启动时间。
*执行A/B测试,比如说切换算法的实现。
*导入很少使用的包。
使用 deferred as来指定懒加载,具体使用如下:
import 'package:deferred/hello.dart' deferred as hello;
当你需要加载包的时候,调用loadLibrary()方法:
greet() async {
await hello.loadLibrary();//await(必须放在async方法里面)表示等待执行完再执行下面代码,hello.loadLibrary调用一次,该包只加载一次,需要多处加载,则多次调用。
hello.printGreeting();
}
除此之外,像if-else,for()循环,while循环,switch-case,try-catch等知识与Java里面类似,就没有列出来。本文内容可以作为Dart语法基本了解,更深层次的内容后面还会介绍。如果看完这篇文章您有所收获,不忘点个赞或者留言,您的鼓励是我前进的动力,谢谢。