安装

安装方法:

brew tap dart-lang/dart brew install dart

#安装
➜  ~ brew tap dart-lang/dart
➜  ~ brew install dart  
#查看安装信息
➜  ~ brew info dart
dart-lang/dart/dart: stable 2.1.0, devel 2.1.1-dev.3.2
The Dart SDK
https://www.dartlang.org/
/usr/local/Cellar/dart/2.1.0 (339 files, 300.1MB) *
  Built from source on 2019-01-29 at 18:24:15
From: https://github.com/dart-lang/homebrew-dart/blob/master/dart.rb
==> Options
--devel
	Install development version 2.1.1-dev.3.2
==> Caveats
Please note the path to the Dart SDK:
  /usr/local/opt/dart/libexec

webstorm等ide需要配置dart sdk的地址。

数据类型

String

声明:

//双引号
String str2 = "it's ok";
//单引号配合转义
String str3 = 'it\'s ok';

基本使用:

//三引号多行
var str4 = """ Dart Lang 
hello world""";
//相邻字符串自动拼接,可以用`+`拼接
var str5 = "1" "2" "3";  
var str6 = "1" + "2";

StringBuffer可以高效创建字符串。

StringBuffer sb = new StringBuffer();
sb.write("Use a StringBuffer ");
sb.writeAll(['for ', 'efficient ', 'string ', 'creation ']);
sb..write('if you are ')..write('building lots of string.');
print(sb.toString());
sb.clear();

num

函数

dart世界中,函数是一等公民

String sayHello(String name) {
    return 'Hello $name!';
}
print(sayHello); //Closure: (String) => String
print(sayHello("zh")); //Hello zh!

如果函数只是简单的返回一个表达式的值,可以使用箭头语法=>expr:

sayGood(name) => "hello $name";
print(sayGood("XiaoMing"));

闭包

函数闭包: 返回值为函数的函数。

Function makeSubstract(num n) {
    return (num i) => n - i;
}
var x = makeSubstract(5);
print(x(2)); //3

可选参数

Dart中支持两种可选参数:命名可选参数和位置可选参数,但两种可选不能同时使用(笔者没有测试)。在SDK 1.21.0中,允许使用操作符 = 或 : 设置命名可选参数的默认值

  1. 命名可选参数使用大括号{},默认值用冒号:
  2. 位置可选参数使用方括号[],默认值用等号=
//可以省略返回值void 
methodX(a, b, c) {
    print('$a + $b + $c');
}
methodX(8, 8, 8);
methodY(a, b, c, [x, y = 9, z = 10]) {
    print('$a + $b + $c + $x,$y,$z');
}
methodY(1, 2, 3); //1 + 2 + 3 + null,9,10

List

初始化: 使用List的构造函数,也可以添加int参数,表示List固定长度; 或者直接用List赋值

var vegetables = new List();
//可以指定容器类型
//var fruits = new List<String>();
//或者简单的用List来赋值
var fruits = ['apples', 'oranges'];

添加、删除、排序:

var fruits = ['apples', 'oranges'];
// 添加元素
fruits.add('kiwis');
// 添加多个元素
fruits.addAll(['grapes', 'bananas']);
print(fruits);
print(fruits[1]);
print(fruits.length);
print(fruits.indexOf('element'));
print(fruits.indexOf('grapes'));
//排序
fruits.sort((a, b) => a.compareTo(b));
print(fruits);
//清空
fruits.clear();
print(fruits);

Set

无序,不能通过索引访问。

var ingredients = new Set();
ingredients.addAll(['gold', 'titanium', 'xenon']);
print(ingredients);
// 重复添加无效
ingredients.add('value');
ingredients.add('value');
print(ingredients);
//删除
ingredients.remove('value');
print(ingredients);
//判断包含
var s = ingredients.contains('gold');
print(s);
//判断包含多个元素
var s2 = ingredients.containsAll(['gold', 'titianum']);
print(s);
//集合的交集
var nobleGases = new Set.from(['xenon', 'argon']);
var intersection = ingredients.intersection(nobleGases);
print(intersection); //xenon

map

var hawaiianBeaches = {
'oahu': ['waikiki', 'kailua', 'waimanalo'],
'big island': ['wailea bay', 'pololu beach'],
'kauai': ['hanalei', 'poipu']
};
var searchTerms = new Map();
// 指定键值对的参数类型
var nobleGasesx = new Map<int, String>();
// Map的赋值,中括号中是Key,这里可不是数组
nobleGasesx[54] = 'dart';
print(nobleGasesx);
//map迭代器
var allkeys = hawaiianBeaches.keys;
print(allkeys);
print(allkeys.contains('oahu'));
//foreach(无序)
hawaiianBeaches.forEach((k, v) {
print("$k => $v");
});

