Flutter入门篇(三):dart语言(3)

参考:https://zhuanlan.zhihu.com/p/83387088

https://zhuanlan.zhihu.com/p/83781258


一.库--------------library

和python类似,可以有as

import 'lib/student/student.dart' as Stu;

1.导入-------------import

import '库所在的uri';//Uniform Resource Identifier统一资源标识符,注意有引号

URI分为三种

dart标准版dart:io、dart:html、dart:math、dart:core
相对路径自定义的library,如
import 'lib/student/student.dart';
Pub库前缀package, 如
import 'package:flutter/material.dart';

 2.显示和隐藏-----------show&hide

import 'lib/student/student.dart' show Student, Person;//只显示student和Person

import 'lib/student/student.dart' hide Person;//隐藏Person

 3.定义

library math;

 4.库的打包

sum库

int sum(int num1, int num2) {
  return num1 + num2;
}

dateFormat库

String dateFormat(DateTime date) {
  return "2020-12-12";
}

这里的export有点像c++里的extern

library utils;

export "mathUtils.dart";
export "dateUtils.dart";

之后我们只要导入utils就能调用sum和dateFormat了

import "lib/utils.dart";

main(List<String> args) {
  print(sum(10, 20));
  print(dateFormat(DateTime.now()));
}

二.异步

dart是单线程的,实现异步靠的是事件循环

事件循环会执行微任务列表和事件列表中的事件,其中微任务优先级高于事件列表任务

1.future

future是一个实现异步的API,执行future内部的操作是不占用线程时间,等到完成操作后会返回一个值或者抛出异常。

.then()是成功回调函数

.catchError是错误回调函数


Future<String> getNetworkData() {
  return Future<String>(() {
    sleep(Duration(seconds: 3));//这里的等待不会造成阻塞
    // 不再返回结果,而是出现异常
    // return "network data";
    throw Exception("网络请求出现错误");
  });
}

 执行完后如果正确就执行then里的内容否则执行catchError

import "dart:io";

main(List<String> args) {
  print("main function start");
  var future = getNetworkData();
  future.then((value) {
    print(value);
  }).catchError((error) { // 捕获出现异常时的情况
    print(error);
  });
  print(future);
  print("main function end");
}

 2.future补充

Future.value(value)

直接获取一个完成的future,会直接调用then回调函数

main(List<String> args) {
  print("main function start");

  Future.value("哈哈哈").then((value) {//加到事件队列里
    print(value);
  });

  print("main function end");
}

执行结果

main function start
main function end
哈哈哈

Future.error(object)

Future.delayed(时间, 回调函数)

main(List<String> args) {
  print("main function start");

  Future.delayed(Duration(seconds: 3), () {
    return "3秒后的信息";
  }).then((value) {//3秒后再执行
    print(value);
  });

  print("main function end");
}

 3.await和async

之前的方法是构造一个对象,然后再执行回调函数。但是有时候我们希望用同步的形式去实现异步,也就是直接返回一个我们想要的值并且不占用线程

//函数必须用async(异步)修饰,返回是一个future对象
Future<String> getNetworkData() async {
  
  //在这个构造函数前面加上await(等一下,等运行的结果的意思),将返回值给result
  var result = await Future.delayed(Duration(seconds: 3), () {
    return "network data";
  });

  return "请求到的数据:" + result;
}

main(List<String> args) {
  print("main function start");
  print(getNetworkData());//直接打印结果,而之前是打印对象
  print("main function end");
}

4.创建微任务

import "dart:async";

main(List<String> args) {
  scheduleMicrotask(() {
    print("Hello Microtask");
  });
}

 5.Isolate

我们已经知道dart是单线程的,这个线程有自己可以访问的内存空间以及事件循环,我们就可以将这个空间系统称之为一个Isolate

Iso之间不共享任何资源,只能依靠信息机制通信

创建:

import "dart:isolate";

main(List<String> args) {
  Isolate.spawn(foo, "Hello Isolate");//spawn---产卵
}

void foo(info) {
  print("新的isolate:$info");
}

 单向通信:

先创建一个管道再将管道传给创建的Isolate,再用管道的监听功能监听创建的Isolate返回的信息

监听到了就关掉管道。此为单项通信(创建的Isolate--->主Isolate)

import "dart:isolate";

main(List<String> args) async {
  // 1.创建管道
  ReceivePort receivePort= ReceivePort();

  // 2.创建新的Isolate
  Isolate isolate = await Isolate.spawn<SendPort>(foo, receivePort.sendPort);

  // 3.监听管道消息
  receivePort.listen((data) {
    print('Data:$data');
    // 不再使用时,我们会关闭管道
    receivePort.close();
    // 需要将isolate杀死
    isolate?.kill(priority: Isolate.immediate);
  });
}

void foo(SendPort sendPort) {
  sendPort.send("Hello World");
}

双向通信:

 flutter提供了支持并发计算的compute函数,内部封装了双向通信和Isolate的创建

main(List<String> args) async {
  int result = await compute(powerNum, 5);
  print(result);
}

int powerNum(int num) {
  return num * num;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值