Flutter入门第一步-Dart语言入门(三)

Flutter入门第一步-Dart语言入门(三)

.

1.Dart中的异步支持

1.1 Future:
Future与JavaScript中的Promise非常相似,表示一个异步操作的最终完成(或失败)及其结果值的表示。简单来说,它就是用于处理异步操作的,异步处理成功了就执行成功的操作,异步处理失败了就捕获错误或者停止后续操作。一个Future只会对应一个结果,要么成功,要么失败。

.
1.2 Future.than
我们可以在than中接收异步结果,并进行相应的处理。下面这个例子中,我们模拟 一个耗时操作,然后在than中接收了异步的执行结果并打印了出来,代码如下:

Future.delayed(new Duration(seconds: 2),(){
   return "hi world!";
}).then((data){
   print(data);
});

.

1.3 Future.catchError
当我们的异步操作执行错误的时候,我们可以在catchError中进行一场捕获,然后进行相应的处理。在上例中,我们可以抛出一个错误,然后再catchError中进行处理,代码如下:

Future.delayed(new Duration(seconds: 2),(){
//    return "hi world!";
  throw AssertionError("aha!");
}).then((data){
   print(data);
})
  .catchError((e)
{
  print(e);
});

.
1.4 Future.whenComplete
这个代表的含义几乎和finall类似,代表当异步执行结束之后,最终不管成功与否都会执行Future.whenComplete中的代码。

Future.delayed(new Duration(seconds: 2),(){
   //return "hi world!";
   throw AssertionError("Error");
}).then((data){
   //执行成功会走到这里 
   print(data);
}).catchError((e){
   //执行失败会走到这里   
   print(e);
}).whenComplete((){
   //无论成功或失败都会走到这里
});

1.4 Future.wait
有时候在进行异步操作时,我们需要注意时序的问题。比如等两张图片全都加载结束了再关闭对话框,其中wait的参数是一个Furure类型的数组,然后再wait中执行的代码的结果会存在results数组中。代码如下:

Future.wait([
  // 2秒后返回结果  
  Future.delayed(new Duration(seconds: 2), () {
    return "hello";
  }),
  // 4秒后返回结果  
  Future.delayed(new Duration(seconds: 4), () {
    return " world";
  })
]).then((results){
  print(results[0]+results[1]);
}).catchError((e){
  print(e);
});

1.5 Async/await
想象这样一个场景,有一些操作必须是基于已经完成的操作的,但由于我们用了异步的操作,如果顺序调用就失去了时序性,只能在一个Future的than中再调用下一个Future,这样嵌套的层数多了以后,代码就失去了可读性和可维护性,dart将这种现象叫做Callback hell(回调地狱)。所以在Dart中,有别的办法进行这样的操作。我们看下面这段代码:

task() async {
   try{
    String id = await login("alice","******");
    String userInfo = await getUserInfo(id);
    await saveUserInfo(userInfo);
    //执行接下来的操作   
   } catch(e){
    //错误处理   
    print(e);   
   }  
}

async用来表示函数是异步的,定义的函数会返回一个Future对象,可以使用then方法添加回调函数。
await 后面是一个Future,表示等待该异步任务完成,异步完成后才会往下走;await必须出现在 async 函数内部。
可以看到,我们通过async/await将一个异步流用同步的代码表示出来了。

其实,无论是在JavaScript还是Dart中,async/await都只是一个语法糖,编译器或解释器最终都会将其转化为一个Promise(Future)的调用链。

1.6 Stream
Stream 也是用于接收异步事件数据,和Future 不同的是,它可以接收多个异步操作的结果(成功或失败)。 也就是说,在执行异步任务时,可以通过多次触发成功或失败事件来传递结果数据或错误异常。 Stream 常用于会多次读取数据的异步任务场景,如网络内容下载、文件读写等。举个例子:

Stream.fromFutures([
  // 1秒后返回结果
  Future.delayed(new Duration(seconds: 1), () {
    return "hello 1";
  }),
  // 抛出一个异常
  Future.delayed(new Duration(seconds: 2),(){
    throw AssertionError("Error");
  }),
  // 3秒后返回结果
  Future.delayed(new Duration(seconds: 3), () {
    return "hello 3";
  })
]).listen((data){
   print(data);
}, onError: (e){
   print(e.message);
},onDone: (){

});

上边的代码会一次输出:
hello1,error,hello3

关于Dart的部分就到这里,在储备了这些知识以后,我们就可以真正的开始学习Flutter了,想想还有点小激动。从java来的coder一定要认真读一下代码,因为总的来说Dart和Java的思想是截然不同的。下篇文章我们正式开始Flutter之旅

发布了47 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41525021/article/details/104329642