1、定义常量
Dart 常量:final 和 const修饰符
- const值不变 一开始就得赋值。
- final 可以开始不赋值,只能赋一次 ;
而final不仅有const的编译时常量的特性,最重要的它是运行时常量,并且final是惰性初始化,即在运行时第一次使用前才初始化。
(能够定义常量对象,const不可以)
永远不改量的量,请使用final或const修饰它,而不是使用var或其他变量类型。
//const常量
const PI=3.14159;
// PI=123.1243; //错误的写法 常量不可以修改
print(PI);
// final 常量
final PI = 3.14159;
// PI = 124214.214124; //错误写法
print(PI);
final a = new DateTime.now();
print(a); //2019-05-10 15:59:02.966122
//const a=new DateTime.now(); //报错了
数据类型
1、 List
//1、第一种定义List的方式
var l1 = ["张三",20,true];
print(l1); //[张三, 20, true]
print(l1.length); //3
print(l1[0]); //张三
print(l1[1]); //20
//2、第二种定义List的方式 指定类型
var l2=<String>["张三","李四"];
print(l2);
var l3 = <int>[12, 30];
print(l3);
//3、第三种定义List的方式 增加数据 ,通过[]创建的集合它的容量可以变化
var l4 = [];
print(l4);
print(l4.length);
l4.add("张三");
l4.add("李四");
l4.add(20);
print(l4);
print(l4.length);
var l5 = ["张三", 20, true];
l5.add("李四");
l5.add("zhaosi");
print(l5);
//4、第四种定义List的方式
// var l6=new List(); //在新版本的dart里面没法使用这个方法了
var l6=List.filled(2, ""); //创建一个固定长度的集合
print(l6);
print(l6[0]);
l6[0]="张三"; //修改集合的内容
l6[1]="李四";
print(l6); //[张三, 李四]
// l6.add("王五"); //错误写法
//通过List.filled创建的集合长度是固定
// var l6=List.filled(2, "");
// print(l6.length);
// l6.length=0; //修改集合的长度 报错
var l7=<String>["张三","李四"];
print(l7.length); //2
l7.length=0; //可以改变的
print(l7); //[]
var l8=List<String>.filled(2, "");
l8[0]="string";
// l8[0]=222;//报错,不是string类型
print(l8);
2、 Maps(字典)
//第一种定义 Maps的方式
var person={
"name":"张三",
"age":20,
"work":["程序员","送外卖"]
};
print(person);//{name: 张三, age: 20, work: [程序员, 送外卖]}
print(person["name"]);//张三
print(person["age"]);//20
print(person["work"]);//[程序员, 送外卖]
//第二种定义 Maps的方式
var p=new Map();
p["name"]="李四";
p["age"]=22;
p["work"]=["程序员","送外卖"];
print(p);//{name: 李四, age: 22, work: [程序员, 送外卖]}
print(p["age"]);//22
3、 类型判断
var str=123;
if(str is String){
print('是string类型');
}else if(str is int){
print('int');
}else{
print('其他类型');
}
运算符
- 算术运算符:
int a=13;
int b=5;
print(a~/b); //2 取整
- 关系运算符:
- 逻辑运算符:
- 赋值运算符:
基础赋值运算符 |
= |
??= |
|
|
|
复合赋值运算符 |
+= |
-= |
*= |
/= |
%= |
~/= |
- 条件表达式:
if else |
switch case |
三目运算符 |
??运算符 |
流程控制(循环)
和大部分语言一样的for循环和while,很常规。
1、自增 自减
++ -- 表示自增 自减 1
在赋值运算里面 如果++ -- 写在前面 这时候先运算 再赋值,如果++ --写在后面 先赋值后运行运算。(很多新语言已经废弃这种自增自减了)
2、for循环
// for基本语法
for (int i = 1; i<=100; i++) {
print(i);
}
//第一步,声明变量int i = 1;
//第二步,判断i <=100
//第三步,print(i);
//第四步,i++
//第五步 从第二步再来,直到判断为false
3、while和do...while
//语法格式:
while(表达式/循环条件){
}
do{
语句/循环体
}while(表达式/循环条件);
/*注意:
1、最后的分号不要忘记
2、循环条件中使用的变量需要经过初始化
3、循环体中,应有结束循环的条件,否则会造成死循环。
*/
4、break和continue
/*
break语句功能:
1、在switch语句中使流程跳出switch结构。
2、在循环语句中使流程跳出当前循环,遇到break 循环终止,后面代码也不会执行
强调:
1、如果在循环中已经执行了break语句,就不会执行循环体中位于break后的语句。
2、在多层循环中,一个break语句只能向外跳出一层
break可以用在switch case中 也可以用在 for 循环和 while循环中
continue语句的功能:
【注】只能在循环语句中使用,使本次循环结束,即跳过循环体重下面尚未执行的语句,接着进行下次的是否执行循环的判断。
continue可以用在for循环以及 while循环中,但是不建议用在while循环中,不小心容易死循环
*/
数据类型常用的属性和方法
1、List
/*
List里面常用的属性和方法:
常用属性:
length 长度
reversed 翻转
isEmpty 是否为空
isNotEmpty 是否不为空
常用方法:
add 增加
addAll 拼接数组
indexOf 查找 传入具体值
remove 删除 传入具体值
removeAt 删除 传入索引值
fillRange 修改
insert(index,value); 指定位置插入
insertAll(index,list) 指定位置插入List
toList() 其他类型转换成List
join() List转换成字符串
split() 字符串转化成List
forEach
map
where
any
every
*/
//List里面的属性:
List myList=['香蕉','苹果','西瓜'];
print(myList.length);
print(myList.isEmpty);
print(myList.isNotEmpty);
print(myList.reversed); //对列表倒序排序
var newMyList=myList.reversed.toList();
print(newMyList);
//List里面的方法:
myList.add('桃子'); //增加数据 增加一个
myList.addAll(['桃子','葡萄']); //拼接数组
print(myList.indexOf('苹x果')); //indexOf查找数据 查找不到返回-1 查找到返回索引值
myList.remove('西瓜');
myList.removeAt(1);
myList.fillRange(1, 3,'bbb'); //[香蕉, bbb, bbb](index1~3修改为bbb)
myList.insert(1,'aaa'); //插入一个 [香蕉, aaa, 苹果, 西瓜]
myList.insertAll(1, ['aaa','bbb']); //插入多个 [香蕉, aaa, bbb, aaa, 苹果, 西瓜]
var str=myList.join('-'); //list转换成字符串 香蕉-苹果-西瓜
var str='香蕉-苹果-西瓜'; var list=str.split('-'); //字符串变成数组 [香蕉, 苹果, 西瓜]
2、set
- 用它最主要的功能就是去除数组重复内容。
- Set是没有顺序且不能重复的集合,所以不能通过索引去获取值。
var s=new Set();
s.add('香蕉');
s.add('苹果');
s.add('苹果');
print(s); //{香蕉, 苹果}
print(s.toList()); //[香蕉, 苹果]
//数组去重
List myList=['香蕉','苹果','西瓜','香蕉','苹果','香蕉','苹果'];
var s=new Set();
s.addAll(myList);
print(s);//{香蕉, 苹果, 西瓜}
print(s.toList());//[香蕉, 苹果, 西瓜]
3、map
/*
映射(Maps)是无序的键值对:
常用属性:
keys 获取所有的key值
values 获取所有的value值
isEmpty 是否为空
isNotEmpty 是否不为空
常用方法:
remove(key) 删除指定key的数据
addAll({...}) 合并映射 给映射内增加属性
containsValue 查看映射内的值 返回true/false
forEach
map
where
any
every
*/
//常用属性:
Map person={
"name":"张三",
"age":20,
"sex":"男"
};
print(person.keys.toList());//[name, age, sex]
print(person.values.toList());//[张三, 20, 男]
print(person.isEmpty);//false
print(person.isNotEmpty);//true
//常用方法:
Map person={
"name":"张三",
"age":20,
"sex":"男"
};
person.addAll({
"work":['敲代码','送外卖'],
"height":160
});
print(person);//{name: 张三, age: 20, sex: 男, work: [敲代码, 送外卖], height: 160}
person.remove("sex");
print(person);//{name: 张三, age: 20, work: [敲代码, 送外卖], height: 160}
print(person.containsValue('张三'));//true
4、forEach、map、where、any、every
- forEach
//List
List myList=['香蕉','苹果','西瓜'];
myList.forEach((value){
print("$value");
});//香蕉 苹果 西瓜
// set
var s=new Set();
s.addAll([1,222,333]);
s.forEach((value)=>print(value));//箭头写法 1 222 333
//map
Map person={
"name":"张三",
"age":20
};
person.forEach((key,value){
print("$key---$value");
});//name---张三 age---20
- map
List myList=[1,3,4];
var newList=myList.map((value){
return value*2;
});
print(newList.toList());//[2, 6, 8]
- where
List myList=[1,3,4,5,7,8,9];
var newList=myList.where((value){
return value>5;
});
print(newList.toList());//[7, 8, 9]
- any
List myList=[1,3,4,5,7,8,9];
var f=myList.any((value){ //只要集合里面有满足条件的就返回true
return value>5;
});
print(f);//true
- every
List myList=[1,3,4,5,7,8,9];
var f=myList.every((value){ //每一个都满足条件返回true 否则返回false
return value>5;
});
print(f);//false