dart入门指南 (5)

可以使用try catch 处理异常,也可以再次向上抛出

// 抛出一个异常实例 void testThrow() { throw Exception("异常发生"); } // 可以抛出一个任意对象 void testThrow2() { throw "抛出字符串也可以"; } void testThrow3() { try { testThrow(); } catch(e) { // 捕获到异常不处理,再次向上抛出 rethrow; } } void main() { try { testThrow(); } catch(e, s) { // 这里e是指抛出的异常类,s是堆栈信息 print(e is Exception); // true print(s); } try { testThrow2(); } catch(e) { print(e is Exception); // false print(e); // 抛出字符串也可以 } testThrow3(); // 这里有异常抛出,不捕获也是可以通过静态检查的 // 下面的语句无法执行 print("未捕获异常之后还能执行吗,不能"); } 异步编程

dart提供了对异步的支持,核心类包括Future和Stream,都位于dart:async包下,这里介绍非常常用的Future.

Future被用来表示在未来才能知道其值或错误的一个类,和js中的Promise是类似的。

Future的创建

可以使用Future的构造方法创建Future

Future Future(FutureOr computation()) 可以异步的执行computation函数,其结果就是Future的结果

Future Future.delayed(Duration duration, [ FutureOr computation() ]) 延迟去执行里边的函数

Future Future.error(Object error, [ StackTrace stackTrace ]) 延迟抛出一个错误

Future.sync(FutureOr computation()) 立即执行

Future Future.microtask(FutureOr computation()) 以微任务方式执行

Future Future.value([FutureOr value ]) 参数是一个Future,直接以参数返回值为值作为返回Future的返回值

这几个构造方法使用比较简单,一下是简单示例

// 使用非命名构造 Future<String> getFuture() { return Future<String>(() { return "hello"; }); } // Future.delayed Future<String> getFuture2() { return Future.delayed(Duration(seconds: 2), () { return "Future.delayed"; }); } // Future.error Future<String> getFuture3() { return Future.error("错误对象"); } // Future.microtask Future<String> getFuture4() { return Future.microtask(() { return "Future.microtask"; }); } // Future.sync Future<String> getFuture5() { return Future.sync(() { return "Future.sync"; }); } Future.value(getFuture4());

关于delayed, microtask,sync对比参见后文

Future 结果的获取

如果一个函数返回Future, 那么可以使用async await 获取其结果,可以使用try catch 捕获异常

可以使用.then获取正常结果,.catchError获取抛出的异常

import 'dart:async'; // 使用非命名构造 Future<String> getFuture() { return Future<String>(() { return "hello"; }); } void method1() { getFuture().then((res) { print(res); }).catchError((e) { print(e); }); print("后边的先执行了"); } void method2() async { String str = await getFuture(); print(str); print('按顺序执行'); } void main(){ method1(); method2(); // 输出 // 后边的先执行了 // hello // hello // 按顺序执行 }

Future执行顺序比较

通过测试得出:

microtask 和async是写在前边的先执行

直接使用构造函数的在最后执行

delayed在microtask和async之后执行

关于这几者的比较,有兴趣的同学可以自行研究。

网络请求

常用的发网络请求的方法有两种:

一是使用dart:io下的HttpClient

二是使用package:http/http.dart

HttpClient

使用步骤:

创建HttpClient

[可选]配置HttpClient,比如设置超时时间,代理等

获取HttpClientRequest

[可选]设置httpClientRequest,如header

获取httpClientResponse

处理响应结果

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfyzy.html