dart 语法进阶

2022-09-23  本文已影响0人  朱允见

1. 接口 abstract implements java 中是interface

abstract class Processor {
  late String cores;
  arch(String name) {}
}

abstract class Camera {
  late String resolution;
  brand(String name);
}

class Phone implements Processor, Camera {
  @override
  arch(String name) {
    print(name);
  }

  @override
  brand(String name) {
    print(name);
  }

  @override
  String cores;

  @override
  String resolution;

  Phone()
      : cores = '3',
        resolution = 'name';
}

void main() {
  print("hello world");

  var phone = Phone();
}

2. mixin 提高代码的复用度

//  class  mixin
class MixinA {
  String name = 'MixinA';
  void showInfo() {
    print(name);
  }
}

mixin MixinB {
  // MixinB(); 用作混入的类不能有构造函数
  String name = 'MixinB';
  void showInfo() {
    print(name);
  }
}

class MixinTest with MixinA, MixinB {}

void main() {
  print("hello world");

  var mixinTest = MixinTest();
  print(mixinTest.name);
}

3. extension 扩展

//扩展内置类
extension StringExt on String {
  int parseInt() {
    return int.parse(this);
  }
}

//扩展自定义类
class Person {
  final String name;
  Person(this.name);
}

extension PersonExt on Person {
  info() {
    print(this.name);
  }
}

4. call

5. noSuchMethod

class Person {
  final String name;
  Person(this.name);

  @override
  noSuchMethod(Invocation invocation) {
    return super.noSuchMethod(invocation);
  }
}

void main(List<String> args) {
  //dynamic 修饰
  dynamic p = Person('zhu');
  p.say();
}

6. hashCode

7. typedef

typedef MathOperation = Function(int a, int b);
fn1(int a, b) {
  return a + b;
}
void main(List<String> args) {
  if (fn1 is MathOperation) {
    print('true');
  } else {
    print('false');
  }
}

8.eventLoop 事件轮询机制

image.png image.png

9 isolate

image.png
9.1 isolate 多线程-创建
import 'dart:isolate';
/*
entryPoint : 必须是一个顶层方法或静态方法
message:
  1. dart 原始类型 eg:null,int,String ...
  2. SendPort 实例 ReceivePort().sendPort 
  3. 包含 1 和 2 的list、 map 可以嵌套

*/
static Future<Isolate> spawn<T>(void entryPoint(T message), T message);

 
import 'package:flutter/foundation.dart'
compute();
9.2 多线程通信机制-Port
import 'dart:isolate';

void main(List<String> args) {
  test();
}

test() {
  print('---start---');
  print(Isolate.current.debugName);
  //创建接收端口
  ReceivePort receivePort = ReceivePort();
  //建立监听
  receivePort.listen((message) {
    print('listen: $message');

    //关闭监听
    receivePort.close();
  });

  //获取发送端口
  SendPort sendPort = receivePort.sendPort;

  Isolate.spawn(mutilThead, sendPort);

  print('---end---');
}

void mutilThead(message) {
  print(Isolate.current.debugName);
  print(message);

  SendPort sendPort = message as SendPort;
  sendPort.send('mutilThead 发来的消息');
}
image.png
import 'dart:isolate';

void main(List<String> args) async {
  print('---start---');
  print(Isolate.current.debugName);
  //创建接收端口
  ReceivePort r1 = ReceivePort();
  //建立监听

  //获取发送端口
  SendPort p1 = r1.sendPort;
  Isolate.spawn(newThead, p1);

  SendPort p2 = await r1.first;
  var msg = await sendToReceive(p2, 'hello');
  print('主线程接收到:$msg');

  print('---end---');
}

Future sendToReceive(SendPort sendPort, dynamic msg) async {
  print('${Isolate.current.debugName} 发送消息: $msg');
  ReceivePort receivePort = ReceivePort();
  sendPort.send([receivePort.sendPort, msg]);
  return receivePort.first;
}

void newThead(SendPort p1) async {
  var r2 = ReceivePort();
  p1.send(r2.sendPort);

  await for (var msg in r2) {
    var data = msg[1];
    print('新线程收到了主线程的消息:$data');
    SendPort replyPort = msg[0];

    //回复消息
    replyPort.send('子线程答复->$data');
  }
}
/*
 ---start---
main
main 发送消息: hello
新线程收到了主线程的消息:hello
主线程接收到:子线程答复->hello
---end--- 
 */

10.Future (类似js 中的Promise)

10.1初始
void main(List<String> args) {
  test();
}

