Flutter Future异步操作详细讲解

 更新时间:2023年03月10日 10:35:40   作者:lingjunjie  
这篇文章主要介绍了Flutter Future异步操作,future是Future类的对象,其表示一个T类型的异步操作结果。如果异步操作不需要结果,则future的类型可为Future

异步

future

Future 表示异步操作的结果 他有两种状态

  • 未完成状态 :当调用异步函数时,他返回未完成的Future 并持续到异步函数操作完成;
  • 完成状态:如果异步函数操作成功,则返回一个值;如果异步函数操作失败则返回一个错误

创建Future

import 'dart:match';
import 'dart:async';
int getInt(){
print('执行getInt的函数');
Random rng = Random();
return rng.nextInt(100);
}
void main(){
//此处调用的getint函数是int类型
Future<int> future = Future(getInt);
//验证是否Future<int>的实例
print(Future(getInt));
}

异步创建

import 'dart:match';
import 'dart:async';
int getInt() async{
print('执行getInt的函数');
Random rng = Random();
return rng.nextInt(100);
}
void main(){
//此处调用的getint函数是int类型
Future<int> future = Future(getInt);
//验证是否Future<int>的实例
print(Future(getInt));
}

使用Future

Future的类提供 then catchError whenCompete 三个函数对Future对象进行进一步处理,当异步操作成功时 执行then方法,then方法接受一个参数为异步操作返回值的回调函数。当异步操作失败时,执行catchError方法,catchError方法接受一个参数为错误对象的回调函数。当异步操作完成的时候无论失败还是成功都会调用whenCompete,而且wehnCompete方法接受一个无参的回调函数。

import 'dart:match';
import 'dart:async';
int getInt(){
print('执行getInt的函数');
Random rng = Random();
return rng.nextInt(100);
}
void main(){
//此处调用的getint函数是int类型
Future<int> future = Future(getInt);
future.then((Object onValue){
print('异步调用成功,值为$onValue');
}).catchError((Object onError){
print('异步调用失败,值为$onError');
}).whenCompete((){
print('异步操作完成');
});
}

也可以使用await等待异步操作完成,使用await关键字必须使用async标记 ,并且使用try关键字捕获异常。

import 'dart:match';
import 'dart:async';
int getInt(){
print('执行getInt的函数');
Random rng = Random();
return rng.nextInt(100);
}
void main() async{
//此处调用的getint函数是int类型
Future<int> future = Future(getInt);
try{
//使用await等待异步调用完成使其等同意同步代码
	var onvalue = await getInt();
	print('一步操作成功:$onvalue');
}on Excrption catch(onError){
	print('异步捕获失败:$onError');
}finally{
	print('异步捕获完成');
}
}

await关键字

在await表达式中,其值通常是Future,如果不是则会自动包装到Future中。Future关键字表示承诺返回一个对象。await表达式的值就是返回的对象。await表达式使执行暂停直到该对象可用为止。

如果异步不需要返回值,则将返回类型修改为Future< void >

Stream

Stream 是一系列异步事件的源。Stream提供了一种接收时间序列的方式,每个事件要么是数据事件 要么是错误事件(发生故障时的通知),当Stream发出所有事件后,单个done事件将通知侦 听器已完成。

stream和Future的区别

1. Future在异步操作中提供单个结果、错误、或者值。Stream提供多个结果;

2. Future 通过函数处理结果,Stream通过listen;

3. Future发送接收相同的值,Stream 可以使用辅助方法在值到达前处理;

//创建Stream
StreamController<int> controller = StreamController<int>(
	onListen: startTimer,
	onPause: stopTimer,
	onResume: startTimer,
	onCAncel: stoptimer
);
Stream stream = controller.stream;

StreamController 构造函数支持泛型,这里使用int类型。后遭函数提供了多个可选参数:

4. onlisten:监听Stream时调用的回调函数

5. onpause: 暂停调用的回调函数

6. onreaume: 恢复调用的回调函数

7. oncancel: 取消stream调用的回调函数

8. sync 布尔值,默认false ,同步stream标记

使用Stream

