在flutter中經常會用到異步任務,dart中異步任務異步處理是用Future來處理,那麼如何實現用Future來處理一個異步操作呢,網上的Future教程、原理都是說說原理,但是沒有什麼乾貨,沒有教你如何去用。今天看了下源碼,終於知道如何去使用Future了。其實和javaScript的promise很像,但是promise的參數函數的參數提供了resolve,reject方法去操控狀態,
那麼Future難道就沒有嗎?原來dart:async提供了Completer類,通過實例這個類生成Future,同時在用這個實例去控制生成的future的成功或者失敗的狀態。代碼如下:
Future openImagePicker () {
Complete completer = new Completer();
// ImagePicker 是一個圖片選擇插件
ImagePicker.singlePicker(
context,
singleCallback: (data) {
completer.complete(data);
},
failCallback:(err) {
completer.catchError(err);
}
);
return completer.future;
}
// 使用
openImagePicker().then((data) {}).catchError((err){});
返回completer生成的future,通過completer.complete方法去控制completer.future的成功狀態,通過completer.catchError去控制completer.future的失敗狀態。
completer.complete和completer.catchError方法的參數就是future的返回值。
completer.complete就相當於promise的resolve,completer.catchError相當於promise中的reject()
通過Completer可以得心應手的控制Future的狀態。