void test() {
  print('start');
  var myFuture = Future.delayed(Duration(seconds: 3), () {
    throw '异常数据';
  });

  myFuture.then((value) => print(value)).catchError((error) {
    print('error : ' + error);
  }, test: (error) => error.runtimeType == String).whenComplete(
      () => print('complate'));
  print('end');
}
/*
start
end
error : 异常数据
complate
*/
10.2 Future执行顺序
10.3 多任务
10.4. FutureBuilder - snapshot
  1. snapshot.connectionState
  1. snapshot.hasData

  2. snapshot.hasError

11.Stream

11.1 Stream 概念

Stream 是Dart 中异步数据流,可以连续不断地返回多个数据。

Stream 相关的API

11.2 Stream 类型

Single-Subscription (单一订阅)

import 'dart:async';

void main(List<String> args) {
  //创建一次订阅数据流控制器
  StreamController streamController = StreamController();

  //一次监听 只能监听一次
  streamController.stream.listen((event) {
    print('接收到数据:$event');
  });

  //sink数据槽 添加数据
  streamController.sink.add('123');
  streamController.sink.add('abc');
  /*
接收到数据:123
接收到数据:abc
  */
}

Broadcase (广播)

import 'dart:async';

void main(List<String> args) {
  //创建多次订阅数据流控制器
  StreamController streamController = StreamController.broadcast();

  streamController.stream.listen((event) {
    print('第一次监听接收到数据:$event');
  });

  //sink数据槽 添加数据
  streamController.sink.add('123');

  streamController.stream.listen((event) {
    print('第二次监听接收到数据:$event');
  });
  streamController.sink.add('abc');

/*
第一次监听接收到数据:123
第二次监听接收到数据:abc
第一次监听接收到数据:abc
*/
}

11.3 创建 Stream 实例

StreamController 类

Stream 类

Future<String> getFuture() async {
  await Future.delayed(Duration(seconds: 2), () {});
  return DateTime.now().toString();
}

void main(List<String> args) async {
  Stream.fromFuture(getFuture()).listen((event) {
    print('fromFuture 接收到数据 : $event');
  }, onDone: () {
    print('fromFuture onDone');
  });

  Stream.fromFutures([getFuture(), getFuture(), getFuture()]).listen((event) {
    print('fromFutures 接收到数据 : $event');
  });

  Stream.fromIterable([123, 'acb', null]).listen((event) {
    print('fromIterable 接收到数据 : $event');
  });
}
/*
fromIterable 接收到数据 : 123
fromIterable 接收到数据 : acb
fromIterable 接收到数据 : null
fromFuture 接收到数据 : 2022-09-21 23:01:08.346103
fromFuture onDone
fromFutures 接收到数据 : 2022-09-21 23:01:08.355317
fromFutures 接收到数据 : 2022-09-21 23:01:08.355797
fromFutures 接收到数据 : 2022-09-21 23:01:08.355834
*/

Stream.periodic();

void main(List<String> args) {
  // Stream.periodic(Duration(seconds: 1), (int data) => data).listen((event) {
  //   print('收到数据:$event'); //收到数据:null
  // });

  Stream.periodic(Duration(seconds: 1), (int data) => data).take(5) //接收5次数据
      .listen((event) {
    print('收到数据:$event');
  }, onDone: () => print('periodic done'));
  /*
收到数据:0
收到数据:1
收到数据:2
收到数据:3
收到数据:4
periodic done
*/
}

11.4 Stream 操作

12.Generator(生成器)

概念:生成器是有一种特殊的函数,返回值通过yield 关键词来指定

分类

void main(List<String> args) {
  var nums = getNumber(5).iterator;

  while (nums.moveNext()) {
    print(nums.current);
  }
}

Iterable<int> getNumber(int n) sync* {
  print('start');
  var i = 0;
  while (i < n) {
    yield i++;
  }
  print('end');
/*
start
0
1
2
3
4
end
*/  
}

异步生成器(async + yield)

void main(List<String> args) {
  print('start');
  var stream = getNumbers(5);
  stream.listen((event) {
    print('接收到数据:$event');
  }, onDone: () {
    print('done');
  });
  print('end');
  /*
start
end
接收到数据:0
接收到数据:1
接收到数据:2
接收到数据:3
接收到数据:4
done 
  */
}

Stream<int> getNumbers(int n) async* {
  var i = 0;
  while (i < 5) {
    yield i++;
  }
}

递归生成器 (yeild*)

void main(List<String> args) {
  print('start');
  var res = getRange(1, 5);
  res.forEach((element) {
    print(element);
  });
  print('end');
}

Iterable<int> getRange(int start, int end) sync* {
  if (start <= end) {
    yield start;

    // for (var j in getRange(start + 1, end)) {
    //   yield j;
    // } //等价写法
    yield* getRange(start + 1, end);
  }
  /*
start
1
2
3
4
5
end  
  */
}

上一篇下一篇

猜你喜欢

热点阅读