美文网首页Flutter
Flutter开发之Dart语法基础

Flutter开发之Dart语法基础

作者: TitanCoder | 来源:发表于2019-02-19 14:43 被阅读35次
    dart-logo
    • 原文博客地址: Flutter开发之Dart语法基础
    • Dart是谷歌在 2011 年推出的编程语言,是一种结构化Web编程语言,允许用户通过Chromium中所整合的虚拟机(Dart VM)直接运行Dart 语言编写的程序,免去了单独编译的步骤
    • 以后这些程序将从Dart VM更快的性能与较低的启动延迟中受益
    • Dart从设计之初就为配合现代web整体运作而考虑,开发团队也同时在持续改进DartJavaScript转换的快速编译器
    • Dart VM以及现代JavaScript引擎(V8 等)都是Dart语言的首选目标平台
    • Dart语言和Swift语言有很多的相似之处

    重要概念

    在学习Dart语言之前, 先了解一些Dart相关的一些概念:

    • O-Objective中有一切皆对象的说法, 这句话在Dart中同样适用
      • 所有能够使用变量引用的都是对象, 每个对象都是一个类的实例
      • Dart中 甚至连 数字、方法和null都是对象
      • 所有的对象都继承于Object
    • Dart动态类型语言, 尽量给变量定义一个类型,会更安全,没有显示定义类型的变量在debug模式下会类型会是dynamic(动态的)
    • Dart会在运行之前解析你的所有代码,指定数据类型和编译时的常量,可以提高运行速度
    • Dart中的类和接口是统一的,类即接口,你可以继承一个类,也可以实现一个类(接口),自然也包含了良好的面向对象和并发编程的支持
    • Dart函数
      • 支持顶级函数 (例如main())
      • 支持在类中定义函数, 如静态函数和实例函数
      • 还可以在方法中定义方法(嵌套方法或者局部方法)
    • 类似的,Dart支持顶级变量,以及依赖于类或对象(静态变量和实例变量)变量。实例变量有时被称为域或属性
    • Dart不具备关键字publicprotectedprivate。如果一个标识符以下划线(_)开始,那么它和它的库都是私有的
    • 标识符可以字母或(_)开始,或者是字符加数字的组合开头

    以上只是大概说明了一些Dart中的重要概念, 具体的语法使用, 请看下文

    基本语法

    注释

    Dart的注释分为3种:单行注释、多行注释、文档注释

    • 单行注释以//开头
    • 多行注释以/*开头,以*/结尾
    • 文档注释以///或者/**开头

    分号;

    • 分号用于分隔Dart语句
    • 通常我们在每条可执行的语句结尾添加分号
    • 使用分号的另一用处是在一行中编写多条语句
    • Dart中,用分号来结束语句是必须的, 不加分则会报错

    其他语法

    • 按照Dart的编程规范,使用2个空格来缩进
    • 输出语句使用print(Object)

    变量和常量

    变量

    使用varObjectdynamic关键字声明变量

    var name = 'name';
    dynamic name1 = 'name1';
    String name2 = 'name2';
    
    // 变量的赋值
    name = 'a';
    name1 = 'a1';
    name2 = 'a2';
    

    未初始化的变量的初始值为null, 即使是数字也是如此,因为在Dart中数字也是一个对象

    var name;
    dynamic name1;
    String name2;
    

    可选类型

    在声明变量的时候,你可以选择加上具体的类型:

    String name2 = 'name2';
    
    • 这种方式可以更加清晰的表达你想要定义的变量的类型, 编译器也可以根据该类型为你提供代码补全、提前发现 bug 等功能
    • 注意: 对于局部变量,这里遵守 代码风格推荐 部分的建议,使用var而不是具体的类型来定义局部变量

    常量

    • 常量使用final或者const
    • 一个final变量只能赋值一次
    • 一个const变量是编译时常量
    • 实例变量可以为final但是不能是const

    final

    final修饰的变量(即常量2)

      final age = 10;
      final int age1 = 20;
    
      // final修饰的变量不能重新赋值, 会报错
      age = 20;
      age1 = 30;
    

    const

    • const变量为编译时常量
    • 如果在类中使用const定义常量,请定义为static const
    • 使用const定义的常量, 可以直接给定初始值,也可以使用其他const变量的值来初始化其值
      // const
      const m1 = 12;
      const double m2 = 23;
      const m3 = m1 + m2;
    
      // final修饰的变量不能重新赋值, 会报错
      m1 = 10;
      m2 = 1.02;
    

    操作符

    算术操作符

    Dart支持常用的算术操作符

    操作符 解释
    + 加号
    减号
    -expr 负号
    * 乘号
    / 除号(值为double类型)
    ~/ 除号,但是返回值为整数
    % 取模

    示例:

    assert(2 + 3 == 5);
    assert(2 - 3 == -1);
    assert(2 * 3 == 6);
    assert(5 / 2 == 2.5);   // 结果是double类型
    assert(5 ~/ 2 == 2);    // 结果是integer类型 
    assert(5 % 2 == 1);     // 余数
    

    自加自减

    Dart还支持自加自减操作

    • ++var: 先自加在使用
    • var++: 先使用在自加
    • --var: 先自减在使用
    • var--: 先使用在自减

    示例

      var a = 0, b = 0;
      
      b = a++;
      print('a = $a, b = $b'); //a = 1, b = 0
      b = ++a;
      print('a = $a, b = $b'); //a = 2, b = 2
    
    
      b = a--;
      print('a = $a, b = $b'); //a = 1, b = 2
      b = --a;
      print('a = $a, b = $b'); //a = 0, b = 0
    

    关系操作符

    运算符 含义
    == 等于
    != 不等于
    > 大于
    < 小于
    >= 大于等于
    <= 小于等于
    • 要测试两个对象代表的是否为同样的内容,使用 == 操作符
    • 在某些情况下,你需要知道两个对象是否是同一个对象, 使用identical()方法
    external bool identical(Object a, Object b);
    

    类型判定操作符

    类型判定操作符是在运行时判定对象类型的操作符

    操作符 解释
    as 类型转换
    is 如果对象是指定的类型返回 True
    is! 如果对象是指定的类型返回 False
    • 只有当obj实现了 T 的接口, obj is T 才是true。例如obj is Object总是true
    • 使用as操作符把对象转换为特定的类型
    • 可以把as它当做用is判定类型然后调用 所判定对象的函数的缩写形式
    if (emp is Person) { // Type check
      emp.firstName = 'Bob';
    }
    
    // 上面代码可简化为
    (emp as Person).firstName = 'Bob';
    

    注意: 如果empnull或者不是Person类型,则第一个示例使用is则不会执行条件里面的代码,而第二个情况使用as则会抛出一个异常; 所以在不缺定emp是否为空的情况下, 安全起见, 建议使用第一种方式

    赋值操作符

    = –= /= %= >>= ^=
    += *= ~/= <<= &=

    示例:

    // 给 a 变量赋值
    a = value;  
    
    // 复合赋值操作符
    a += b;  // 等价于a = a + b;
    
    // 如果 b 是 null,则赋值给 b;
    // 如果不是 null,则 b 的值保持不变
    b ??= value; 
         
    // 如下所示:     
      var s;
      print(s);  // null
      print(s ?? 'str');  // str
      s ??= 'string';
      print(s);  // string
    

    逻辑操作符

    可以使用逻辑操作符来 操作布尔值:

    • !expr: 对表达式结果取反(true 变为 false ,false 变为 true)
    • ||: 逻辑 OR
    • &&: 逻辑 AND

    条件表达式

    condition ? expr1 : expr2
    // 如果 condition 是 true,执行 expr1 (并返回执行的结果); 否则执行 expr2 并返回其结果
    
    expr1 ?? expr2
    // 如果 expr1 是 non-null,返回其值; 否则执行 expr2 并返回其结果
    

    示例:

    String toString() => msg ?? super.toString();
    
    // 上面的代码等价于
    String toString() => msg == null ? super.toString() : msg;
    
    // 等价于
    String toString() {
      if (msg == null) {
        return super.toString();
      } else {
        return msg;
      }
    }
    

    级联操作符

    级联操作符 (..) 可以在同一个对象上 连续调用多个函数以及访问成员变量。 使用级联操作符可以避免创建 临时变量, 并且写出来的代码看起来 更加流畅

    querySelector('#button') // Get an object.
      ..text = 'Confirm'   // Use its members.
      ..classes.add('important')
      ..onClick.listen((e) => window.alert('Confirmed!'));
    

    第一个方法querySelector()返回了一个selector对象。 后面的级联操作符都是调用这个对象的成员, 并忽略每个操作 所返回的值

    // 上面代码等价于
    var button = querySelector('#button');
    button.text = 'Confirm';
    button.classes.add('important');
    button.onClick.listen((e) => window.alert('Confirmed!'));
    

    级联调用也可以嵌套:

    final addressBook = (new AddressBookBuilder()
          ..name = 'jenny'
          ..email = 'jenny@example.com'
          ..phone = (new PhoneNumberBuilder()
                ..number = '415-555-0100'
                ..label = 'home')
              .build())
        .build();
    

    注意:严格来说,两个点的级联语法不是一个操作符, 只是一个Dart特殊语法。

    流程控制语句

    Dart中可以使用下面的语句来控制Dart代码的流程:

    • if-else
    • forfor-in
    • whiledo-while
    • switch
    • assert
    • breakcontinue
    • try-catchthrow

    if-else

    Dart支持if语句以及可选的else

      if (a == 0) {
        print('a = 0');
      } else if (a == 1) {
        print('a = 1');
      } else {
        print('a = 2');
      }
    

    注意点: 上述代码中的条件控制语句的结果必须是布尔值

    for

    可以使用标准的for循环, ListSet等实现了Iterable接口的类还支持for-in形式的遍历:

      var arr = [0, 1, 2];
    
      // for循环
      for (var i = 0; i < arr.length; i++) {
        print(arr[i]);
      }
      
      // for-in循环
      for (var x in arr) {
        print(x);
      }
    

    Whiledo-while

      // while 循环在执行循环之前先判断条件是否满足:
      while (c == 0) {
        print('c = $c');
      }
    
      // 而do-while循环是先执行循环代码再判断条件:
      do {
        print('c = $c');
      } while (c == 0);
    

    Breakcontinue

    使用break来终止循环:

    while (true) {
      if (shutDownRequested()) break;
      processIncomingRequests();
    }
    

    使用continue来开始下一次循环

    for (int i = 0; i < candidates.length; i++) {
      var candidate = candidates[i];
      if (candidate.yearsExperience < 5) {
        continue;
      }
      candidate.interview();
    }
    

    Switch

    • Dart中的Switch语句使用 == 比较 integerstring、或者编译时常量
    • 比较的对象必须都是同一个类的实例, 比较适合枚举值
    • 每个非空的case语句都必须有一个break语句
    • 另外还可以通过continuethrow或者return来结束非空case语句
    • 当没有case语句匹配的时候,可以使用default语句来匹配这种默认情况
    • 每个case语句可以有局部变量,局部变量只有在这个语句内可见
      var command = 'OPEN';
      switch (command) {
        case 'CLOSED':
          print('CLOSED');
          break;
        case 'APPROVED':
          print('APPROVED');
          // break;
          // 这里非空的case, 没有break会报错
        case 'DENIED':
          // 这里空的case, 可以不要break
        case 'OPEN':
          print('OPEN');
          continue nowClosed;
      //如果你需要实现这种继续到下一个 case 语句中继续执行,则可以 使用 continue 语句跳转到对应的标签(label)处继续执行:
      nowClosed:
        case 'PENDING':
          print('PENDING');
          break;
        default:
          print('default');
      }
    

    Assert

    • 断言: 如果条件表达式结果不满足需要,则可以使用assert 语句中断代码的执行
    • assert方法的参数可以为任何返回布尔值的表达式或者方法。
    • 如果返回的值为true,断言执行通过,执行结束
    • 如果返回值为false,断言执行失败,会抛出一个异常
    • 可在开发过程中, 监测代码是否有问题时使用
    // Make sure the variable has a non-null value
    assert(text != null);
    
    // Make sure the value is less than 100
    assert(number < 100);
    
    // Make sure this is an https URL
    assert(urlString.startsWith('https'));
    

    注意:断言只在开发模式下运行有效,如果在生产模式 运行,则断言不会执行

    这篇文章的简单介绍就到这里了, 下一篇将会记录Dart的基本数据类型

    参考文献


    相关文章

      网友评论

        本文标题:Flutter开发之Dart语法基础

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