本篇内容介绍了“Flutter 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的类提供 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表达式中,其值通常是Future,如果不是则会自动包装到Future中。Future关键字表示承诺返回一个对象。await表达式的值就是返回的对象。await表达式使执行暂停直到该对象可用为止。
如果异步不需要返回值,则将返回类型修改为Future< void >
Stream 是一系列异步事件的源。Stream提供了一种接收时间序列的方式,每个事件要么是数据事件 要么是错误事件(发生故障时的通知),当Stream发出所有事件后,单个done事件将通知侦 听器已完成。
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异步如何创建”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。