likes
comments
collection
share

Dart 基础语法

作者站长头像
站长
· 阅读数 1

var、final 和 const

var 关键字

void main() {
  var a;
  print(a);
  a = 'hello world';
  print(a);
  a = 10;
  print(a + 20);

  var b = 10;
  print(b);
}
  • 使用 var 声明一个变量,可以赋值为不同的类型。
  • var 声明的变量如果没有初始化,那么变量的值为 nil

final 关键字

Dart 基础语法

Dart 基础语法

  • 使用 final 声明的变量只能被赋值一次,再次赋值的话会报错,它是最终变量。
  • 使用 final 声明的变量在使用前必须有值,不然也会报错。

const 关键字

Dart 基础语法

Dart 基础语法

  • 使用 const 声明的常量初始化的时候必须被赋值。
  • 使用 const 声明的常量不能被修改。

Dart 的数据类型之 num

相对于 OC 来说 Dart 的数据类型会少很多,数值型 num 分为两种 intdouble

Dart 基础语法

如图,num 类型的变量如果被使用的话必须要有值,double 类型的变量可以被重新赋值为 int 型数据,但是 int 型变量不能被重新赋值为 double 类型。

void main() {
  int a = 10;
  print(a.isEven); // 判断是否是偶数
  print(a.isOdd); // 判断是否是奇数

  // 运算符 + - * / % (取模)  ~/ (取整数)
  int b = a + 10;
  int c = a - 5;
  int d = a * 3;
  double e = a / 2;
  int f = a % 6;
  int g = a ~/ 8; // 这个结果为 1,相当于 a 除 8 的结果取整

  // 转换类型
  int h = 10.3.toInt(); // double 类型转换为 int
  double i = 5.toDouble(); // int 类型转换为 double
}

Dart 的数据类型之 String

void main() {
  // 用单引号或者双引号修饰都可以
  var a = 'hello';
  var b = "world";
  String c = a + b;

  // 用 3 个引号修饰,字符串可以换行
  String d = '''hello
  world''';

  // 获取字符串 a 中的第 0 个字符跟第 1 个字符,这里可以看到会非常方法,可以用下标的方式去取
  print(a[0]);
  print(a[1]);

  String e = a * 2; // 这个结果等于 hellohello,就是把 a 的值再复制一份

  int f = 10;
  int g = 20;
  int h = f + g;
  print('a + b = ${a + b}'); // 输出结果为 a + b = 30,在字符串里面拼接运算表达式
  print('a + b = $h'); // 这个结果跟上面输出结果是一样的

  String str = "hello\nworld";
  print(str); // 这个输出的结果就是 hello 换行之后是 world

  String str1 = r"hello\nworld";
  print(str1); // 这个输出的结果就是 hello\nworld, \n 没起作用

  print(str1.length); // 打印字符串长度
}

更多的字符串使用方法,大家也可以点进去到 String 里面去看,光标移到 String 上面,按住 command 并点击鼠标。

Dart 基础语法

Dart 的数据类型之 List & Map

Llist

Dart 中的 list 就相当于 oc 中的数组,但是稍微不同的是 list 中可以存储不同类型的元素,下面是 list 的一些用法。

void main() {
  // 不可变 list,数据先去加 const 修饰
  var list = const ['one', 'two', 'three', 1];

  // 可变 list
  var list1 = ['one', 'two', 'three', 1];
  // 根据下标打印元素
  print(list1[1]);
  // 修改下标为 1 的元素
  list1[1] = 3;
  // 打印 list 元素数量
  print(list1.length);
  // 追加一个元素
  list1.add(5);
  // 在 下边为 1 的位置插入一个元素
  list1.insert(1, '33');
  // 删除某个元素
  list1.remove('one');
  // 清空 list
  list1.clear();

  var list2 = [1, 3, 2];
  // 对 list 进行排序,得到的结果就是 [1, 2, 3]
  list2.sort();
  // 获取 list 下标 1 到 3 之间的元素
  list2.sublist(1, 3);
}

Map

Dart 中的 Map 相当于 OC 中的字典,以键值对的形式存储。其中 List 也可以转换为 Map,以下标为 key,对应的元素为 value

