Flutter开发 dart异步

发布于:2025-08-04 ⋅ 阅读:(12) ⋅ 点赞:(0)

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]

网站公告

今日签到

点亮在社区的每一天
去签到