import 'dart:async';
Stream<int> createStream(Duration interval,int maxCount){
	//定义流控制器
	StreamController<int> controller;
	 //定义定时器
	Timer timer;
	//计数变量
	int counter= 0
	void tick(_){
		counter++;
		controller.add(counter);
		//判断计数变量是否达到了最大值
		if(counter == maxCount){
		//关闭计时器
		timer.cancel();
		//关闭Stream并通知监听器
		controller.clase();
		}
	}
//启动计时器
void startTimer(){
	timer = Timer.periodic(interval,tick);
}
void stopTimer(){
if (timer != null){
timer.cancel();
timer = null;
}
print('结束执行');
}
controller = StreamController<int>(
	onListen: startTimer,
	onPause: stopTimer,
	onResume: startTimer,
	onCAncel: stoptimer
);
return controller.stream;
}
void main() async{
Stream<int> stream = createStream(const Duration(senconds:1),10);
	stream.listen((int value){
	print('来自createStream的值:$value');
	});
}

生成器函数

传统函数只会返回个单个值,生成器函数生成值的序列。生成器函数可以采用同步返回带有值的 Iterable 对象,在一部中返回Stream对象

关键字yield 返回单个值到序列,但不会停止生成器函数 。

生成器函数按需生成值,当开始迭代 iterator 或者开始监听 stream 才生成值。

同步生成器

Interable<int> getNumbers(int number) sync* (
	print('开始执行');
	int k=0;
	while(k<number) yield k++;
	print('生成器执行结束');
)
void main (){
print('创建interator');
for (int val in numbers){
print('$val');
}
}

异步生成器

Interable<int> getNumbers(int number) async* (
	print('开始执行');
	int k=0;
	while(k<number) yield k++;
	print('生成器执行结束');
)
void main (){
print('创建interator');
for (int val in numbers){
print('$val');
}
}

递归生成器

Interable<int> getNumberRecursive(int number) sync* (
	print('开始执行,输出number:$number');
	if(numner>0){
		yield* getNumberRecursive(number - 1);
	}
	print('生成器执行结束number:$number');
)
void main (){
print('创建interator');
Interable<int> numbers = getNumberRecursive(3);
for (int val in numbers){
print('$val');
}
}

到此这篇关于Flutter Future异步操作详细讲解的文章就介绍到这了,更多相关Flutter Future异步操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android 8.0中一些坑以及对应的解决方法

    Android 8.0中一些坑以及对应的解决方法

    这篇文章主要给大家介绍了关于Android 8.0中一些坑以及对应的解决方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-09-09
  • Flutter替换字符串中的html标签

    Flutter替换字符串中的html标签

    这篇文章主要为大家介绍了Flutter替换字符串中的html标签实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2023-05-05
  • 浅析Android企业级开发数据绑定技术

    浅析Android企业级开发数据绑定技术

    这篇文章通过代码实例分析了Android企业级开发数据绑定技术的应用以及相关的原理知识,跟着小编一起学习参考下吧。
    2017-12-12
  • Android selector背景选择器的使用详解

    Android selector背景选择器的使用详解

    本篇文章是对Android中selector背景选择器的使用进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • Android实用小技巧之利用Lifecycle写出更好维护的代码

    Android实用小技巧之利用Lifecycle写出更好维护的代码

    lifecycle是一个类,用于存储有关组件(如Activity或Fragment)的生命周期状态的信息,并允许其他对象观察此状态,下面这篇文章主要给大家介绍了关于Android实用小技巧之利用Lifecycle写出更好维护的代码的相关资料,需要的朋友可以参考下
    2022-05-05
  • Android手机开发设计之记事本功能

    Android手机开发设计之记事本功能

    这篇文章主要为大家详细介绍了Android手机开发设计之记事本功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • Android中实现词组高亮TextView方法示例

    Android中实现词组高亮TextView方法示例

    高亮显示大家应该都不陌生,在开发中经常会遇到这个需求,所以下面这篇文章主要给大家介绍了关于Android中实现词组高亮TextView的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-10-10
  • Flutter路由的跳转、动画和传参详解(最简单)

    Flutter路由的跳转、动画和传参详解(最简单)

    这篇文章主要给大家介绍了关于Flutter路由的跳转、动画和传参的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • Android的消息机制

    Android的消息机制

    本文主要介绍了Android的消息机制。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • Android View的事件分发机制深入分析讲解

    Android View的事件分发机制深入分析讲解

    事件分发从手指触摸屏幕开始,即产生了触摸信息,被底层系统捕获后会传递给Android的输入系统服务IMS,通过Binder把消息发送到activity,activity会通过phoneWindow、DecorView最终发送给ViewGroup。这里就直接分析ViewGroup的事件分发
    2023-01-01

最新评论