var
类似在JavaScript中一样,你可以使用var关键字定义变量
main(List<String> args) {
var number = 42;
var name = 'Gurleen Sethi';
var salary = 150300.56;
var isDoorOpen = true;
}
但是,和JavaScript不同的是,在Dart2中,一旦你给变量赋值一种类型的值,就不能再赋值另一种类型的值。Dart 可以自动从右边数据推断数据类型。
特殊情况
Dart2.1里面新增特性,当double的值为int值时,int自动转成double。
例如:double test = 12;//打印结果是12.0
即 var a=5.5 ,确定是变量a是double类型时,也可以接受a=10;
Dart2.1,double也有api转成int,会把小数点后面的全部去掉。
double test2 = 15.1;
double test3 = 15.1234;
print(test2.toInt());// 结果是15
print(test3.toInt());// 结果是15
Final 和 Const的用法
1、被final或者const修饰的变量,变量类型可以省略。
//可以省略String这个类型声明
final name1 = "张三";
//final String name1 = "张三";
const name2 = "李四";
//const String name2 = "李四";
2、被 final 或 const 修饰的变量无法再去修改其值。
3、注意:flnal 或者 const 不能和 var 同时使用,
//这样写都会报错
//final var name1 = "张三";
//const var name2 = "李四";
Lists
main(List<String> args) {
var list = [1,2,3,4];
print(list); //Output: [1, 2, 3, 4]
//Length 长度
print(list.length);
//Selecting single value 获取单个值
print(list[1]); //Outout: 2
//Adding a value 添加值到list
list.add(10);
//Removing a single isntance of value 删除单个值
list.remove(3);
//Remove at a particular position 删除指定位置的值
list.removeAt(0);
var list = const [1,2,3,4]; //不可变
}
Maps
main(List<String> args) {
var map = {
'key1': 'value1',
'key2': 'value2',
'key3': 'value3'
};
//Fetching the values 获取值
print(map['key1']); //Output: value1
print(map['test']); //Output: null
//Add a new value 添加值
map['key4'] = 'value4';
//Length 获取长度
print(map.length);
//Check if a key is present 检查是否存在
map.containsKey('value1');
//Get entries and values
var entries = map.entries;
var values = map.values;
}
异常
如果你不知道抛出异常的类型,或者不确定,可以使用catch块处理任意类型的异常。
main(List<String> args) {
try {
divide(10, 0);
} on IntegerDivisionByZeroException {
print('Division by zero.');
} catch (e) {
print(e);
}
}
divide(int a, int b) {
if (b == 0) {
throw new Exception('Some other exception.');
}
return a / b;
}
构造函数的写法
给构造函数提供了名称,这样做使得不同的构造函数变的更加清晰。
class Dog {
String name;
int age;
Dog(this.name, this.age);
Dog.newBorn() {
name = 'Doggy';
age = 0;
}
}
Getter and Setters
main(List<String> args) {
Dog d = new Dog('Duffy', 5);
d.respectedName = 'Mr.Duffy';
print(d.respectedName);
}
class Dog {
String name;
int age;
Dog(this.name, this.age);
String get respectedName {
return 'Mr.$name';
}
set respectedName(String newName) {
name = newName;
}
Dog.newBorn() {
name = 'Doggy';
age = 0;
}
bark() {
print('Bow Wow');
}
}
访问控制
在dart中,可以在属性和方法名前添加“_”使私有化。现在让我们使name属性私有化。
枚举
main(List<String> args) {
Dog d = new Dog('Duffy', 12, CurrentState.sleeping);
print(d.state == CurrentState.sleeping); //Prints 'true'
}
enum CurrentState {
sleeping,
barking,
eating,
walking
}
class Dog {
String name;
int age;
CurrentState state;
Dog(this.name, this.age, this.state);
static bark() {
print('Bow Wow');
}
}
as, is, is!
as,is,和 !is 运算符在运行时检查类型很方便
as: 类型转换, 也用于指定库前缀
is: 类似于java的instanceof
!is: is操作符的取反, 即不是xxx
代码示例:
if (emp is Person) {
// 类型检查
emp.firstName = 'Bob';
}
// 如果emp为Person,则将firstName改为Bod, 否则会在运行时期报错
(emp as Person).firstName = 'Bob';