async 和 await
Dart 語言支持函數(shù)進行異步操作的處理,使用 async 和 await勺远。
第一步將函數(shù)標記為 aynsc
Future<void> getData async {
// 發(fā)起異步操作
}
``
第二步在函數(shù)體內(nèi)進行異步請求答憔,可以等待任務(wù)返回前阻塞當前線程
Future<void> getData async {
await Future.dealy(Duration(seconds: 2), () {
print("打印111"):
});
print("打印 222")
}
因為使用了 await 操作价涝,所以異步請求會先完成打印 111 后再執(zhí)行打印 222,否則會先打印 222 再打印 111澜共。
Future
在 Future 的任務(wù)閉包中,可以選擇返回值锥腻,這樣可以在 await 時獲取到閉包任務(wù)的返回值
String ret = await Future.dealy(Duration(seconds: 2), () {
return "打印111";
});
print(ret);
注意點
不要在 initState 等生命周期函數(shù)中使用 async 和 await 因為會阻塞渲染的線程嗦董,而應(yīng)該單獨寫一個方法進行異步執(zhí)行后調(diào)用 setState 進行數(shù)據(jù)界面的刷新。
void requestData async () {
var result = await WebService.request((response){
return respone.data;
});
setState(() {
this.data = result;
});
}
HTTP 請求
在 pub.flutter-io 中搜索 http瘦黑,可以找到一個名為 http
庫京革,將其添加在 pubspec.yaml 中并執(zhí)行 pub get
可以將其依賴到工程中。
定義一個請求函數(shù)
// 在文件中引入依賴
import 'package:http/http.dart';
// 定義請求數(shù)據(jù)的函數(shù)
Future<Void> requestData() async {
Response resp = await get("https://example.com/api");
print(resp)
}
一般返回數(shù)據(jù)是 json 格式幸斥,需要引入 json decoder 進行解析
// 引入 Dart 自帶的 decoder
import 'dart:converter';
// 對請求結(jié)果的 body 進行解析
Map data = jsonDecode(resp.body);
注意請求函數(shù)是會拋出異常的匹摇,因此需要進行必要的 try-catch 處理。
try {
Response resp = get("xxxxx");
Map data = jsonDecode(resp.body);
this.text = data['text'];
} catch (exception) {
this.text = 'failed';
}