取消dart(flutter)中Future的執(zhí)行

首先要明確的一點(diǎn)是, 在dart協(xié)程式的編程語(yǔ)言中, 是無法中斷一個(gè)Future的執(zhí)行的, 我們所能做的只能是取消一個(gè)async代碼塊的回調(diào), 也就是說一段異步代碼塊執(zhí)行后, 準(zhǔn)備繼續(xù)執(zhí)行后續(xù)的回調(diào)代碼時(shí), 由于已經(jīng)被取消, 而中止了整個(gè)過程.
由于在dart中有回調(diào)機(jī)制并能被中止的有Futhre.then()和Stream.listen(), 所以下面就有相應(yīng)的實(shí)現(xiàn)方法吃媒。

方法1: 使用CancelableOperation

下面是一個(gè)異步獲取數(shù)據(jù), 當(dāng)頁(yè)面銷毀時(shí)中斷渲染的示例代碼:

import 'package:async/async.dart';
void loadPageDatas() async {
  CancelableOperation cancelTask = CancelableOperation.fromFuture(
    Future(() async {
      print('start query datas');
      await Future.delayed(Duration(seconds: 6));
      print('end query datas');
      return "value";
    }),
    onCancel: () => print('disposed, cancel rendering.'),
  );
  cancelTask.value.then((val) {
    print('to render tree: $val ');  // 不能放在cancelTask的構(gòu)造函數(shù)中, 需要通過  cancelTask.value.then進(jìn)行添加.
  });

  Future.delayed(Duration(seconds: 3)).then((_) {
    // when disposed
    cancelTask.cancel();
  });
}

有一些細(xì)節(jié), 通過源碼cancelable_operation.dart::CancelableCompleter()實(shí)現(xiàn)可以知道, 由于CancelableOperation是對(duì)Future的then進(jìn)行了接管, 判斷isCanceled標(biāo)記以決定是否需要執(zhí)行用戶提供的then(), 但這個(gè)接管是在CancelableCompleter()構(gòu)造完成后的 cancelTask.value中進(jìn)行的,

所以在CancelableOperation.fromFuture()只提供不可中斷的功能(如querying datas), 將可中斷的功能(如rendering)放在構(gòu)造完成后的.value.then中添加钓辆,

這是需要注意的,否則會(huì)出現(xiàn)即使cancel()后仍會(huì)執(zhí)行的情況呀非。
CancelableOperation 類的本質(zhì)是有個(gè) CancelableCompleter 類, 在其中完成了cancel的操作, 可以閱讀源碼.

方法2:使用Stream.

同樣的示例代碼, 很簡(jiǎn)單:

Future<String> getData() async {
  print('into getData');
  await Future.delayed(Duration(seconds: 5));
  print('leave getData');
  return "value";
}
void loadPageDatas() async {
  StreamSubscription<String> dataSub =
      getData().asStream().listen((String data) {
    print('rendering data: $data');
  });
  Future.delayed(Duration(seconds: 3), () => dataSub.cancel());
}

代碼比較清晰, 不多解釋了燎孟。
參考來源:
https://dart.academy/how_cancel_future/


有個(gè)題外話禽作,在使用Future.delayed(Duration(seconds: 3, milliseconds: 100))時(shí),要小心精度問題揩页,比如Duration(seconds: 3, milliseconds: 100)有可能比Duration(seconds: 3) 要先被執(zhí)行旷偿,這牽涉到task的調(diào)度,還沒有深究爆侣,有時(shí)間了再做研究萍程。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市兔仰,隨后出現(xiàn)的幾起案子尘喝,更是在濱河造成了極大的恐慌,老刑警劉巖斋陪,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異置吓,居然都是意外死亡无虚,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門衍锚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來友题,“玉大人,你說我怎么就攤上這事戴质《然拢” “怎么了?”我有些...
    開封第一講書人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵告匠,是天一觀的道長(zhǎng)戈抄。 經(jīng)常有香客問我,道長(zhǎng)后专,這世上最難降的妖魔是什么划鸽? 我笑而不...
    開封第一講書人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上裸诽,老公的妹妹穿的比我還像新娘嫂用。我一直安慰自己,他們只是感情好丈冬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開白布嘱函。 她就那樣靜靜地躺著,像睡著了一般埂蕊。 火紅的嫁衣襯著肌膚如雪往弓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,215評(píng)論 1 299
  • 那天粒梦,我揣著相機(jī)與錄音亮航,去河邊找鬼。 笑死匀们,一個(gè)胖子當(dāng)著我的面吹牛缴淋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播泄朴,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼重抖,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了祖灰?” 一聲冷哼從身側(cè)響起钟沛,我...
    開封第一講書人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎局扶,沒想到半個(gè)月后恨统,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡三妈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年畜埋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畴蒲。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡悠鞍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出模燥,到底是詐尸還是另有隱情咖祭,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布蔫骂,位于F島的核電站么翰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏辽旋。R本人自食惡果不足惜硬鞍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧固该,春花似錦锅减、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至桦沉,卻和暖如春每瞒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纯露。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工剿骨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人埠褪。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓浓利,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親钞速。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贷掖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354