Flutter Dart语言(05)异步

这篇具有很好参考价值的文章主要介绍了Flutter Dart语言(05)异步。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0 说明

该系列教程主要是为有一定语言基础 C/C++的程序员,快速学习一门新语言所采用的方法,属于在C/C++基础上扩展新语言的模式。

1 async和await

在Dart语言中,虽然没有像其他语言(如Java、C++、Python)中的传统多线程概念,但它采用了异步(asynchronous)编程模型来处理并发任务。Dart使用async和await关键字来支持异步操作,这可以在很大程度上达到类似多线程的效果,但实际上是基于单线程的事件循环机制。

异步主要涉及2个关键词:async和await。async 是让方法变成异步,await是等待异步方法执行完。两个关键字的约束如下:

  • 只有async方法才能使用await关键字去调用方法。
  • 如果调用别的async方法必须使用await关键字。

这里以一个http服务为例来解读这两个关键字的使用,代码如下所示:

import 'dart:convert';
import 'package:http/http.dart' as http;

void main() async {
  // 发起HTTP GET请求
  final response = await http.get(
        Uri.parse('https://jsonplaceholder.typicode.com/posts/1'));

  if (response.statusCode == 200) {
    final responseData = json.decode(response.body);
    print('Title: ${responseData['title']}');
    print('Body: ${responseData['body']}');
  } else {
    print('Request failed with status: ${response.statusCode}');
  }
}

2 隔离 Isolate机制

在Dart中本身是没有多进程概念的,但可以使用Isolate隔离机制来实现多进程效果。Isolate是一种轻量级的并发执行单元,可以在不同的线程中运行代码(说明:每个isolate 都有一个完整的事件循环机制,每个隔离区都有自己的内存堆,确保每个隔离区的状态都不会被其他隔离区访问,隔离这种机制更像是进城而非线程)。这里制作一个demo,模拟 主线程循环输出aaa,子线程循环输出bbb,各输出5次,代码实现如下所示:

import 'dart:isolate';

void main() {
  startChildIsolate();

  for (var i = 0; i < 5; i++) {
    print("aaa");
    sleep(Duration(seconds: 1));
  }
}

void startChildIsolate() async {
  final isolate = await Isolate.spawn(childIsolate, null);
}

void childIsolate(dynamic message) {
  for (var i = 0; i < 5; i++) {
    print("bbb");
    sleep(Duration(seconds: 1));
  }
}

命令执行效果如下所示:

Connecting to VM Service at ws://127.0.0.1:59390/qHZyzE0WjeQ=/ws
aaa
bbb
aaa
bbb
aaa
bbb
aaa
bbb
---------

3 Isolate 隔离-双向通讯

这里主要通过Isolate机制构建了一个主线程和一个子线程并进行双向通信,主要使用SendPort和ReceivePort。代码实现如下:

import 'dart:isolate';

var anotherIsolate;

void startMainIsolate() async {
  var receivePort = ReceivePort();
  var sendPort;

  anotherIsolate = await Isolate.spawn(threadIsolateInit, receivePort.sendPort);

  receivePort.listen((date) {
    if (date is SendPort) {
      sendPort = date;
      print("双向通讯建立成功");
      return;
    }
    print("主线程 接收消息:data = $date");
    sendPort.send("XXXXX");
  });
}

void threadIsolateInit(SendPort sendPort) async {

  var receivePort = ReceivePort();
  print("子线程 接受到来自 主线程的port,尝试建立同主线程的双向通讯");

  receivePort.listen((date) {
    print("子线程接收消息:data = $date");
  });

  sendPort.send(receivePort.sendPort);

  for (var index = 0; index < 10; index++) {
    sendPort.send("子线程 发送消息:$index");
  }
}

void main() {
  startMainIsolate();
}

运行效果如下:文章来源地址https://www.toymoban.com/news/detail-631303.html

