链接地址

Dart语言基础-1

Dart语言基础-2
Dart学习-操作符

Dart数据类型

在Dart里是强类型的,也有自动推断类型的机制
定义变量使用:var, const, dynamic, Object, 类型等方式

//基本类型
import 'dart:math';

var name = 'Voyager I';
var antennaDiameter = 3.7;
const image = {
  'tags': ['Jupiter', 'Saturn', 'Uranus', 'Neptune'],
  'url': '//path/to/saturn.jpg'
};

//函数类型
String sayHello(var name) {
  return 'Hello $name!';
}

//箭头函数
var add = (a, b) => a + b;

// 类似 Promise
Future sum(num a, num b) async {
  return await add(a, b);
}

// main
void main() async {
  print(sayHello(name)); //Hello Voyager I!
  print(max(1, 2)); //2
  sum(1, 2).then((res) => print(res)); // 3 (类似 Promise)
}

Object name1 = "小明";
dynamic name2 = "老王";

基本数据类型

  • number
  • string
  • boolean
  • list
  • map
  • rune
  • symbol
int x = 1;
double y = 1.1;
num z = 1.2;
String x2 = 'abc';
enum Color { red, green, blue }

const msPerSecond = 1000;
bool flag = false;
var list = [1, 2, 3];
List arr = [1, 2, 3];
List<String> names = ['a', 'b', 'c']; //泛型
var constantList = const [1, 2, 3];

Map nobleGases = const {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};

var gifts = {
  'first': 'partridge',
  'second': 'turtledoves',
  'fifth': 'golden rings'
};

void test() {
  print(gifts['firsts']);
}

函数

int add(int a, int b) {
  return a + b;
}

//类型可省略
add2(a, b) {
  return a + b;
}

//箭头函数
var add3 = (a, b) => a + b;

int add6(int a, int b) => a + b;

// 可选参数,使用[]限定
int add4(int a, int b, [int c = 1, int d = 2]) => a + b + c + d;

//显示指定的参数名称,默认参数
int add7({int a = 1, int b = 2}) {
  return a + b;
}

void test1() {
  add7(a: 1, b: 2);
}

//回掉函数
var list = ['apples', 'bananas', 'oranges'];

test() {
  list.forEach((item) {
    print('%{list.indexOf(item)}:$item');
  });

  list.forEach((item) => print(item));
}

//闭包
Function makeAdder(int addBy) {
  return (int i) => addBy + i;
}

操作符

例外有三个特色的操作:is、as、is?。

is 用于判断类型,as 用于续言、is? 与 is 相反。

var gifts = {
  'first': 'partridge',
  'second': 'turtledoves',
  'fifth': 'golden rings'
};

getGifts() {
  return gifts;
}

test() {
  //不使用级联符号
  var g = getGifts();
  g.first = 1;
  g.seoncd = 2;
  g.fifth = 3;
  // 使用级联符号
  getGifts()
    ..first = 1
    ..second = 2
    ..fifth = 3;
}

算术运算符

操作符

含义

+


-


-expr

相反

*


/


~/

返回一个整数值的除法

%

取余,除法剩下的余数

if(amp is Person) {
emp.firstName = ‘永动机’;
}

赋值操作符

// 赋值给a
a = value;
// 如果b为空,则将值分配给b;否则,b保持不变
b ??= value;

条件表达式

var visibility = isPublic ? ‘public’ : ‘private’;
// 稍微长一点的版本使用 ?:操作符
String playerName(String name) => name != null ? name : ‘Guest’;

如果布尔表达式为空,考虑使用??
String playerName(String name) => name ?? ‘Guest’;
//非常长的if-else语句的版本
String playerName(String name) {
if(name != null) {
return name;
} else {
return ‘Guest’;
}
}

级联符号

