一. 关键字var、final、const
-
var
,使用var声明一个变量,可以赋值不同的类型。var声明的变量如果没有初始化,那么他的值为nil
-
final
,使用final声明的一个只能赋值一次的变量!。final后面可以跟类型,var后面不能跟类型
-
const
,使用const声明一个常量。声明时,必须赋值。
var a;
final b;
const c = 1;
final String d;
// var String e; //会报错,var后面不能跟类型
print(a); // null
a = 1;
b = 2;
print(a); // 1
print(b); // 2
二. Dart的数据类型
- 数值型
Number: int & double
- 字符串
String
bool
- 列表 -
List
- 键值对(字典) -
Map
1.Number
num d;
d = 1;
d = 1.1;
double a;
a = 10;
print(a); //10
int b = 8;
print(b.isEven); //是否是偶数 true
print(b.isOdd); //是否是奇数 false
//算术运算符:+ - * / % ~/(取整)
print(a ~/ b); //1
//转换类型
print(a.toInt().isEven); // true
print(b.toDouble()); // 8
2.String
- 使用单引号和双引号创建
- 三个引号或双引号 创建多行字符串
var a = 'apple';
var b = "pear";
print(a + b); // applepear
String str = 'apple';
String str1 = "pear";
String str2 = "apple\n"
"pear\n"
"banana";
String str3 = '''fruit
apple
pear
apple''';
print(str2);
print(str3);
print(str + " to eat"); //apple to eat
print(str1 * 2); //pearpear
int a = 10;
int b = 20;
int c = a + b;
print('a + b = ${a + b}'); //a + b = 30
print('a + b = $c'); //a + b = 30
String str4 = "apple\npear";
String str5 = r"pear\npear";//这里r表示不使用转义字符
print(str4);
print(str5); // pear\npear
print(str4.length); // 10
print(str5.length); //10
3.List
- Dart中的列表 可以存放不同的数据类型
- 创建可变
list var list1 = [1,2,3]
- 创建不可变
list var list2 = const [1,2,3]
var list1 = [1,2,3,'apple'];
print(list1); //[1, 2, 3, apple]
print(list1[3]); //apple
list1[3] = 'pear';
print(list1); // [1, 2, 3, pear]
list1.add('banana');
print(list1); //[1, 2, 3, pear, banana]
list1.insert(1, 'orange');
print(list1); //[1, orange, 2, 3, pear, banana]
list1.remove('orange');
print(list1); //[1, 2, 3, pear, banana]
list1.clear();
print(list1); //[]
var list2 = [1,3,5,2,4,6,9,8,7];
list2.sort();
print(list2); //[1, 2, 3, 4, 5, 6, 7, 8, 9]
print(list2.sublist(4,7)); //[5, 6, 7]
4.Map
- Dart中的Map键值对
- 创建可变的
Map var json1 = {'one':'apple','two':'pear'};
- 创建不可变的
Map var json1 = const {'one':'apple','two':'pear'};
var json1 = {'one':'apple','two':'pear'};
print(json1['one']); //apple
json1['one'] = 'banana';
print(json1); //{one: banana, two: pear}
var json2 = const {'one':'apple','two':'pear'};
// json2['one'] = 'banana'; //这里是常量对象,不能对Map中某个元素赋值
print(json2.length); //2
print(json2.values); //(apple, pear)
print(json2.keys); //(one, two)
var list = ['apple', 'pear', 'pear'];
print(list.asMap()); //{0: apple, 1: pear, 2: pear} 将list转化为Map,key为数组下标
5.运算符 ?? & ??=
- x ??:条件表达式,如果x不为nil,返回x。反之回右边值。
- x ??= :赋值运算,如果x不为nil,不赋值。反之给x赋值右边值。整体返回x(或赋值后x)的值。
var a;
print(a ??= 10); // 10, 这里返回的是a赋值后的值。
a ??= 5; //如果a为nil就赋值,如果有值就直接返回。
print(a); //10
var b;
b = 5;
print(b ?? b); // 5 //如果左边有值返回左边,没有就返回右边!
三. 函数
1.Function&箭头函数
- 方法格式,返回值
Function(参数类型:形参)
。
- 方法可以省略返回值和参数类型,
Function(a,b)
。
- 可选参数,使用{},使用可选参数时,必须加上形参。
Function(int a,{int b, int c})
。
- 参数可空, 使用?。
Function(int a,{int? b, int c})
- 方法也是一个对象,也可以作为参数传递, 例如:List中的
forEach
。Function(int a, void func(int a))
。
- 箭头函数,当方法的执行语句只有一句的时候,可以使用箭头函数 => 表达式。
void functionDemo() {
print(sum(10, 20)); //30
print(sum1(1, c: 5,b: 3)); //9
print(sum2(1, c: 5,b: 3)); //9
print(sum3(1)); //1
print(sum4(1,2,3)); // 6
var hello = printHello; //将方法赋值给hello变量,方法也是一个对象
hello(); //调用hello变量方法
var list = [1,2,3,4];
list.forEach(print); //1,2,3,4
list.forEach(printElement); //元素1 = 1, 元素2 = 2, 元素3 = 3, 元素4 = 4
forEachDemo(list, print); //1,2,3,4
forEachDemo(list, printElement); //元素5 = 1, 元素6 = 2, 元素7 = 3, 元素8 = 4
}
forEachDemo(List list, void func(var element)) {
for (var e in list) func(e);
}
int b = 0;
printElement(var a) {
b ++;
print('元素$b = $a');
}
printHello() => print('hello');
sum(a, b) => a + b;
sum1(int a, {var b, var c}) {
b ??= 0;
c ??= 0;
return a + b + c;
}
//nullability, int? 告诉编译器,我处理了后面为空的情况
sum2(int a, {int? b, int? c}) {
b ??= 0;
c ??= 0;
return a + b + c;
}
sum3(int a, {int b = 0, int c = 0}) {
// b ??= 0;
// c ??= 0;
return a + b + c;
}
int sum4(int a, [int b = 0, int c = 0]) {
return a + b + c;
}
2.匿名函数&立即执行函数
- 匿名函数,顾名思义就是没有名字的函数,多用于方法作为参数情况。(参数){执行内容}。
- 立即执行函数,立即执行的函数,基本上都是没有意义的。
//匿名方法
var func = () {
print('匿名方法');
};
//立即执行方法、函数
(() {
print('立即执行函数');
})();
//匿名函数
int b = 0;
forEachDemo(list, (var a) {
b ++;
print('元素$b = $a'); //元素1 = 1, 元素2 = 2, 元素3 = 3, 元素4 = 4
});
forEachDemo(List list, void func(var element)) {
for (var e in list) func(e);
}
3.闭包
- 闭包,定义在函数内部的函数就被称为闭包。闭包也是一个对象。
- 作用,用来访问外部函数的局部变量。被访问的局部变量不会被释放,会持续持有它。闭包释放,局部变量释放。
void closureDemo() {
var funcA = testClosure();
funcA(); // 0
funcA(); // 1
funcA(); // 2
//此时,局部变量_count在函数执行完成后,并没有被释放。
//而是被funcA持续持有。当closure执行完,才会释放funcA,然后_count被释放。
}
testClosure() {
int _count = 0;
return ()=>{print(_count++)};
}
网友评论