Dart基础语法(看完这一篇就够了)

3,478 阅读2分钟

Dart语言集百家之长,用的时候你就能感觉到会有很多语言的影子,如果本身已经有java,kotlin等语言基础,学dart语言花个几个小时看一下就可以了,剩下的就是多练习练习,熟悉dart语言的语法,目前dart主要用于Flutter开发。以下是几点重要的概念:

  • Dart 是强类型语言,但是又兼有 JS 的动态性
  • 类型声明是可选的,可通过类型推导而来
  • 语句以分号结尾,不能省略

1.变量

与java相比String,int,bool,double基本上都一样,其中String单引号和双引号都可以用

String str = "测试";
String str ='测试';
int a = 10;
double b = 20.2;
bool bl = true;
//num是数值类型
num d = 20;

可以用var 声明一个变量,一旦赋值,类型就不能再改变,但值可以变化

var dd = "10";
var a = 30;

dynamic和Object

1、Object 是dart所有对象的根基类,也就是说所有类型都是Object的子类,所以任何类型的数据都可以赋值给Object声明的对象.
2、dynamic与var一样都是关键词,声明的变量可以赋值任意对象. 而dynamic与Object相同之处在于,他们声明的变量可以在后期改变赋值类型.

dynamic a = 30;
a = "测试dynamic";

dart只有public和private权限,没有提供关键字声明,默认public,想要实现private,可以在变量名前加一个_,例如:

var a = 10;//public
var _b = 20; //private

字符串拼接:dart字符串拼接有多种方式

String s1 = "First string.....";
String s2 = "   Second string" + "ddd";
print(s1 + s2); // First string.....   Second stringddd
  // 使用换行符以及空格
  String str2 = '单引号符串'
      '换行了'
      '再加空格'
      '拼接'; 
  print("str2:$str2");// 输出结果:单引号符串换行了再加空格拼接
  // 单双引号 空格拼接
  String str3 = "单双引号空格字符串" '拼接' "~"; 
  print("str3:$str3");// 输出结果:单双引号字符串空格拼接~
  // 单双引号 换行符以及空格
  String str4 = "单双引号符串\n"
      '换行了'
      '再加空格'
      '拼接'; 
  print("str4:$str4");
  // 输出结果:单双引号符串
  //换行了再加空格拼接

dart还有一些很方便的语法结构,与java不同,类似kotlin,以下举例

int x = 12;
double y = 0;
x.toDouble();
y.toInt();
x.compareTo(y);

List:dart的list相当于java数组和list的集合体,dart中集合和数组都用list来表示

List list = [];//初始化一个空的集合,不需要new关键字
List list = [1,2,3,6];
list.add(3);
list.removeAt(0);

map:map初始化只需要{}就可以,不需要new关键字,具体存取用法与java类似

var map = {}
var map = {
  'key1' : 'value1',
  'key2': 'value2',
  'key3' : 'value3'
};
map['key4'] = 'value4';
map['key5'] = 'value5';
map['key6'] = 'value6';

enum 枚举

enum Color {
  red,
  green,
  blue
}

for循环

var list = [7, 4, 3, 'Dart', true];
 //forEach
  list.forEach((element) {
    print(element);
  });
  //for..in
  for (var item in list) {
    print(item);
  }
  //与java一样
  for (var i=0;i<list.length;i++) {
    print(list[i]);
  }

while,do while循环

var i =0;
var sum = 10;
while(i<10){
  sum+=i;
  i++;
}
do{
  sum+=i;
  i++;
}while(i<10);

条件判断:if,else if, else ,swith,case基本与java一样

var a = 10;
if (a < 9) {
  // 如果if表达式为true,则将执行语句。
}else if(a > 12){
  // 如果else if表达式为true,则将执行语句。

} else {
  // 否则将执行语句。
}
switch (a) {
  case 10:
    print("case 10");
    break;
  case 9:
    print("case 9");
    break;
  default:
    print("default");
    break;
}

2.函数

构造函数

Person person = Person(2, 3);
var map = {"x": 2, "y": 3};
Person person1 = Person.fromJson(map);
class Person {
  int x = 0;
  int y = 0;
  //普通构造函数写法
  Person(this.x, this.y);
  //命名构造函数,使用命名构造函数可以创建多个构造函数
  Person.fromJson(Map json) {
    x = json['x'];
    y = json['y'];
  }
}

箭头函数
1、对于只有一个表达式的方法,你可以选择 使用缩写语法来定义。
2、箭头函数即使只有一个参数,也不能省略括号

//无参匿名函数
anonFunc1() => print('无参匿名函数');
anonFunc1(); // 输出结果: 无参匿名函数

//anonFunc1() => print('无参匿名函数');相当于anonFunc1(){print('无参匿名函数');};

//有参匿名函数
anonFunc(name,type) => 'I am $name 类型:$type';
print(anonFunc('dart',2)); // 输出结果:  I am damon

//anonFunc(name,type) => 'I am $name 类型:$type'; 相当于 anonFunc(name,type){
//  'I am $name 类型:$type';
//  };

函数可选参数:与java不同,dart中不支持重载,java支持方法重载,dart想要实现java类似的效果,可以通过可选参数来实现

selectFunction("张三");
selectFunction("李四",type: 1);
selectFunction("王五",type: 1,money: 83.2);