querySelector(’#confirm’) // 获取一个对象
…text = ‘Confirm’; //使用它的成员
…classes.add(‘important’)
…onClick.listen((e)=>window.alert(‘Confirmed!’);

其它操作符

操作符

名称

含义

()

函数应用

表示函数调用

[]

列表访问

指列表中指定索引处的值

.

成员访问

foo.bar

?.

条件成员访问

跟.差不多, 但是最左边的操作数可以为空;例子:foo?.bar从表达式foo中选择属性bar, 除非foo为空(在这种情况下,foo?.bar值为空)

控制流程

isRaining() {
  return false;
}

isShowing() {
  return true;
}

test() {
  if (isRaining()) {
    // ...
  } else if (isShowing()) {
    // ...
  } else {
    // ...
  }

  var message = new StringBuffer('Dart is fun');
  for (var i = 0; i < 5; i++) {
    message.write('!');
  }

  var collection = [0, 1, 2];
  for (var x in collection) {
    print(x); //0  1 2
  }
}

类结构

Dart 的类支持继承、静态方法、接口、构造函数、重载操作符、抽象类、接口类、 mixins等。
Dart 的类不支持什么 public、private 这些。_method 下划线代表私有方法。

class X {
  num x, y;

  X(x, y) {
    this.x = x;
    this.y = y;
  }

  void say() {
    print(this.x + this.y);
  }
}

class Point extends X {
  num x;
  num y;

  final int k = 1; //无法被实例修改值

  static const int initialCapacity = 16; //静态常量

  // 静态方法

  static add() {
    //...
  }

  //构造函数,用:super(arg) 调用父类的构造函数
  // 等效=>Point(this.x, this.y):super(x, y);
  Point(x, y) : super(x, y) {
    super.say(); //调用父类的方法
    this.x = x;
    this.y = y;
  }

  Point.origin() : super(null, null);


  //命名构造函数
  get xx => this.x;

  set xx(v) => this.x = xx;


  @override
  void say() {
    // TODO: implement say
    super.say();
  }
  
}

重载函数

class Vector {
  final int x, y;

  const Vector(this.x, this.y);

  Vector operator +(Vector v) {
    return new Vector(x + v.x, y + v.y);
  }

  Vector operator -(Vector v) {
    return new Vector(x - v.x, y - v.y);
  }
}

实现接口类

class Person {}

class Impostor implements Person {
  get _name => '';

  String greet(String who) => 'Hi $who. Do you knnow who I am?';
}

使用with关键字

class Performer {
  String perform;
}

class Musical {
  String music;
}

class Musician extends Performer with Musical {
  test() {
    print(this.perform);
    print(this.music);
  }
}

泛型

var names = <String>['Seth', 'Kathy', 'Lars'];
var pages = <String, String>{
  'index.html': 'Homepage',
  'robots.txt': 'Hints for web robots',
  'humans.txt': 'We are people, not machins'
};

var names2 = new List<String>();

test() {
  names2.addAll(['Seth', 'Kathy', 'Lars']);
  //names2.add(42);   ---> error
  print(names2 is List<String>);
}

//泛型函数
T first<T>(List<T> ts) {
  T tmp = ts[0];
  return tmp;
}

//泛型类
abstract class Cache<T> {
  T getByKey(String key);

  void setByKey(String key, T value);
}

导入模块

import 'dart:math';
import 'dart:math' as math;
import 'dart:math' show min;
import 'dart:math' deferred as math2;
import 'mymath.dart' as math3;

test() {
  max(1, 2);
  math.max(1, 2);
  min(1, 2);
}

Future greet() async {
  await math2.max(1, 2);
}

test2() {
  math3.max(1, 2);
}

异步编程

在 ES6 与异步相关的就是 Promise、async、await。而在 Dart 则是 Future、async、await。

Dart库充满了返回 Future 或 Stream 对象的函数。这些功能是异步的:它们在设置可能耗时的操作(例如 I/O)之后返回,而不等待该操作完成。 在 async 和 await 关键字支持异步编程,让你写异步代码看起来类似于同步代码。

使用 async/await 之前需要引入 dart:async 模块。

JSON操作

// 把对象转为json字符串
var jsonStr = json.encode([
  1,
  2,
  {"a": num}
]);

// 把json字符串转为对象
var decoded = json.decode('["foo", {"bar":499}]');

正则表达式

RegExp exp = new RegExp(r"(\w+)");

// 返回正则表达式匹配项的可迭代对象
exp.allMatches("abc def ghi");

// 搜索并返回第一个匹配项,没有则返回null
exp.firstMatch("");

// 正则表达式是否找到匹配项
exp.hasMatch("as");

// 从第几个字符开始匹配正则表达式
exp.matchAsPrefix("ab cd", 3);

// 返回正则表达式的第一个匹配字符串
exp.stringMatch("abc de");

// 返回正则表达式的字符串表示
exp.toString();

Stream

  • Stream.fromFuture :从Future创建新的订阅流,当future完成时将出发一个data或者error,然后使用down事件关闭这个流
  • Stream.fromFutures:从一组Future创建一个单订阅流,每个future都有自己的data或者error事件,当整个futures完成后,流将会关闭。如果Futures为空,流将会立刻关闭。
  • Stream.fromIterables:创建一个集合中获取其数据的单订阅流

监听Stream的方法

  • onData(必填) 收到数据时触发
  • onError 收到error的触发
  • onDone 结束时触发
  • unsubscribeOnError 遇到第一个error时是否取消订阅,默认为false

StreamController

//任意类型的流
StreamController controller = StreamController();
controller.sink.add(123);
controller.sink.add("xyz");
controller.sink.add(Anything);

//创建一条处理int类型的流
StreamController<int> numController = StreamController();
numController.sink.add(123);

StreamController controller = StreamController();
//监听这个流的出口,当有data流出时,打印这个data
StreamSubscription subscription = controller.stream.listen((data)=>print("$data");
controller.sink.add(123);



StreamController<int> controller = StreamController<int>();

final transformer = StreamTransformer<int, String>.fromHandlers(
	handleData:(value, sink){
		if(value == 100){
			sink.add("you are write");
		} else {
			sink.addError("not yet, try again!");
		}
	}
);

controller.stream
	.transform(transformer)
	.listen((data)=>print(data), onError:(err)=>print(err));

Stream的种类
流的两种:

  • “Single-subscription” streams 单订阅流
StreamController controller = StreamController();
controller.tream.listen((data)=>print(data));
controller.tream.listen((data)=>print(data));

controller.sink.add(123);
  • “broadcast” streams 多订阅流
StreamController controller = StreamController();
//将单订阅流转化为广播流
Stream stream = controller.stream.asBroadcastStream();

stream.listen((data)=>print(data));
stream.listen((data)=>print(data));

controller.sink.add(123);


阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6