当前位置: 首页 > news >正文

Flutter开发 dart异步

Future

Future表示在将来某时获取一个值的方式。当一个返回Future的方法被调用时,该方法会把要执行的某事件放入队列,并返回一个未完成的Future对象,该事件执行完毕后,Future对象的状态会自动变成已经完成,此时可以通过then链式调用或async和awit获取该事件的返回值。
(1)异步读文件
在这里插入图片描述
在pubspec.yaml中添加文件

flutter:assets:- temp/test.txt

test.txt

hello word

代码

import 'dart:io';//不要使用main.dart
void main() {String fileName = "temp/test.txt";//callbak:成功执行//onError:失败readFile(fileName).then((value) {print(value);},onError: (e){print("读取文件异常");});
}//readAsString异步读取文件
Future<String> readFile(String filename) {File file = File(filename);return file.readAsString();
}输出:
hello word

(2)同步读文件

void main() {String s = readFileSync(fileName);print(s);
}String readFileSync(String filename){File file =  File(filename);String info = file.readAsStringSync();return info;
}

async和await

让异步任务的执行看起来跟同步代码的执行顺序一致。

void main() {String fileName = "temp/test.txt";print("start");readFile(fileName).then((value) {print(value);},onError: (e){print("读取文件异常");});print("end");
}Future<String> readFile(String filename) {File file = File(filename);return file.readAsString();
}输出start
end
hello word

使用await后

void main() async {String fileName = "temp/test.txt";print("start");String info = await readFile(fileName);print(info);print("end");
}Future<String> readFile(String filename) {File file = File(filename);return file.readAsString();
}start
hello word
end

async的作用就是标记一个方法是异步方法,await的作用是等待异步任务的结果。

  1. await只能在标记了async的一部方法中使用
  2. 当使用async作为方法名后缀声明时,说明这个方法的返回值是一个Future类型。
  3. 当执行到该方法中用await标注的代码时,会暂停该方法其他部分的代码执行。
  4. 当await标注的代码引用的Future类型返回值执行完成,awit标注的代码后的下一行代码会立即执行。

Stream

Future表示一次异步获得的数据。Stream实现异步事件流的处理,它表示多次异步获得的数据。
Stream方式读取文件内容时,一般情况下每次可以读取一部分数据,并进行相应的处理。

void main()  {String fileName = "temp/test.txt";Stream stream = getContent(fileName);stream.listen((event) {//获取数据print(event);},onError: (e){//错误},onDone: (){//完成});
}Stream getContent(String fileName){File file = File(fileName);return file.openRead();
}输出
[104, 101, 108, 108, 111, 32, 119, 111, 114, 100]
http://www.dtcms.com/a/312887.html

相关文章:

  • Linux网络编程 ---五种IO模型
  • 基于 Spring Boot + Vue 实现人脸采集功能全流程
  • Python----大模型(从预训练到分布式优化的核心技术解析)
  • 2、RabbitMQ的5种模式基本使用(Maven项目)
  • 迈向透明人工智能: 可解释性大语言模型研究综述
  • ubuntu apt安装与dpkg安装相互之间的关系
  • Python 实例属性与方法命名冲突:一次隐藏的Bug引发的思考
  • 途游Android面试题及参考答案
  • 【GitHub探索】Agent开发平台CozeStudio开源版本踩坑体验
  • pycharm上如何添加conda环境
  • 嵌入式 C 语言入门:多文件编程实践笔记 —— 从文件创建到调用
  • 为何:内存数据断电即逝,硬盘数据牢笼长存
  • LangChain框架概念及简单的使用案例
  • ABP VNext + CloudEvents:事件驱动微服务互操作性
  • 计算机核心概念辨析与解析
  • 24SpringCloud黑马商城部署Java应用后浏览器访问数据库不显示数据的解决办法
  • 可持久化线段树 系列 题解
  • 【Python✨】解决 Conda 安装 MoviePy 报错问题
  • GitCode疑难问题诊疗
  • 12.Redis 主从复制
  • deep research|从搜索引擎到搜索助手的实践(一)
  • 企业自动化交互体系的技术架构与实现:从智能回复到自动评论—仙盟创梦IDE
  • 三、驱动篇-HDF驱动介绍1
  • 语义分割--Fcn
  • 回顾MDP的概念
  • RabbitMQ面试精讲 Day 8:死信队列与延迟队列实现
  • dbdiagram:一款简洁高效的免费数据库设计工具
  • 二叉树算法之【前序遍历】
  • 三生原理的“范畴语法”如何启发AI推理?
  • Spring Boot 整合 Minio 实现高效文件存储解决方案(本地和线上)