void main() {
  // 不可变 map
  var map1 = const {'key1' : 'one','key2' : 'two'};

  // 可变 map
  var map2 = {'key1' : 'one','key2' : 'two'};
  // 获取 key 对应的值
  print(map2['key1']);
  // 修改 key 对应的值
  map2['key1'] = 'hello';
  // 打印 map 的长度
  print(map2.length);
  // 获取 map 中所有的 value
  print(map2.values);
  // 获取 map 中所有的 key
  print(map2.keys);

  // 将 list 转为 map,结果就是 {0: one, 1: two, 2: three}
  var list = ['one', 'two', 'three'];
  var map3 = list.asMap();
}

Dart 中的运算符

这里介绍 Dart 中一些特意的运算符,别的都是跟其他语言一样,是一些通用的运算符。

void main() {
  var a;
  // 如果 a 没有值,就进行赋值,如果 a 有值就不会赋值
  a ??= 10;
  
  var b;
  // 如果左边有值就打印左边,如果左边没值就打印右边
  print(a ?? b);
}

Dart 中的方法跟箭头函数

Dart 中方法也是一个对象,返回值跟参数类型可以省略,当方法执行语句只有一句的时候可以使用箭头函数 => 表达式。

void main() {
  print(sum(10, 20));
  print(sum1(10, 20));
  print(sum2(10, 20));
}

// 正常写法
int sum(int a, int b) {
  return a + b;
}

// 省略参数跟返回值
sum1(a, b) {
  return a + b;
}

// 使用箭头函数 => 表达式
sum2(a, b) => a + b;

Dart 方法的可选参数

void main() {
  // 这里方法调用的时候参数可选,但是可选参数必须带上形参的名称
  print(sum(20));
  print(sum(20, b: 10));
  // 这里可以不用按照方法中的顺序传参
  print(sum(20, c:5, b:10));


  // 用 [] 修饰可选参数调用的时候可以不用带参数名称,但是必须按参数的顺序传值
  print(sum3(20, 5, 10));
}

sum(a, {b, c}) {
  b ??= 0;
  c ??= 0;
  return a - b + c;
}

// 参数如果为 int 型,就需要用 int?修饰,告诉编译器参数可以为空
sum1(a, {int? b, int? c}) {
  b ??= 0;
  c ??= 0;
  return a - b + c;
}

// 也可以给参数一个默认值
sum2(a, {int b = 0, int c = 0}) {
  return a - b + c;
}

// 用 [] 修饰可选参数调用的时候可以不用带参数名称,但是必须按参数的顺序传值
sum3(a, [int b = 0, int c = 0]) {
  return a - b + c;
}

Dart 方法作为参数传递

Dart 是纯面向对象语言,方法也是一个对象,可以作为参数用来传递,这点有点类似 OC 中的 block 的作用。下面例子中我们定义一个 helloDemo 方法,可以用变量 hello 来接收并调用。以及参照系统方法定义了 forEachDemo 来遍历打印 list 中的元素,并把 printElement 方法作为参数来传递。

void main() {
  var hello = helloDemo;
  hello();

  var list = [1, 2, 3, 4];
  // list.forEach(print);
  forEachDemo(list, printElement);
}

helloDemo() => print('hello');


forEachDemo(List list, void func(var element)) {
  for (var e in list) func(e);
}

int b = 0;
printElement(var a) {
  b++;
  print('元素$b = $a');
}

Dart 中的匿名函数

void main() {
  // 这里 () {} 部分属于匿名函数,但是需要用一个变量接收,才能被调用,匿名方法也可以作为参数传递
  var func = () {
    print('匿名方法');
  };
  func();

  // 以 (() {}) () 这种形式实现的匿名函数会立即执行,属于立即执行函数
  (() {
    print('立即执行函数');
  })();
}

Dart 中的闭包

闭包: 定义在函数里面的函数就是闭包,闭包也是一个对象。 闭包的作用:可以访问外部函数的局部变量。

Dart 基础语法

理论上 return 之后函数执行完毕,函数中的变量就会被销毁,但是如图可以看到,我们连续执行了 3 次 func(),变量 a 的值会被累加,并没有被销毁。这就是闭包的特点,只要我们拿到 func 这个变量,a 就会一直存在内存中。