onnecting to VM Service at ws://127.0.0.1:60037/CvPyFfwECy8=/ws
子线程 接受到来自 主线程的port,尝试建立同主线程的双向通讯
双向通讯建立成功
主线程 接收消息:data = 子线程 发送消息:0
主线程 接收消息:data = 子线程 发送消息:1
主线程 接收消息:data = 子线程 发送消息:2
主线程 接收消息:data = 子线程 发送消息:3
子线程接收消息:data = XXXXX
主线程 接收消息:data = 子线程 发送消息:4
子线程接收消息:data = XXXXX
主线程 接收消息:data = 子线程 发送消息:5
子线程接收消息:data = XXXXX
主线程 接收消息:data = 子线程 发送消息:6
子线程接收消息:data = XXXXX
主线程 接收消息:data = 子线程 发送消息:7
子线程接收消息:data = XXXXX
主线程 接收消息:data = 子线程 发送消息:8
子线程接收消息:data = XXXXX
主线程 接收消息:data = 子线程 发送消息:9
子线程接收消息:data = XXXXX
子线程接收消息:data = XXXXX
子线程接收消息:data = XXXXX
子线程接收消息:data = XXXXX

到了这里,关于Flutter Dart语言(05)异步的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Flutter】Flutter Dart 获取当前时间戳

    在日常的软件开发中,我们经常需要获取当前的时间戳。无论是用于日志记录,还是用于生成唯一标识符,或者是用于时间同步,时间戳都发挥着重要的作用。 本文将详细介绍如何在 Flutter 和 Dart 中获取当前时间戳。 通过阅读本文,你将掌握以下知识: 了解时间戳的重要性

    2024年02月12日
    浏览(27)
  • Flutter系列文章-Flutter环境搭建和Dart基础

    Flutter是Google推出的一个开源的、高性能的移动应用开发框架,可以用一套代码库开发Android和iOS应用。Dart则是Flutter所使用的编程语言。让我们来看看如何搭建Flutter开发环境,并了解Dart语言的基础知识。 1. 安装Flutter SDK 首先,访问Flutter官网下载Flutter SDK。选择适合你操作系统

    2024年02月15日
    浏览(33)
  • Flutter学习2 - Dart

    Dart语言特点: Dart 2.0 开始便是强类型语言,而且是静态类型的(可以类比Java,C#等) 强类型语言的优点:所有类型的检查必须在编译的时候完成 前端开发的 js 语言是弱类型的语言 强类型的语言需要在定义的时候指定类型,如果不指定,编译器也可以在赋值的时候推断出变

    2024年02月21日
    浏览(32)
  • 【Flutter】Dio 强大的Dart/Flutter HTTP客户端

    Dio是一个强大的Dart/Flutter HTTP客户端,支持全局配置、拦截器、FormData、请求取消、文件上传/下载、超时等功能。 首先,

    2024年02月11日
    浏览(33)
  • 无涯教程-Flutter - Dart简介

    Dart是一种开源通用编程语言,它最初是由Google开发的, Dart是一种具有C样式语法的面向对象的语言,它支持诸如接口,类之类的编程概念,与其他编程语言不同,Dart不支持数组, Dart集合可用于复制数据结构,例如数组,泛型和可选类型。 以下代码显示了一个简单的Dart程序

    2024年02月10日
    浏览(38)
  • 【Flutter】Dart/Flutter SDK如何降低版本、回退到指定版本

    因为dart3.0以后不再支持 no-sound-null-safety;但是有些项目不得以切换到dart3.0以前继续使用运行项目 方法1: 通过 命令,将flutter降级为当前通道的上一个活动版本; 如果没有存在老版本则会提示 flutter downgrade There is no previously recorded version for channel “stable”. 这样的话则可以通

    2024年02月16日
    浏览(26)
  • 【Flutter】dart构造函数、工厂构造函数

    在OOP中,我们会使用类来定义一类对象的属性,和行为。通过调用该类的构造函数来创建类的实例对象。在通过调用方法来实现操作行为。 和大多数 OOP 语言一样, dart 的构造函数,采用和类同名的函数名作为构造函数, 不显示声明构造函数会自动创建无参构造,构造函数不

    2024年01月21日
    浏览(24)
  • Flutter 四:main.dart简单介绍

    main.dart简单介绍 运行结果

    2024年02月03日
    浏览(26)
  • 【第二章 flutter学习之Dart介绍】

    Dart是谷歌开发的计算机编程语言,诞生于2011,可以被用于web、服务器、移动应用、物联网应用的开发。要学习flutter必须会Dart 安装 Dart Sdk vscode安装dart

    2024年02月12日
    浏览(29)
  • flutter dart json 转model用法

    定义model: 使用方法:

    2024年02月11日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包