安装
安装方法:
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);
print(sayHello("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));
可选参数
Dart中支持两种可选参数:命名可选参数和位置可选参数,但两种可选不能同时使用(笔者没有测试)。在SDK 1.21.0中,允许使用操作符 = 或 : 设置命名可选参数的默认值
- 命名可选参数使用大括号{},默认值用冒号
:
- 位置可选参数使用方括号[],默认值用等号
=
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);
List
初始化:
使用List的构造函数,也可以添加int参数,表示List固定长度;
或者直接用List赋值
var vegetables = new 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);
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>();
nobleGasesx[54] = 'dart';
print(nobleGasesx);
var allkeys = hawaiianBeaches.keys;
print(allkeys);
print(allkeys.contains('oahu'));
hawaiianBeaches.forEach((k, v) {
print("$k => $v");
});
迭代
Set、List、Map都继承自Iterable,都是可以迭代的。
var collection = [0, 111, 2];
collection.forEach((x) => print(x));
for(var x in collection) {
print(x);
}
类和对象
声明一个函数如下
class Point {
num x;
num y;
num z;
}
构造
构造函数,如果只是简单的参数传递,可以在构造函数参数前加this
。
也使用冒号初始化变量。
class Point {
num x;
num y;
num z;
Point(this.x, this.y, z) {
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) {}
num get delta => x - y;
}
抽象类abstract
抽象类不能实例化。
abstract class Shape {
num perimeter();
}
class Rectangle implements Shape {
final num height, width;
Rectangle(num this.height, num this.width);
@override
num perimeter() {
return null;
}
}
class Square extends Rectangle {
Square(num width) : super(width, width);
}
逻辑运算符
switch
、while
、if
和常用语言没啥区别,略。
switch参数可以是字符串也可是num。
循环 forin、foreach
var xx = [1, 2, 3, 4];
for (int i = 0; i < xx.length; i++) {
print(xx[i]);
}
xx.forEach((item) => print('$item'));
for (var x in xx) {
print('$x');
}
其他
常量
const
和final
定义的都是常量,值不能改变。
区别:
const
定义的是编译时常量,只能用编译时常量来初始化
final
定义的常量可以用变量来初始化
如:
var value1 = 100;
const i = 100;
const i = value1;
const list = const [1, 2, 3];
final v = value1;
final list2 = [1, 2, 3];
final list3 = const [1, 2, 3];
final list4 = const[new DateTime.now(),2,3];
const list5 = const[new DateTime.now(),2,3];
不可变对象
如果你要创建一个不可变的对象,你可以定义编译时常量对象。需要在构造函数前加const。
class StaticPoint {
final num x;
final num y;
const StaticPoint(this.x, this.y);
static final StaticPoint org = const StaticPoint(0, 0);
}
操作符
取整~/
长得有点特殊.
int a = 1100;
int b = 1199;
print(a ~/ b);
链式操作
Person p = new Person();
p
..name = "大白"
..setCountry("纽约");
Assert
语言内置的断言函数,如果断言失败则程序立刻终止。
异常
在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!';
} catch (e) {
print('Catch Exception: $e');
} finally {
print('Close');
}
引用库
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);