迭代

Set、List、Map都继承自Iterable,都是可以迭代的。

var collection = [0, 111, 2];
collection.forEach((x) => print(x));//forEach的参数为Function
for(var x in collection) {
print(x);
}

类和对象

声明一个函数如下

class Point {
  num x;
  num y;
  num z; 
}

构造

构造函数,如果只是简单的参数传递,可以在构造函数参数前加this。 也使用冒号初始化变量。

class Point {
  num x;
  num y;
  num z;
  //构造函数 如果只是简单的参数传递,可以在构造函数的参数前加this关键字定义
  Point(this.x, this.y, z) {
    //第一个值传递给this.x,第二个值传递给this.y
    this.z = z;
  }
  //使用冒号初始化变量
  Point.fromList(var list)
      : x = list[0],
        y = list[1],
        z = list[2] {}
 }

Getter、Setter

每个字段都对应一个隐式的Getter和Setter,但是调用的时候是obj.x,而不是obj.x()。 如果字段为final或者const的话,那么它只有一个getter方法。如: num get delta => x - y;

class Point {
  num x;
  num y;
  num z;
  Point(this.x, this.y, this.z) {}
  //自定义的getter
  num get delta => x - y; 
}

抽象类abstract

抽象类不能实例化。

abstract class Shape {
    // 定义了一个 Shape 类/接口
    num perimeter(); // 这是一个抽象方法,不需要abstract关键字,是隐式接口的一部分。
}
class Rectangle implements Shape {
    final num height, width;
    Rectangle(num this.height, num this.width);
    @override
    num perimeter() {
        // TODO: implement perimeter
        return null;
    }
}
class Square extends Rectangle {
    Square(num width) : super(width, width); // 调用超类的构造函数
}

逻辑运算符

switchwhileif和常用语言没啥区别,略。

switch参数可以是字符串也可是num。

循环 forin、foreach

//循环
var xx = [1, 2, 3, 4];
for (int i = 0; i < xx.length; i++) {
print(xx[i]);
}
//foreach 或 forin
xx.forEach((item) => print('$item'));
for (var x in xx) {
print('$x');
}

其他

常量

constfinal定义的都是常量,值不能改变。

区别:

const定义的是编译时常量,只能用编译时常量来初始化 final定义的常量可以用变量来初始化

如:

var value1 = 100;
const i = 100; //ok
const i = value1; //error
const list = const [1, 2, 3]; //Ok
final v = value1; //ok
final list2 = [1, 2, 3]; //Ok
final list3 = const [1, 2, 3]; //Ok

final list4 = const[new DateTime.now(),2,3];// Error: New expression is not a constant expression.
const list5 = const[new DateTime.now(),2,3];//Error: Const variables must be initialized with a constant value

不可变对象

如果你要创建一个不可变的对象,你可以定义编译时常量对象。需要在构造函数前加const。

class StaticPoint {
  final num x;
  final num y;

  const StaticPoint(this.x, this.y); // 常量构造函数
  static final StaticPoint org = const StaticPoint(0, 0); // 创建一个常量对象不能用new,要用const
}

操作符

取整~/长得有点特殊.

//取整
int a = 1100;
int b = 1199;
print(a ~/ b); //0   ,相当于11001199取整,舍去余数

链式操作

 Person p = new Person();
  p
    ..name = "大白"
    ..setCountry("纽约");

Assert

语言内置的断言函数,如果断言失败则程序立刻终止。

assert(str1 != 'ok');

异常

在Dart中可以抛出非空对象(不仅仅是Exception或Error)作为异常。

try {
    throw 'This a Exception!';
  } on Exception catch (e) {
    print('Unknown exception: $e');
  } catch (e) {
    print('Unknown type: $e');
  }

  try {
    throw 'This a Exception!'; //0
  } catch (e) {
    //删除catch语句,只用try...finally报错
    print('Catch Exception: $e'); //1
  } finally {
    print('Close'); //2
  }

引用库

Dart中任何文件都是一个库,即使你没有用关键字library声明。 dart:前缀表示Dart的标准库,如dart:io、dart:html。当然,你也可以用相对路径或绝对路径的dart文件来引用import 'lib/student/student.dart';

import 'lib/student/student.dart';
var random = Random().nextInt(99);
print(random);