变量
/**
* Dart中用var生命变量,可以赋值不同类型
* Type:dynamic
* 一开始没有初始值的变量可以赋值任意类型,一开始有初始值的变量,只能赋值同类型
* */
var a;
a = "asd";
print(a);
a = 6;
print(a);
a = [1,2];
print(a);
var b = 66;
print(b);
final变量
/**
* final:使用final声明的只能赋值一次的变量
* 可以在命名时赋值,也可以命名不赋值,其他地方赋值,但是只能赋值一次!
* 没有被赋值过的final变量是不能被使用的
* 它是最终变量
* */
final c;
c = 2;
print("c : $c");
常量
/**
* const:常量只能在声明的时候赋值,而且必须在声明时赋值
* */
const d = 5;
print("d : $d");
Dart的数据类型
- 数值型Number: int & double
- 字符串
- bool
- 列表 - List
- 键值对(字典) - Map
/**
* num:可以是int也可以是double
* */
num a = 10;
a = 1.5;
int b = 20;
print(b.isEven); // 偶数
print(b.isOdd); // 奇数
double c = 30.0;
// 算数运算符 + - * / %(取模) ~/(取整)
print(a ~/ b); // 相当于a/b取整
// 类型转换
print(a.toInt().isOdd);
print(b.toDouble());
/**
* Dart中的字符串
* 使用单引号和双引号创建
* 三个引号或双引号可以创建多行字符串
* */
var a = 'James';
var b = "Rose";
print(a+b);
String str = "Hello";
String str1 = "World";
/**
* Apple
Orange
Banana
Cherry
* 结果和下面写的一样,前面会带空格
* */
String str2 = '''Apple
Orange
Banana
Cherry''';
print(str2);
/**
* 取字符串第n个字符
* e
* */
print(str[1]);
/**
* 字符串拼接
* HelloWorld
* */
print(str+str1);
/**
* 字符串重复翻倍
* HelloHelloHelloHelloHello
* */
print(str * 5);
/**
* 格式化字符串
* 表达式需要花括号括起来,单个变量直接美元符加变量
* */
int aa = 10;
int bb = 20;
int cc = aa + bb;
print("a + b = ${aa + bb}");
print("a + b = $cc");
/**
* 如果不需要字符串中的转义字符,字符串前面加r
* apple
orange
* apple\norange
* */
String str3 = "apple\norange";
String str4 = r"apple\norange";
print(str3);
print(str4);
/**
* 字符串长度
* */
print(str3.length);
/**
* Dart中的列表,可以存放不同的数据类型
* 创建可变list var list = [1, 2, 3];
* 创建不可变list var list = const [1, 2, 3];
* */
var list1 = [1, 2, 3, 'sj'];
print(list1);
print(list1[3]);
list1[3] = 4;
print(list1[3]);
var list2 = const [1, 2];
/**
* 获取数组长度
* */
var list3 = ["red", 1];
print(list3.length);
/**
* 添加元素
* 如果数组原来是同类型数据,添加只能是同类型数据
* 如果原来有不同类型数据,可随便添加什么类型
* */
list3.add([1]);
print(list3);
/**
* 插入元素
* 插入元素类型规则同添加元素
* */
list3.insert(1, "yello");
print(list3);
/**
* 删除元素
* */
list3.remove("red");
print(list3);
list3.removeAt(1);
print(list3);
list3.clear();
print(list3);
/**
* 数组排序
* */
var list4 = [5, 3, 2, 7, 9, 1];
list4.sort();
print(list4);
/**
* 数组截取
* */
print(list4.sublist(2, 4));
/**
* Dart中的map,键值对
* 创建可变的Map: var json = {'one' : 'red', 'two' : 'green'};
* 创建不可变的Map: var json = const {'one' : 'red', 'two' : 'green'};
* */
var json1 = {'one' : 1, 2 : 'green'};
print(json1);
print(json1[2]);
json1['three'] = 'yello';
print(json1);
/**
* Map的长度
* 所有的key
* 所有的value
* */
print(json1.length);
print(json1.keys);
print(json1.values);
/**
* 数组可以直接简单转Map
* */
var list = ['red', 'green', 'blue'];
print(list.asMap());
Dart的运算符
- 赋值运算 ??=
- 条件表达式 ??
/**
* ??=
* 如果a=nil 把a赋值
* 如果a不为nil,则不赋值
* nil不是0,a=0后续也不赋值
* */
var a;
a ??= 10;
print(a);
a ??= 5;
print(a);
/**
* ??
* 如果a为nil,结果为b
* 如果a不为nil,结果为a
* */
var b = 6;
print(a ?? b);
Dart的方法
- Dart中的方法也是对象
- 方法的返回值和参数可以省略
- 当方法的执行语句只有一句的时候,可以使用箭头函数 => 表达式
- 可选参数:传递参数的时候必须带上形参的名字,可选参数的顺序随便
void function() => print(5);
int sum(int a, int b) {
return a + b;
}
// 可以写成下面方法,但是不建议这么写
sum1(a, b) {
return a + b;
}
// 箭头函数是return,可以省去return
int sum2(int a, int b) => a + b;
/// 可选参数不能直接写int,因为报错,int不能为null。
/// 可以使用可选类型int?
/// 可选参数可以传1个,2个,3个....随便几个都可以且前后位置随意
sum3(int a, {int? b, var c}) {
b ??= 0;
c ??= 0;
return a + b + c;
}
/// 可选参数可以设置默认值
sum4(int a, {int b = 5, int c = 0}) {
return a + b + c;
}
/// 按顺序的可选参数
/// 可选参数必须按顺序,按位置
sum5(int a, [int b = 5, int c = 0]) {
return a + b + c;
}
- 函数作为参数传递
void main() {
var hello = printHello;
hello();
var list = [1, 2, 3, 4];
// list.forEach(print);
forEachDemo(list, printElement);
}
int index = 0;
printElement(var a) {
print('元素$index : $a');
index++;
}
forEachDemo(List list, void func(var element)) {
for (var e in list) func(e);
}
- 匿名方法:没有方法名的方法
var func = () {
print('这是一个匿名方法');
};
func();
/// 立即执行方法、函数
() {
print('这是个立即执行方法');
}();
/// 匿名方法作为参数
var i = 0;
forEachDemo(list, (var a) {
print('元素$i : $a');
i++;
});
- 闭包 closure
定义在函数里面的函数就是闭包,闭包也是对象。
闭包的作用:可以访问外部函数的局部变量。
void closureDemo() {
var fun = funA();
fun();
fun();
fun();
fun();
}
funA() {
var count = 0;
return () => print(count++); // 这个匿名函数就是一个闭包
}