void selectFunction(String name,{int? type,double? money}){
  print("名字:$name--类型:$type--金额:$money");
}
//注意dart可选参数必须要加?来表示该参数默认值为null,如果去掉?可以手动写个默认值,例如
void selectFunction(String name,{int type = 0,double? money}){
  print("名字:$name--类型:$type--金额:$money");
}
//输出结果:名字:张三--类型:null--金额:null
//名字:李四--类型:1--金额:null
//名字:王五--类型:1--金额:83.2

断言assert

//如果fullName是空的话,继续往下执行,否则打断代码执行
var fullName = '';
assert(fullName.isEmpty);
print("fullname"+fullName);

异常:dart异常(或异常事件)是在执行程序期间出现的问题。发生异常时,程序的正常流程中断,程序/应用程序异常终止。
与Java相反,所有的dart异常都是未受检异常。也就是说当调用一个可以抛出异常的方法时,不必一定去捕获这个异常。这点和Kotlin一样,都是为了简化代码,增加可读性。如果你担心这段代码真的会产生什么异常,那么可以自行捕获。
Dart2的异常是Exception或者Error(包括它们的子类)的类型,甚至可以是非Exception或者Error类,也可以抛出,但是不建议这么使用。
Exception主要是程序本身可以处理的异常,比如:IOException。我们处理的异常也是以这种异常为主。
Error是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 DartVM出现的问题。比如:内存溢出(OutOfMemoryError)等等。

//异常抛出
void testAge(int age) {
  if (age < 10) {
    // throw new FormatException("年龄不能小于 10");
    throw FormatException("年龄不能小于 10");
  }
}
//异常捕获
void finallyCatchStatementBlock() {
  int x = 18;
  int y = 0;
  int res;
  try {
    res = x ~/ y;
  } on IntegerDivisionByZeroException {
    print("Cannot divide by zero");
  } finally {
    print("Finally block executed");
  }
}

4.继承关系

dart有三种方式,分别是extends(继承),with(混入) ,implements(实现),三种可以混合使用,其中with,implements后可以多继承,用逗号隔开,extends后面只能跟一个,优先级顺序为with>extends>implements,当with,implements后跟了多个的时候,优先级最右边大于左边,依次类推,例如extends a with b,c implements d,h,优先级为c>b>a>h>d;

注意:dart无interface关键字,一般实现接口都用抽象类abstract

void main() {
  Son2 son2 = Son2();
  son2.getName();//输出结果:香蕉类
}

class Fruit {
  void getName() {
    print("水果类");
  }
}

class Apple {
  void getName() {
    print("苹果类");
  }
}

class Banana {
  void getName() {
    print("香蕉类");
  }
}

class Tangerine {
  void getName() {
    print("橘子类");
  }
}

abstract class Drink {
  void getName() {
    print("饮料类");
  }
}

class Son2 extends Fruit with Apple,Banana implements Drink {}

5.操作符

算术操作符:除法结果取整: ~/

var a =5;
var b =2;
print(a/b); //输出结果:2.5
print(a~/b); //输出结果:2

相等操作符 无三等号操作符,双等号操作符比较的是内容是否相同,而不是内存地址,如果要比较内存地址是否相同,可以用 identical

var c = 3;
var d = 3;
print(d == c);

类型判定操作符:对比java as:类型转换;is 相当于 instanceof;

var c = 3;
if (c is String) { 
  print("string类型");
}
(c as String).isNotEmpty;

赋值操作符:使用 = 操作符来赋值。 但是还有一个 ??= 操作符用来指定 值为 null 的变量的值

String value = "赋值";
var v1 ="";
dynamic v2 = "初始值";
v1 = value;   // 给 a 变量赋值
v2 ??= value; // 如果 b 是 null,则赋值给 b; 如果不是 null,则 b 的值保持不变
print('$v2');

条件表达式:?? 判断是否为空,为空执行??后面的内容

var v1 ="为空";
dynamic v2 = "初始值";
v2 = null;
var v3 = v2 ?? v1; // v2 为 null 时执行v1
print('$v3'); //输出结果:为空

级联操作符:级联操作符 (..) 可以在同一个对象上 连续调用多个函数以及访问成员变量(可以想象一下设计模式中的构建者模式,但是与构建者模式概念完全不一样,写法上类似)。

StringBuffer stringbuffer = StringBuffer();
stringbuffer
  ..write('开始')
  ..write('学习')
  ..write('\n')
  ..writeln('dart');
print(stringbuffer);

运算符重载:与c++运算符重载基本相同,比如string,int之间的+,-,>,=等内部都是通过运算符重载来实现,java内部其实已经帮我们实现了,dart中的基础运算也帮我们实现了(可以查看一下dart源码),但是dart也把运算符重载提供了出来

Point point = Point.xy(1, 2);
Point point1 = Point.xy(2, 4);
point = point + point1;
print("运算符重载x=${point.x},y=${point.y}");//输出结果:运算符重载x=3,y=6
class Point {
  int x = 0;
  int y = 0;

  Point();
  Point.xy(this.x,this.y);

  // 运算符重载
  Point operator +(Point point) {
    Point newPotin = Point();
    newPotin.x = x + point.x;
    newPotin.y = y + point.y;
    return newPotin;
  }
}

dart还有许多很方便的用法,与java,kotlin,javaScript等多种语言上很多比较方便的语法都结合在一起,这里就不多介绍了,掌握上面的基本语法后,结合自己的语法经验,实际项目使用很快就能发现出来。