Flutter开发之Dart语法基础

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相关的一些概念:web

  • 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关键字声明变量bash

var name = 'name';
dynamic name1 = 'name1';
String name2 = 'name2';

// 变量的赋值
name = 'a';
name1 = 'a1';
name2 = 'a2';
复制代码

未初始化的变量的初始值为null, 即便是数字也是如此,由于在Dart中数字也是一个对象微信

var name;
dynamic name1;
String name2;
复制代码

可选类型并发

在声明变量的时候,你能够选择加上具体的类型:less

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支持经常使用的算术操做符ide

操做符 解释
+ 加号
减号
-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的基本数据类型

参考文献


欢迎您扫一扫下面的微信公众号,订阅个人博客!

微信公众号
相关文章
相关标签/搜索