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的作用是等待异步任务的结果。
- await只能在标记了async的一部方法中使用
- 当使用async作为方法名后缀声明时,说明这个方法的返回值是一个Future类型。
- 当执行到该方法中用await标注的代码时,会暂停该方法其他部分的代码执行。
- 当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]