美文网首页Flutter
Dart 基础语法

Dart 基础语法

作者: 晨曦的简书 | 来源:发表于2021-10-28 14:19 被阅读0次

    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 关键字


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

    const 关键字


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

    Dart 的数据类型之 num

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

    如图,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 的数据类型之 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 中的闭包

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

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

    相关文章

      网友评论

        本文标题:Dart 基础语法

        本文链接:https://www.haomeiwen.com/subject/seosaltx.html