CINXE.COM
dart:async | Dart
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="x-ua-compatible" content="ie=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><script>!function(e,t,a,n){e[n]=e[n]||[],e[n].push({"gtm.start":(new Date).getTime(),event:"gtm.js"});var g=t.getElementsByTagName(a)[0],m=t.createElement(a);m.async=!0,m.src="https://www.googletagmanager.com/gtm.js?id=GTM-5VSZM5J",g.parentNode.insertBefore(m,g)}(window,document,"script","dataLayer")</script><meta name="description" content="Learn about the major features in Dart's dart:async library."><title>dart:async | Dart</title><link rel="icon" sizes="64x64" href="/assets/img/logo/dart-64.png" eleventy:ignore><link href="/assets/img/touch-icon-iphone.png" rel="apple-touch-icon" eleventy:ignore><link href="/assets/img/touch-icon-ipad.png" rel="apple-touch-icon" sizes="152x152" eleventy:ignore><link href="/assets/img/touch-icon-iphone-retina.png" rel="apple-touch-icon" sizes="180x180" eleventy:ignore><link href="/assets/img/touch-icon-ipad-retina.png" rel="apple-touch-icon" sizes="167x167" eleventy:ignore><meta name="twitter:card" content="summary"><meta name="twitter:site" content="@dart_lang"><meta name="twitter:title" content="dart:async"><meta name="twitter:description" content="Learn about the major features in Dart's dart:async library."><meta property="og:title" content="dart:async"><meta property="og:description" content="Learn about the major features in Dart's dart:async library."><meta property="og:url" content="/libraries/dart-async/"><meta property="og:image" content="/assets/img/logo/dart-logo-for-shares.png?2" eleventy:ignore><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Google+Sans:wght@400;500;700&display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css2?family=Google+Sans+Display:wght@400&display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css2?family=Google+Sans+Mono:wght@400;500;700&display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css2?family=Google+Sans+Text:wght@400;500;700&display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0..1,0" rel="stylesheet"><link rel="stylesheet" href="/assets/css/main.css?v=3"><script src="/assets/js/os-tabs.js?v=3"></script><script src="/assets/js/main.js?v=3"></script><script>!function(e,a,t,n,c,o,s){e.GoogleAnalyticsObject=c,e[c]=e[c]||function(){(e[c].q=e[c].q||[]).push(arguments)},e[c].l=1*new Date,o=a.createElement(t),s=a.getElementsByTagName(t)[0],o.async=1,o.src="//www.google-analytics.com/analytics.js",s.parentNode.insertBefore(o,s)}(window,document,"script",0,"ga"),ga("create","UA-26406144-4","auto"),ga("send","pageview")</script></head><body class="default.html"><a id="skip-to-main" class="filled-button" href="#site-content-title" tabindex="1">Skip to main content</a><section id="cookie-notice"><div class="container"><p>dart.dev uses cookies from Google to deliver and enhance the quality of its services and to analyze traffic.</p><div class="button-group"><a class="text-button" href="https://policies.google.com/technologies/cookies" target="_blank" rel="noopener">Learn more</a> <button id="cookie-consent" class="filled-button">OK, got it</button></div></div></section><noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5VSZM5J" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript><div id="site-banner" role="alert"><p>Announcing Dart 3.7! Find out about updates to the language, analyzer, pub.dev, and more, in the <a href="https://medium.com/dartlang/announcing-dart-3-7-bf864a1b195c" target="_blank">blog post</a>.</p></div><header id="site-header"><nav id="mainnav"><div id="menu-toggle"><span class="material-symbols" title="Toggle side navigation menu." aria-label="Toggle side navigation menu." type="button">menu</span></div><a href="/" class="brand" title="Dart"><img src="/assets/img/logo/logo-white-text.svg" alt="Dart"></a><ul class="navbar"><li><a href="/overview" class="nav-link">Overview</a></li><li class="mainnav__get-started"><a href="/docs" class="nav-link active"><span>Docs</span></a></li><li><a href="/community" class="nav-link">Community</a></li><li><a href="/#try-dart" class="nav-link">Try Dart</a></li><li><a href="/get-dart" class="nav-link">Get Dart</a></li><li class="searchfield"><form action="/search" class="site-header-search form-inline" id="cse-search-box"><input type="hidden" name="cx" value="011220921317074318178:_yy-tmb5t_i"> <input type="hidden" name="ie" value="UTF-8"> <input type="hidden" name="hl" value="en"> <input class="site-header-searchfield form-control search-field" type="search" name="q" id="search-main" autocomplete="off" placeholder="Search" aria-label="Search"></form></li></ul></nav></header><div id="site-below-header"><div id="site-main-row"><div id="sidenav"><form action="/search/" class="site-header-search form-inline"><input class="site-header-searchfield form-control search-field" type="search" name="q" id="search-side" autocomplete="off" placeholder="Search" aria-label="Search"></form><ul class="navbar-nav"><li aria-hidden="true"><div class="sidenav-divider"></div></li><li class="nav-item"><a href="/overview" class="nav-link">Overview</a></li><li class="nav-item"><a href="/community" class="nav-link">Community</a></li><li class="nav-item"><a href="https://dartpad.dev" class="nav-link">Try Dart</a></li><li class="nav-item"><a href="/get-dart" class="nav-link">Get Dart</a></li><li class="nav-item"><a href="/docs" class="nav-link">Docs</a></li><li aria-hidden="true"><div class="sidenav-divider"></div></li></ul><ul class="nav"><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#-sidenav-1" role="button" aria-expanded="false" aria-controls="-sidenav-1"><span>Language</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1"><li class="nav-item"><a class="nav-link" href="/language"><div><span>Introduction</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-2" role="button" aria-expanded="false" aria-controls="-sidenav-1-2"><span>Syntax basics</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-2"><li class="nav-item"><a class="nav-link" href="/language/variables"><div><span>Variables</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/operators"><div><span>Operators</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/comments"><div><span>Comments</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/metadata"><div><span>Metadata</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/libraries"><div><span>Libraries & imports</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/keywords"><div><span>Keywords</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-3" role="button" aria-expanded="false" aria-controls="-sidenav-1-3"><span>Types</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-3"><li class="nav-item"><a class="nav-link" href="/language/built-in-types"><div><span>Built-in types</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/records"><div><span>Records</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/collections"><div><span>Collections</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/generics"><div><span>Generics</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/typedefs"><div><span>Typedefs</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/type-system"><div><span>Type system</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-4" role="button" aria-expanded="false" aria-controls="-sidenav-1-4"><span>Patterns</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-4"><li class="nav-item"><a class="nav-link" href="/language/patterns"><div><span>Overview & usage</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/pattern-types"><div><span>Pattern types</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://codelabs.developers.google.com/codelabs/dart-patterns-records" target="_blank" rel="noopener"><div><span>Applied tutorial</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li></ul></li><li class="nav-item"><a class="nav-link" href="/language/functions"><div><span>Functions</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-6" role="button" aria-expanded="false" aria-controls="-sidenav-1-6"><span>Control flow</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-6"><li class="nav-item"><a class="nav-link" href="/language/loops"><div><span>Loops</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/branches"><div><span>Branches</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/error-handling"><div><span>Error handling</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-7" role="button" aria-expanded="false" aria-controls="-sidenav-1-7"><span>Classes & objects</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-7"><li class="nav-item"><a class="nav-link" href="/language/classes"><div><span>Classes</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/constructors"><div><span>Constructors</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/methods"><div><span>Methods</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/extend"><div><span>Extend a class</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/mixins"><div><span>Mixins</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/enums"><div><span>Enums</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/extension-methods"><div><span>Extension methods</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/extension-types"><div><span>Extension types</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/callable-objects"><div><span>Callable objects</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-8" role="button" aria-expanded="false" aria-controls="-sidenav-1-8"><span>Class modifiers</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-8"><li class="nav-item"><a class="nav-link" href="/language/class-modifiers"><div><span>Overview & usage</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/class-modifiers-for-apis"><div><span>Class modifiers for API maintainers</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/modifier-reference"><div><span>Reference</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-9" role="button" aria-expanded="false" aria-controls="-sidenav-1-9"><span>Concurrency</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-9"><li class="nav-item"><a class="nav-link" href="/language/concurrency"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/async"><div><span>Asynchronous support</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/isolates"><div><span>Isolates</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-10" role="button" aria-expanded="false" aria-controls="-sidenav-1-10"><span>Null safety</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-10"><li class="nav-item"><a class="nav-link" href="/null-safety"><div><span>Sound null safety</span></div></a></li><li class="nav-item"><a class="nav-link" href="/null-safety/migration-guide"><div><span>Migrating to null safety</span></div></a></li><li class="nav-item"><a class="nav-link" href="/null-safety/understanding-null-safety"><div><span>Understanding null safety</span></div></a></li><li class="nav-item"><a class="nav-link" href="/null-safety/unsound-null-safety"><div><span>Unsound null safety</span></div></a></li><li class="nav-item"><a class="nav-link" href="/null-safety/faq"><div><span>FAQ</span></div></a></li></ul></li></ul></li><li class="nav-item"><button class="nav-link active collapsible" data-toggle="collapse" data-target="#-sidenav-2" role="button" aria-expanded="true" aria-controls="-sidenav-2"><span>Core libraries</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse show" id="-sidenav-2"><li class="nav-item"><a class="nav-link" href="/libraries"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/libraries/dart-core"><div><span>dart:core</span></div></a></li><li class="nav-item"><a class="nav-link active" href="/libraries/dart-async"><div><span>dart:async</span></div></a></li><li class="nav-item"><a class="nav-link" href="/libraries/dart-math"><div><span>dart:math</span></div></a></li><li class="nav-item"><a class="nav-link" href="/libraries/dart-convert"><div><span>dart:convert</span></div></a></li><li class="nav-item"><a class="nav-link" href="/libraries/dart-io"><div><span>dart:io</span></div></a></li><li class="nav-item"><a class="nav-link" href="/interop/js-interop"><div><span>dart:js_interop</span></div></a></li><div class="sidenav-divider"></div><li class="nav-item"><a class="nav-link" href="/libraries/collections/iterables"><div><span>Iterable collections</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-2-10" role="button" aria-expanded="false" aria-controls="-sidenav-2-10"><span>Asynchronous programming</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-2-10"><li class="nav-item"><a class="nav-link" href="/libraries/async/async-await"><div><span>Tutorial</span></div></a></li><li class="nav-item"><a class="nav-link" href="/libraries/async/futures-error-handling"><div><span>Futures and error handling</span></div></a></li><li class="nav-item"><a class="nav-link" href="/libraries/async/using-streams"><div><span>Using streams</span></div></a></li><li class="nav-item"><a class="nav-link" href="/libraries/async/creating-streams"><div><span>Creating streams</span></div></a></li></ul></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#-sidenav-3" role="button" aria-expanded="false" aria-controls="-sidenav-3"><span>Effective Dart</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-3"><li class="nav-item"><a class="nav-link" href="/effective-dart"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/effective-dart/style"><div><span>Style</span></div></a></li><li class="nav-item"><a class="nav-link" href="/effective-dart/documentation"><div><span>Documentation</span></div></a></li><li class="nav-item"><a class="nav-link" href="/effective-dart/usage"><div><span>Usage</span></div></a></li><li class="nav-item"><a class="nav-link" href="/effective-dart/design"><div><span>Design</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#-sidenav-4" role="button" aria-expanded="false" aria-controls="-sidenav-4"><span>Packages</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-4"><li class="nav-item"><a class="nav-link" href="/tools/pub/packages"><div><span>How to use packages</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/useful-packages"><div><span>Commonly used packages</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/create-packages"><div><span>Creating packages</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/publishing"><div><span>Publishing packages</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/writing-package-pages"><div><span>Writing package pages</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/workspaces"><div><span>Workspaces (monorepo support)</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-4-7" role="button" aria-expanded="false" aria-controls="-sidenav-4-7"><span>Package reference</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-4-7"><li class="nav-item"><a class="nav-link" href="/tools/pub/dependencies"><div><span>Dependencies</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/glossary"><div><span>Glossary</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/package-layout"><div><span>Package layout conventions</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/environment-variables"><div><span>Pub environment variables</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/pubspec"><div><span>Pubspec file</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/troubleshoot"><div><span>Troubleshooting pub</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/verified-publishers"><div><span>Verified publishers</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/security-advisories"><div><span>Security advisories</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/versioning"><div><span>Versioning</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/custom-package-repositories"><div><span>Custom package repositories</span></div></a></li></ul></li><li class="nav-item"><a class="nav-link" href="/tools/pub/private-files"><div><span>What not to commit</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#-sidenav-5" role="button" aria-expanded="false" aria-controls="-sidenav-5"><span>Development</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-5"><li class="nav-item"><a class="nav-link" href="/libraries/serialization/json"><div><span>JSON serialization</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/language/number-representation"><div><span>Number representation</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/google-apis"><div><span>Google APIs</span></div></a></li><li class="nav-item"><a class="nav-link" href="/multiplatform-apps"><div><span>Multi-platform apps</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-5-5" role="button" aria-expanded="false" aria-controls="-sidenav-5-5"><span>Command-line & server apps</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-5-5"><li class="nav-item"><a class="nav-link" href="/server"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tutorials/server/get-started"><div><span>Get started</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tutorials/server/cmdline"><div><span>Write command-line apps</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tutorials/server/fetch-data"><div><span>Fetch data from the internet</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tutorials/server/httpserver"><div><span>Write HTTP servers</span></div></a></li><li class="nav-item"><a class="nav-link" href="/server/libraries"><div><span>Libraries & packages</span></div></a></li><li class="nav-item"><a class="nav-link" href="/server/google-cloud"><div><span>Google Cloud</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-5-6" role="button" aria-expanded="false" aria-controls="-sidenav-5-6"><span>Web apps</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-5-6"><li class="nav-item"><a class="nav-link" href="/web"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/web/get-started"><div><span>Get started</span></div></a></li><li class="nav-item"><a class="nav-link" href="/web/deployment"><div><span>Deployment</span></div></a></li><li class="nav-item"><a class="nav-link" href="/web/libraries"><div><span>Libraries & packages</span></div></a></li><li class="nav-item"><a class="nav-link" href="/web/wasm"><div><span>Wasm compilation</span></div></a></li></ul></li><li class="nav-item"><a class="nav-link" href="/libraries/core/environment-declarations"><div><span>Environment declarations</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#-sidenav-6" role="button" aria-expanded="false" aria-controls="-sidenav-6"><span>Interoperability</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-6"><li class="nav-item"><a class="nav-link" href="/interop/c-interop"><div><span>C interop</span></div></a></li><li class="nav-item"><a class="nav-link" href="/interop/objective-c-interop"><div><span>Objective-C & Swift interop</span></div></a></li><li class="nav-item"><a class="nav-link" href="/interop/java-interop"><div><span>Java & Kotlin interop</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-6-4" role="button" aria-expanded="false" aria-controls="-sidenav-6-4"><span>JavaScript interop</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-6-4"><li class="nav-item"><a class="nav-link" href="/interop/js-interop"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/interop/js-interop/usage"><div><span>Usage</span></div></a></li><li class="nav-item"><a class="nav-link" href="/interop/js-interop/js-types"><div><span>JS types</span></div></a></li><li class="nav-item"><a class="nav-link" href="/interop/js-interop/tutorials"><div><span>Tutorials</span></div></a></li><li class="nav-item"><a class="nav-link" href="/interop/js-interop/past-js-interop"><div><span>Past JS interop</span></div></a></li><div class="sidenav-divider"></div><li class="nav-item"><a class="nav-link" href="/interop/js-interop/package-web"><div><span>Web interop</span></div></a></li></ul></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#-sidenav-7" role="button" aria-expanded="false" aria-controls="-sidenav-7"><span>Tools & techniques</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-7"><li class="nav-item"><a class="nav-link" href="/tools"><div><span>Overview</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-7-2" role="button" aria-expanded="false" aria-controls="-sidenav-7-2"><span>Editors & debuggers</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-7-2"><li class="nav-item"><a class="nav-link" href="/tools/jetbrains-plugin"><div><span>IntelliJ & Android Studio</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/vs-code"><div><span>VS Code</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dart-devtools"><div><span>Dart DevTools</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-7-2-4" role="button" aria-expanded="false" aria-controls="-sidenav-7-2-4"><span>DartPad</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-7-2-4"><li class="nav-item"><a class="nav-link" href="/tools/dartpad"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dartpad/troubleshoot"><div><span>Troubleshooting DartPad</span></div></a></li></ul></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-7-3" role="button" aria-expanded="false" aria-controls="-sidenav-7-3"><span>Command-line tools</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-7-3"><li class="nav-item"><button class="nav-link collapsible" data-toggle="collapse" data-target="#-sidenav-7-3-1" role="button" aria-expanded="true" aria-controls="-sidenav-7-3-1"><span>Dart SDK</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse show" id="-sidenav-7-3-1"><li class="nav-item"><a class="nav-link" href="/tools/sdk"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dart-tool"><div><span>dart</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dart-analyze"><div><span>dart analyze</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dart-compile"><div><span>dart compile</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dart-create"><div><span>dart create</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dart-doc"><div><span>dart doc</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dart-fix"><div><span>dart fix</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dart-format"><div><span>dart format</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dart-info"><div><span>dart info</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/cmd"><div><span>dart pub</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dart-run"><div><span>dart run</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dart-test"><div><span>dart test</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dartaotruntime"><div><span>dartaotruntime</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/experiment-flags"><div><span>Experiment flags</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible" data-toggle="collapse" data-target="#-sidenav-7-3-2" role="button" aria-expanded="true" aria-controls="-sidenav-7-3-2"><span>Other command-line tools</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse show" id="-sidenav-7-3-2"><li class="nav-item"><a class="nav-link" href="/tools/build_runner"><div><span>build_runner</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/webdev"><div><span>webdev</span></div></a></li></ul></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-7-4" role="button" aria-expanded="false" aria-controls="-sidenav-7-4"><span>Static analysis</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-7-4"><li class="nav-item"><a class="nav-link" href="/tools/analysis"><div><span>Customizing static analysis</span></div></a></li><li class="nav-item"><a class="nav-link" href="/deprecated/sound-problems"><div><span>Fixing common type problems</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/non-promotion-reasons"><div><span>Fixing type promotion failures</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/linter-rules"><div><span>Linter rules</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/diagnostic-messages"><div><span>Diagnostic messages</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-7-5" role="button" aria-expanded="false" aria-controls="-sidenav-7-5"><span>Testing & optimization</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-7-5"><li class="nav-item"><a class="nav-link" href="/tools/testing"><div><span>Testing</span></div></a></li><li class="nav-item"><a class="nav-link" href="/web/debugging"><div><span>Debugging web apps</span></div></a></li></ul></li></ul></li><li aria-hidden="true"><div class="sidenav-divider"></div></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#-sidenav-9" role="button" aria-expanded="false" aria-controls="-sidenav-9"><span>Resources</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-9"><li class="nav-item"><a class="nav-link" href="/resources/dart-cheatsheet"><div><span>Language cheatsheet</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/breaking-changes"><div><span>Breaking changes</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/language/evolution"><div><span>Language evolution</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/language/spec"><div><span>Language specification</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/dart-3-migration"><div><span>Dart 3 migration guide</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-9-6" role="button" aria-expanded="false" aria-controls="-sidenav-9-6"><span>Coming from ...</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-9-6"><li class="nav-item"><a class="nav-link" href="/resources/coming-from/js-to-dart"><div><span>JavaScript to Dart</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/coming-from/swift-to-dart"><div><span>Swift to Dart</span></div></a></li></ul></li><div class="sidenav-divider"></div><li class="nav-item"><a class="nav-link" href="/resources/faq"><div><span>FAQ</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/glossary"><div><span>Glossary</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/books"><div><span>Books</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/videos"><div><span>Videos</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tutorials"><div><span>Tutorials</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible" data-toggle="collapse" data-target="#-sidenav-10" role="button" aria-expanded="true" aria-controls="-sidenav-10"><span>Related sites</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse show" id="-sidenav-10"><li class="nav-item"><a class="nav-link" href="https://api.dart.dev" target="_blank" rel="noopener"><div><span>API reference</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://medium.com/dartlang" target="_blank" rel="noopener"><div><span>Blog</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://dartpad.dev" target="_blank" rel="noopener"><div><span>DartPad (online editor)</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://flutter.dev" target="_blank" rel="noopener"><div><span>Flutter</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://pub.dev" target="_blank" rel="noopener"><div><span>Package site</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li></ul></li></ul></div><main id="page-content"><div id="site-toc--side" class="site-toc"><header class="site-toc__title">Contents</header><ul class="section-nav"><li class="toc-entry nav-item"><a class="nav-link" href="#future">Future</a><ul class="nav"><li class="toc-entry nav-item"><a class="nav-link" href="#using-await">Using await</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#basic-usage">Basic usage</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#chaining-multiple-asynchronous-methods">Chaining multiple asynchronous methods</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#waiting-for-multiple-futures">Waiting for multiple futures</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#handling-errors-for-multiple-futures">Handling errors for multiple futures</a></li></ul></li><li class="toc-entry nav-item"><a class="nav-link" href="#stream">Stream</a><ul class="nav"><li class="toc-entry nav-item"><a class="nav-link" href="#using-an-asynchronous-for-loop">Using an asynchronous for loop</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#listening-for-stream-data">Listening for stream data</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#transforming-stream-data">Transforming stream data</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#handling-errors-and-completion">Handling errors and completion</a></li></ul></li><li class="toc-entry nav-item"><a class="nav-link" href="#more-information">More information</a></li></ul></div><article><div class="content"><div id="site-content-title"><h1>dart:async</h1></div><div id="site-toc--inline" class="site-toc toc-collapsible toc-collapsed"><header class="site-toc__title">Contents <span class="site-toc--inline__toggle toc-toggle-down"><i class="material-symbols">keyboard_arrow_down</i></span> <span class="site-toc--inline__toggle toc-toggle-up"><i class="material-symbols">keyboard_arrow_up</i></span></header><ul class="section-nav"><li class="toc-entry"><a href="#future">Future</a><ul><li class="toc-entry"><a href="#using-await">Using await</a></li><li class="toc-entry"><a href="#basic-usage">Basic usage</a></li><li class="toc-entry"><a href="#chaining-multiple-asynchronous-methods">Chaining multiple asynchronous methods</a></li><li class="toc-entry"><a href="#waiting-for-multiple-futures">Waiting for multiple futures</a></li><li class="toc-entry"><a href="#handling-errors-for-multiple-futures">Handling errors for multiple futures</a></li></ul></li><li class="toc-entry"><a href="#stream">Stream</a><ul><li class="toc-entry"><a href="#using-an-asynchronous-for-loop">Using an asynchronous for loop</a></li><li class="toc-entry"><a href="#listening-for-stream-data">Listening for stream data</a></li><li class="toc-entry"><a href="#transforming-stream-data">Transforming stream data</a></li><li class="toc-entry"><a href="#handling-errors-and-completion">Handling errors and completion</a></li></ul></li><li class="toc-entry"><a href="#more-information">More information</a></li></ul><span class="site-toc--inline__toggle toc-toggle-more-items"><i class="material-symbols">more_horiz</i></span></div> <?code-excerpt replace="/ *\/\/\s+ignore_for_file:[^\n]+\n//g; /(^|\n) *\/\/\s+ignore:[^\n]+\n/$1/g; /(\n[^\n]+) *\/\/\s+ignore:[^\n]+\n/$1\n/g"?> <?code-excerpt plaster="none"?> <p>Asynchronous programming often uses callback functions, but Dart provides alternatives: <a href="https://api.dart.dev/dart-async/Future-class.html">Future</a> and <a href="https://api.dart.dev/dart-async/Stream-class.html">Stream</a> objects. A Future is like a promise for a result to be provided sometime in the future. A Stream is a way to get a sequence of values, such as events. Future, Stream, and more are in the dart:async library (<a href="https://api.dart.dev/dart-async/dart-async-library.html">API reference</a>).</p><aside class="alert alert-info"><div class="alert-header"><span class="material-symbols" aria-hidden="true">info</span> <span>Note</span></div><div class="alert-content"><p>You don't always need to use the Future or Stream APIs directly. The Dart language supports asynchronous coding using keywords such as <code>async</code> and <code>await</code>. Check out the <a href="/libraries/async/async-await">asynchronous programming tutorial</a> for details.</p></div></aside><p>The dart:async library works in both web apps and command-line apps. To use it, import dart:async:</p> <?code-excerpt "misc/lib/library_tour/async/future.dart (import)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">import</span><span style="color:#11796D"> 'dart:async'</span><span style="color:#222222">;</span></span></code></pre></div></div><aside class="alert alert-success"><div class="alert-header"><span class="material-symbols" aria-hidden="true">lightbulb</span> <span>Tip</span></div><div class="alert-content"><p>You don't need to import dart:async to use the Future and Stream APIs, because dart:core exports those classes.</p></div></aside><div class="header-wrapper"><h2 id="future">Future</h2><a class="heading-link" href="#future" aria-label="Link to 'Future' section">#</a></div><p>Future objects appear throughout the Dart libraries, often as the object returned by an asynchronous method. When a future <em>completes</em>, its value is ready to use.</p><div class="header-wrapper"><h3 id="using-await">Using await</h3><a class="heading-link" href="#using-await" aria-label="Link to 'Using await' section">#</a></div><p>Before you directly use the Future API, consider using <code>await</code> instead. Code that uses <code>await</code> expressions can be easier to understand than code that uses the Future API.</p><p>Consider the following function. It uses Future's <code>then()</code> method to execute three asynchronous functions in a row, waiting for each one to complete before executing the next one.</p> <?code-excerpt "misc/lib/library_tour/async/future.dart (run-using-future)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">void</span><span style="color:#6200EE"> runUsingFuture</span><span style="color:#222222">() {</span></span> <span class="line"><span style="color:#6E6E70"> // ...</span></span> <span class="line"><span style="color:#6200EE"> findEntryPoint</span><span style="color:#222222">()</span></span> <span class="line"><span style="color:#222222"> .</span><span style="color:#6200EE">then</span><span style="color:#222222">((entryPoint) {</span></span> <span class="line"><span style="color:#D43324"> return</span><span style="color:#6200EE"> runExecutable</span><span style="color:#222222">(entryPoint, args);</span></span> <span class="line"><span style="color:#222222"> })</span></span> <span class="line"><span style="color:#222222"> .</span><span style="color:#6200EE">then</span><span style="color:#222222">(flushThenExit);</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p>The equivalent code with await expressions looks more like synchronous code:</p> <?code-excerpt "misc/lib/library_tour/async/future.dart (run-using-async-await)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#0468D7">Future</span><span style="color:#222222"><</span><span style="color:#D43324">void</span><span style="color:#222222">> </span><span style="color:#6200EE">runUsingAsyncAwait</span><span style="color:#222222">() </span><span style="color:#D43324">async</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#6E6E70"> // ...</span></span> <span class="line"><span style="color:#D43324"> var</span><span style="color:#222222"> entryPoint = </span><span style="color:#D43324">await</span><span style="color:#6200EE"> findEntryPoint</span><span style="color:#222222">();</span></span> <span class="line"><span style="color:#D43324"> var</span><span style="color:#222222"> exitCode = </span><span style="color:#D43324">await</span><span style="color:#6200EE"> runExecutable</span><span style="color:#222222">(entryPoint, args);</span></span> <span class="line"><span style="color:#D43324"> await</span><span style="color:#6200EE"> flushThenExit</span><span style="color:#222222">(exitCode);</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p>An <code>async</code> function can catch exceptions from Futures. For example:</p> <?code-excerpt "misc/lib/library_tour/async/future.dart (catch)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">var</span><span style="color:#222222"> entryPoint = </span><span style="color:#D43324">await</span><span style="color:#6200EE"> findEntryPoint</span><span style="color:#222222">();</span></span> <span class="line"><span style="color:#D43324">try</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#D43324"> var</span><span style="color:#222222"> exitCode = </span><span style="color:#D43324">await</span><span style="color:#6200EE"> runExecutable</span><span style="color:#222222">(entryPoint, args);</span></span> <span class="line"><span style="color:#D43324"> await</span><span style="color:#6200EE"> flushThenExit</span><span style="color:#222222">(exitCode);</span></span> <span class="line"><span style="color:#222222">} </span><span style="color:#D43324">catch</span><span style="color:#222222"> (e) {</span></span> <span class="line"><span style="color:#6E6E70"> // Handle the error...</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><aside class="alert alert-important"><div class="alert-header"><span class="material-symbols" aria-hidden="true">feedback</span> <span>Important</span></div><div class="alert-content"><p>Async functions return Futures. If you don't want your function to return a future, then use a different solution. For example, you might call an <code>async</code> function from your function.</p></div></aside><p>For more information on using <code>await</code> and related Dart language features, see the <a href="/libraries/async/async-await">asynchronous programming tutorial</a>.</p><div class="header-wrapper"><h3 id="basic-usage">Basic usage</h3><a class="heading-link" href="#basic-usage" aria-label="Link to 'Basic usage' section">#</a></div><p>You can use <code>then()</code> to schedule code that runs when the future completes. For example, <a href="https://pub.dev/documentation/http/latest/http/Client/read.html"><code>Client.read()</code></a> returns a Future, since HTTP requests can take a while. Using <code>then()</code> lets you run some code when that Future has completed and the promised string value is available:</p> <?code-excerpt "misc/lib/library_tour/async/basic.dart (then)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#222222">httpClient.</span><span style="color:#6200EE">read</span><span style="color:#222222">(url).</span><span style="color:#6200EE">then</span><span style="color:#222222">((</span><span style="color:#0468D7">String</span><span style="color:#222222"> result) {</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(result);</span></span> <span class="line"><span style="color:#222222">});</span></span></code></pre></div></div><p>Use <code>catchError()</code> to handle any errors or exceptions that a Future object might throw.</p> <?code-excerpt "misc/lib/library_tour/async/basic.dart (catch-error)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#222222">httpClient</span></span> <span class="line"><span style="color:#222222"> .</span><span style="color:#6200EE">read</span><span style="color:#222222">(url)</span></span> <span class="line"><span style="color:#222222"> .</span><span style="color:#6200EE">then</span><span style="color:#222222">((</span><span style="color:#0468D7">String</span><span style="color:#222222"> result) {</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(result);</span></span> <span class="line"><span style="color:#222222"> })</span></span> <span class="line"><span style="color:#222222"> .</span><span style="color:#6200EE">catchError</span><span style="color:#222222">((e) {</span></span> <span class="line"><span style="color:#6E6E70"> // Handle or ignore the error.</span></span> <span class="line"><span style="color:#222222"> });</span></span></code></pre></div></div><p>The <code>then().catchError()</code> pattern is the asynchronous version of <code>try</code>-<code>catch</code>.</p><aside class="alert alert-important"><div class="alert-header"><span class="material-symbols" aria-hidden="true">feedback</span> <span>Important</span></div><div class="alert-content"><p>Be sure to invoke <code>catchError()</code> on the result of <code>then()</code>鈥攏ot on the result of the original <code>Future</code>. Otherwise, the <code>catchError()</code> can handle errors only from the original Future's computation, but not from the handler registered by <code>then()</code>.</p></div></aside><div class="header-wrapper"><h3 id="chaining-multiple-asynchronous-methods">Chaining multiple asynchronous methods</h3><a class="heading-link" href="#chaining-multiple-asynchronous-methods" aria-label="Link to 'Chaining multiple asynchronous methods' section">#</a></div><p>The <code>then()</code> method returns a Future, providing a useful way to run multiple asynchronous functions in a certain order. If the callback registered with <code>then()</code> returns a Future, <code>then()</code> returns a Future that will complete with the same result as the Future returned from the callback. If the callback returns a value of any other type, <code>then()</code> creates a new Future that completes with the value.</p> <?code-excerpt "misc/lib/library_tour/async/future.dart (then-chain)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#0468D7">Future</span><span style="color:#222222"> result = </span><span style="color:#6200EE">costlyQuery</span><span style="color:#222222">(url);</span></span> <span class="line"><span style="color:#222222">result</span></span> <span class="line"><span style="color:#222222"> .</span><span style="color:#6200EE">then</span><span style="color:#222222">((value) => </span><span style="color:#6200EE">expensiveWork</span><span style="color:#222222">(value))</span></span> <span class="line"><span style="color:#222222"> .</span><span style="color:#6200EE">then</span><span style="color:#222222">((_) => </span><span style="color:#6200EE">lengthyComputation</span><span style="color:#222222">())</span></span> <span class="line"><span style="color:#222222"> .</span><span style="color:#6200EE">then</span><span style="color:#222222">((_) => </span><span style="color:#6200EE">print</span><span style="color:#222222">(</span><span style="color:#11796D">'Done!'</span><span style="color:#222222">))</span></span> <span class="line"><span style="color:#222222"> .</span><span style="color:#6200EE">catchError</span><span style="color:#222222">((exception) {</span></span> <span class="line"><span style="color:#6E6E70"> /* Handle exception... */</span></span> <span class="line"><span style="color:#222222"> });</span></span></code></pre></div></div><p>In the preceding example, the methods run in the following order:</p><ol><li><code>costlyQuery()</code></li><li><code>expensiveWork()</code></li><li><code>lengthyComputation()</code></li></ol><p>Here is the same code written using await:</p> <?code-excerpt "misc/lib/library_tour/async/future.dart (then-chain-as-await)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">try</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#D43324"> final</span><span style="color:#222222"> value = </span><span style="color:#D43324">await</span><span style="color:#6200EE"> costlyQuery</span><span style="color:#222222">(url);</span></span> <span class="line"><span style="color:#D43324"> await</span><span style="color:#6200EE"> expensiveWork</span><span style="color:#222222">(value);</span></span> <span class="line"><span style="color:#D43324"> await</span><span style="color:#6200EE"> lengthyComputation</span><span style="color:#222222">();</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(</span><span style="color:#11796D">'Done!'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222">} </span><span style="color:#D43324">catch</span><span style="color:#222222"> (e) {</span></span> <span class="line"><span style="color:#6E6E70"> /* Handle exception... */</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><div class="header-wrapper"><h3 id="waiting-for-multiple-futures">Waiting for multiple futures</h3><a class="heading-link" href="#waiting-for-multiple-futures" aria-label="Link to 'Waiting for multiple futures' section">#</a></div><p>Sometimes your algorithm needs to invoke many asynchronous functions and wait for them all to complete before continuing. Use the <a href="https://api.dart.dev/dart-async/Future/wait.html">Future.wait()</a> static method to manage multiple Futures and wait for them to complete:</p> <?code-excerpt "misc/lib/library_tour/async/future.dart (wait)" replace="/elideBody;/\/* ... *\//g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#0468D7">Future</span><span style="color:#222222"><</span><span style="color:#D43324">void</span><span style="color:#222222">> </span><span style="color:#6200EE">deleteLotsOfFiles</span><span style="color:#222222">() </span><span style="color:#D43324">async</span><span style="color:#222222"> => ...</span></span> <span class="line"><span style="color:#0468D7">Future</span><span style="color:#222222"><</span><span style="color:#D43324">void</span><span style="color:#222222">> </span><span style="color:#6200EE">copyLotsOfFiles</span><span style="color:#222222">() </span><span style="color:#D43324">async</span><span style="color:#222222"> => ...</span></span> <span class="line"><span style="color:#0468D7">Future</span><span style="color:#222222"><</span><span style="color:#D43324">void</span><span style="color:#222222">> </span><span style="color:#6200EE">checksumLotsOfOtherFiles</span><span style="color:#222222">() </span><span style="color:#D43324">async</span><span style="color:#222222"> => ...</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324">await</span><span style="color:#0468D7"> Future</span><span style="color:#222222">.</span><span style="color:#6200EE">wait</span><span style="color:#222222">([</span></span> <span class="line"><span style="color:#6200EE"> deleteLotsOfFiles</span><span style="color:#222222">(),</span></span> <span class="line"><span style="color:#6200EE"> copyLotsOfFiles</span><span style="color:#222222">(),</span></span> <span class="line"><span style="color:#6200EE"> checksumLotsOfOtherFiles</span><span style="color:#222222">(),</span></span> <span class="line"><span style="color:#222222">]);</span></span> <span class="line"><span style="color:#6200EE">print</span><span style="color:#222222">(</span><span style="color:#11796D">'Done with all the long steps!'</span><span style="color:#222222">);</span></span></code></pre></div></div><p><code>Future.wait()</code> returns a future which completes once all the provided futures have completed. It completes either with their results, or with an error if any of the provided futures fail.</p><div class="header-wrapper"><h3 id="handling-errors-for-multiple-futures">Handling errors for multiple futures</h3><a class="heading-link" href="#handling-errors-for-multiple-futures" aria-label="Link to 'Handling errors for multiple futures' section">#</a></div><p>You can also wait for parallel operations on an <a href="https://api.dart.dev/dart-async/FutureIterable/wait.html">iterable</a> or <a href="https://api.dart.dev/dart-async/FutureRecord2/wait.html">record</a> of futures.</p><p>These extensions return a future with the resulting values of all provided futures. Unlike <code>Future.wait</code>, they also let you handle errors.</p><p>If any future in the collection completes with an error, <code>wait</code> completes with a <a href="https://api.dart.dev/dart-async/ParallelWaitError-class.html"><code>ParallelWaitError</code></a>. This allows the caller to handle individual errors and dispose successful results if necessary.</p><p>When you <em>don't</em> need the result values from each individual future, use <code>wait</code> on an <em>iterable</em> of futures:</p><div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">void</span><span style="color:#6200EE"> main</span><span style="color:#222222">() </span><span style="color:#D43324">async</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#0468D7"> Future</span><span style="color:#222222"><</span><span style="color:#D43324">void</span><span style="color:#222222">> </span><span style="color:#6200EE">delete</span><span style="color:#222222">() </span><span style="color:#D43324">async</span><span style="color:#222222"> => ...</span></span> <span class="line"><span style="color:#0468D7"> Future</span><span style="color:#222222"><</span><span style="color:#D43324">void</span><span style="color:#222222">> </span><span style="color:#6200EE">copy</span><span style="color:#222222">() </span><span style="color:#D43324">async</span><span style="color:#222222"> => ...</span></span> <span class="line"><span style="color:#0468D7"> Future</span><span style="color:#222222"><</span><span style="color:#D43324">void</span><span style="color:#222222">> </span><span style="color:#6200EE">errorResult</span><span style="color:#222222">() </span><span style="color:#D43324">async</span><span style="color:#222222"> => ...</span></span> <span class="line"><span style="color:#222222"> </span></span> <span class="line"><span style="color:#D43324"> try</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#6E6E70"> // Wait for each future in a list, returns a list of futures:</span></span> <span class="line"><span style="color:#D43324"> var</span><span style="color:#222222"> results = </span><span style="color:#D43324">await</span><span style="color:#222222"> [</span><span style="color:#6200EE">delete</span><span style="color:#222222">(), </span><span style="color:#6200EE">copy</span><span style="color:#222222">(), </span><span style="color:#6200EE">errorResult</span><span style="color:#222222">()].wait;</span></span> <span class="line"></span> <span class="line"><span style="color:#222222"> } </span><span style="color:#D43324">on</span><span style="color:#0468D7"> ParallelWaitError</span><span style="color:#222222"><</span><span style="color:#0468D7">List</span><span style="color:#222222"><</span><span style="color:#0468D7">bool</span><span style="color:#222222">?>, </span><span style="color:#0468D7">List</span><span style="color:#222222"><</span><span style="color:#0468D7">AsyncError</span><span style="color:#222222">?>> </span><span style="color:#D43324">catch</span><span style="color:#222222"> (e) {</span></span> <span class="line"></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(e.values[</span><span style="color:#11796D">0</span><span style="color:#222222">]); </span><span style="color:#6E6E70">// Prints successful future</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(e.values[</span><span style="color:#11796D">1</span><span style="color:#222222">]); </span><span style="color:#6E6E70">// Prints successful future</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(e.values[</span><span style="color:#11796D">2</span><span style="color:#222222">]); </span><span style="color:#6E6E70">// Prints null when the result is an error</span></span> <span class="line"></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(e.errors[</span><span style="color:#11796D">0</span><span style="color:#222222">]); </span><span style="color:#6E6E70">// Prints null when the result is successful</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(e.errors[</span><span style="color:#11796D">1</span><span style="color:#222222">]); </span><span style="color:#6E6E70">// Prints null when the result is successful</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(e.errors[</span><span style="color:#11796D">2</span><span style="color:#222222">]); </span><span style="color:#6E6E70">// Prints error</span></span> <span class="line"><span style="color:#222222"> }</span></span> <span class="line"></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p>When you <em>do</em> need the individual result values from each future, use <code>wait</code> on a <em>record</em> of futures. This provides the additional benefit that the futures can be of different types:</p><div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">void</span><span style="color:#6200EE"> main</span><span style="color:#222222">() </span><span style="color:#D43324">async</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#0468D7"> Future</span><span style="color:#222222"><</span><span style="color:#0468D7">int</span><span style="color:#222222">> </span><span style="color:#6200EE">delete</span><span style="color:#222222">() </span><span style="color:#D43324">async</span><span style="color:#222222"> => ...</span></span> <span class="line"><span style="color:#0468D7"> Future</span><span style="color:#222222"><</span><span style="color:#0468D7">String</span><span style="color:#222222">> </span><span style="color:#6200EE">copy</span><span style="color:#222222">() </span><span style="color:#D43324">async</span><span style="color:#222222"> => ...</span></span> <span class="line"><span style="color:#0468D7"> Future</span><span style="color:#222222"><</span><span style="color:#0468D7">bool</span><span style="color:#222222">> </span><span style="color:#6200EE">errorResult</span><span style="color:#222222">() </span><span style="color:#D43324">async</span><span style="color:#222222"> => ...</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324"> try</span><span style="color:#222222"> { </span></span> <span class="line"><span style="color:#6E6E70"> // Wait for each future in a record, returns a record of futures:</span></span> <span class="line"><span style="color:#222222"> (</span><span style="color:#0468D7">int</span><span style="color:#222222">, </span><span style="color:#0468D7">String</span><span style="color:#222222">, </span><span style="color:#0468D7">bool</span><span style="color:#222222">) result = </span><span style="color:#D43324">await</span><span style="color:#222222"> (</span><span style="color:#6200EE">delete</span><span style="color:#222222">(), </span><span style="color:#6200EE">copy</span><span style="color:#222222">(), </span><span style="color:#6200EE">errorResult</span><span style="color:#222222">()).wait;</span></span> <span class="line"><span style="color:#222222"> </span></span> <span class="line"><span style="color:#222222"> } </span><span style="color:#D43324">on</span><span style="color:#0468D7"> ParallelWaitError</span><span style="color:#222222"><(</span><span style="color:#0468D7">int</span><span style="color:#222222">?, </span><span style="color:#0468D7">String</span><span style="color:#222222">?, </span><span style="color:#0468D7">bool</span><span style="color:#222222">?),</span></span> <span class="line"><span style="color:#222222"> (</span><span style="color:#0468D7">AsyncError</span><span style="color:#222222">?, </span><span style="color:#0468D7">AsyncError</span><span style="color:#222222">?, </span><span style="color:#0468D7">AsyncError</span><span style="color:#222222">?)> </span><span style="color:#D43324">catch</span><span style="color:#222222"> (e) {</span></span> <span class="line"><span style="color:#6E6E70"> // ...</span></span> <span class="line"><span style="color:#222222"> }</span></span> <span class="line"></span> <span class="line"><span style="color:#6E6E70"> // Do something with the results:</span></span> <span class="line"><span style="color:#D43324"> var</span><span style="color:#222222"> deleteInt = result.$1;</span></span> <span class="line"><span style="color:#D43324"> var</span><span style="color:#222222"> copyString = result.$2;</span></span> <span class="line"><span style="color:#D43324"> var</span><span style="color:#222222"> errorBool = result.$3;</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><div class="header-wrapper"><h2 id="stream">Stream</h2><a class="heading-link" href="#stream" aria-label="Link to 'Stream' section">#</a></div><p>Stream objects appear throughout Dart APIs, representing sequences of data. For example, HTML events such as button clicks are delivered using streams. You can also read a file as a stream.</p><div class="header-wrapper"><h3 id="using-an-asynchronous-for-loop">Using an asynchronous for loop</h3><a class="heading-link" href="#using-an-asynchronous-for-loop" aria-label="Link to 'Using an asynchronous for loop' section">#</a></div><p>Sometimes you can use an asynchronous for loop (<code>await for</code>) instead of using the Stream API.</p><p>Consider the following function. It uses Stream's <code>listen()</code> method to subscribe to a list of files, passing in a function literal that searches each file or directory.</p> <?code-excerpt "misc/lib/library_tour/async/stream.dart (listen)" replace="/listen/[!$&!]/g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">void</span><span style="color:#6200EE"> main</span><span style="color:#222222">(</span><span style="color:#0468D7">List</span><span style="color:#222222"><</span><span style="color:#0468D7">String</span><span style="color:#222222">> arguments) {</span></span> <span class="line"><span style="color:#6E6E70"> // ...</span></span> <span class="line"><span style="color:#0468D7"> FileSystemEntity</span><span style="color:#222222">.</span><span style="color:#6200EE">isDirectory</span><span style="color:#222222">(searchPath).</span><span style="color:#6200EE">then</span><span style="color:#222222">((isDir) {</span></span> <span class="line"><span style="color:#D43324"> if</span><span style="color:#222222"> (isDir) {</span></span> <span class="line"><span style="color:#D43324"> final</span><span style="color:#222222"> startingDir = </span><span style="color:#0468D7">Directory</span><span style="color:#222222">(searchPath);</span></span> <span class="line"><span style="color:#222222"> startingDir.</span><span style="color:#6200EE">list</span><span style="color:#222222">().</span><mark class="highlight"><span style="color:#6200EE">listen</span></mark><span style="color:#222222">((entity) {</span></span> <span class="line"><span style="color:#D43324"> if</span><span style="color:#222222"> (entity is </span><span style="color:#0468D7">File</span><span style="color:#222222">) {</span></span> <span class="line"><span style="color:#6200EE"> searchFile</span><span style="color:#222222">(entity, searchTerms);</span></span> <span class="line"><span style="color:#222222"> }</span></span> <span class="line"><span style="color:#222222"> });</span></span> <span class="line"><span style="color:#222222"> } </span><span style="color:#D43324">else</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#6200EE"> searchFile</span><span style="color:#222222">(</span><span style="color:#0468D7">File</span><span style="color:#222222">(searchPath), searchTerms);</span></span> <span class="line"><span style="color:#222222"> }</span></span> <span class="line"><span style="color:#222222"> });</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p>The equivalent code with await expressions, including an asynchronous for loop (<code>await for</code>), looks more like synchronous code:</p> <?code-excerpt "misc/lib/library_tour/async/stream.dart (await-for)" replace="/await for/[!$&!]/g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">void</span><span style="color:#6200EE"> main</span><span style="color:#222222">(</span><span style="color:#0468D7">List</span><span style="color:#222222"><</span><span style="color:#0468D7">String</span><span style="color:#222222">> arguments) </span><span style="color:#D43324">async</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#6E6E70"> // ...</span></span> <span class="line"><span style="color:#D43324"> if</span><span style="color:#222222"> (</span><span style="color:#D43324">await</span><span style="color:#0468D7"> FileSystemEntity</span><span style="color:#222222">.</span><span style="color:#6200EE">isDirectory</span><span style="color:#222222">(searchPath)) {</span></span> <span class="line"><span style="color:#D43324"> final</span><span style="color:#222222"> startingDir = </span><span style="color:#0468D7">Directory</span><span style="color:#222222">(searchPath);</span></span> <span class="line"><span style="color:#D43324"> </span><mark class="highlight"><span style="color:#D43324">await</span><span style="color:#D43324"> for</span></mark><span style="color:#222222"> (</span><span style="color:#D43324">final</span><span style="color:#222222"> entity </span><span style="color:#D43324">in</span><span style="color:#222222"> startingDir.</span><span style="color:#6200EE">list</span><span style="color:#222222">()) {</span></span> <span class="line"><span style="color:#D43324"> if</span><span style="color:#222222"> (entity is </span><span style="color:#0468D7">File</span><span style="color:#222222">) {</span></span> <span class="line"><span style="color:#6200EE"> searchFile</span><span style="color:#222222">(entity, searchTerms);</span></span> <span class="line"><span style="color:#222222"> }</span></span> <span class="line"><span style="color:#222222"> }</span></span> <span class="line"><span style="color:#222222"> } </span><span style="color:#D43324">else</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#6200EE"> searchFile</span><span style="color:#222222">(</span><span style="color:#0468D7">File</span><span style="color:#222222">(searchPath), searchTerms);</span></span> <span class="line"><span style="color:#222222"> }</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><aside class="alert alert-important"><div class="alert-header"><span class="material-symbols" aria-hidden="true">feedback</span> <span>Important</span></div><div class="alert-content"><p>Before using <code>await for</code>, make sure that it makes the code clearer and that you really do want to wait for all of the stream's results. For example, you usually should <strong>not</strong> use <code>await for</code> for DOM event listeners, because the DOM sends endless streams of events. If you use <code>await for</code> to register two DOM event listeners in a row, then the second kind of event is never handled.</p></div></aside><p>For more information on using <code>await</code> and related Dart language features, see the <a href="/libraries/async/async-await">asynchronous programming tutorial</a>.</p><div class="header-wrapper"><h3 id="listening-for-stream-data">Listening for stream data</h3><a class="heading-link" href="#listening-for-stream-data" aria-label="Link to 'Listening for stream data' section">#</a></div><p>To get each value as it arrives, either use <code>await for</code> or subscribe to the stream using the <code>listen()</code> method:</p> <?code-excerpt "misc/lib/library_tour/async/stream_web.dart (listen)" replace="/listen/[!$&!]/g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#6E6E70">// Add an event handler to a button.</span></span> <span class="line"><span style="color:#222222">submitButton.onClick.</span><mark class="highlight"><span style="color:#6200EE">listen</span></mark><span style="color:#222222">((e) {</span></span> <span class="line"><span style="color:#6E6E70"> // When the button is clicked, it runs this code.</span></span> <span class="line"><span style="color:#6200EE"> submitData</span><span style="color:#222222">();</span></span> <span class="line"><span style="color:#222222">});</span></span></code></pre></div></div><p>In this example, the <code>onClick</code> property is a <code>Stream</code> object provided by the submit button.</p><p>If you care about only one event, you can get it using a property such as <code>first</code>, <code>last</code>, or <code>single</code>. To test the event before handling it, use a method such as <code>firstWhere()</code>, <code>lastWhere()</code>, or <code>singleWhere()</code>.</p><p>If you care about a subset of events, you can use methods such as <code>skip()</code>, <code>skipWhile()</code>, <code>take()</code>, <code>takeWhile()</code>, and <code>where()</code>.</p><div class="header-wrapper"><h3 id="transforming-stream-data">Transforming stream data</h3><a class="heading-link" href="#transforming-stream-data" aria-label="Link to 'Transforming stream data' section">#</a></div><p>Often, you need to change the format of a stream's data before you can use it. Use the <code>transform()</code> method to produce a stream with a different type of data:</p> <?code-excerpt "misc/lib/library_tour/async/stream.dart (transform)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">var</span><span style="color:#222222"> lines = inputStream</span></span> <span class="line"><span style="color:#222222"> .</span><span style="color:#6200EE">transform</span><span style="color:#222222">(utf8.decoder)</span></span> <span class="line"><span style="color:#222222"> .</span><span style="color:#6200EE">transform</span><span style="color:#222222">(</span><span style="color:#D43324">const</span><span style="color:#0468D7"> LineSplitter</span><span style="color:#222222">());</span></span></code></pre></div></div><p>This example uses two transformers. First it uses utf8.decoder to transform the stream of integers into a stream of strings. Then it uses a LineSplitter to transform the stream of strings into a stream of separate lines. These transformers are from the dart:convert library (see the <a href="/libraries/dart-convert">dart:convert section</a>).</p><div class="header-wrapper"><h3 id="handling-errors-and-completion">Handling errors and completion</h3><a class="heading-link" href="#handling-errors-and-completion" aria-label="Link to 'Handling errors and completion' section">#</a></div><p>How you specify error and completion handling code depends on whether you use an asynchronous for loop (<code>await for</code>) or the Stream API.</p><p>If you use an asynchronous for loop, then use try-catch to handle errors. Code that executes after the stream is closed goes after the asynchronous for loop.</p> <?code-excerpt "misc/lib/library_tour/async/stream.dart (read-file-await-for)" replace="/try|catch/[!$&!]/g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#0468D7">Future</span><span style="color:#222222"><</span><span style="color:#D43324">void</span><span style="color:#222222">> </span><span style="color:#6200EE">readFileAwaitFor</span><span style="color:#222222">() </span><span style="color:#D43324">async</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#D43324"> var</span><span style="color:#222222"> config = </span><span style="color:#0468D7">File</span><span style="color:#222222">(</span><span style="color:#11796D">'config.txt'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#0468D7"> Stream</span><span style="color:#222222"><</span><span style="color:#0468D7">List</span><span style="color:#222222"><</span><span style="color:#0468D7">int</span><span style="color:#222222">>> inputStream = config.</span><span style="color:#6200EE">openRead</span><span style="color:#222222">();</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324"> var</span><span style="color:#222222"> lines = inputStream</span></span> <span class="line"><span style="color:#222222"> .</span><span style="color:#6200EE">transform</span><span style="color:#222222">(utf8.decoder)</span></span> <span class="line"><span style="color:#222222"> .</span><span style="color:#6200EE">transform</span><span style="color:#222222">(</span><span style="color:#D43324">const</span><span style="color:#0468D7"> LineSplitter</span><span style="color:#222222">());</span></span> <span class="line"><span style="color:#D43324"> </span><mark class="highlight"><span style="color:#D43324">try</span></mark><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#D43324"> await</span><span style="color:#D43324"> for</span><span style="color:#222222"> (</span><span style="color:#D43324">final</span><span style="color:#222222"> line </span><span style="color:#D43324">in</span><span style="color:#222222"> lines) {</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(</span><span style="color:#11796D">'Got </span><span style="color:#11796D">${</span><span style="color:#222222">line</span><span style="color:#11796D">.</span><span style="color:#222222">length</span><span style="color:#11796D">}</span><span style="color:#11796D"> characters from stream'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222"> }</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(</span><span style="color:#11796D">'file is now closed'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222"> } </span><mark class="highlight"><span style="color:#D43324">catch</span></mark><span style="color:#222222"> (e) {</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(e);</span></span> <span class="line"><span style="color:#222222"> }</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p>If you use the Stream API, then handle errors by registering an <code>onError</code> listener. Run code after the stream is closed by registering an <code>onDone</code> listener.</p> <?code-excerpt "misc/lib/library_tour/async/stream.dart (on-done)" replace="/onDone|onError/[!$&!]/g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">var</span><span style="color:#222222"> config = </span><span style="color:#0468D7">File</span><span style="color:#222222">(</span><span style="color:#11796D">'config.txt'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#0468D7">Stream</span><span style="color:#222222"><</span><span style="color:#0468D7">List</span><span style="color:#222222"><</span><span style="color:#0468D7">int</span><span style="color:#222222">>> inputStream = config.</span><span style="color:#6200EE">openRead</span><span style="color:#222222">();</span></span> <span class="line"></span> <span class="line"><span style="color:#222222">inputStream</span></span> <span class="line"><span style="color:#222222"> .</span><span style="color:#6200EE">transform</span><span style="color:#222222">(utf8.decoder)</span></span> <span class="line"><span style="color:#222222"> .</span><span style="color:#6200EE">transform</span><span style="color:#222222">(</span><span style="color:#D43324">const</span><span style="color:#0468D7"> LineSplitter</span><span style="color:#222222">())</span></span> <span class="line"><span style="color:#222222"> .</span><span style="color:#6200EE">listen</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#222222"> (</span><span style="color:#0468D7">String</span><span style="color:#222222"> line) {</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(</span><span style="color:#11796D">'Got </span><span style="color:#11796D">${</span><span style="color:#222222">line</span><span style="color:#11796D">.</span><span style="color:#222222">length</span><span style="color:#11796D">}</span><span style="color:#11796D"> characters from stream'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222"> },</span></span> <span class="line"><span style="color:#222222"> </span><mark class="highlight"><span style="color:#222222">onDone</span></mark><span style="color:#222222">: () {</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(</span><span style="color:#11796D">'file is now closed'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222"> },</span></span> <span class="line"><span style="color:#222222"> </span><mark class="highlight"><span style="color:#222222">onError</span></mark><span style="color:#222222">: (e) {</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(e);</span></span> <span class="line"><span style="color:#222222"> },</span></span> <span class="line"><span style="color:#222222"> );</span></span></code></pre></div></div><div class="header-wrapper"><h2 id="more-information">More information</h2><a class="heading-link" href="#more-information" aria-label="Link to 'More information' section">#</a></div><p>For some examples of using Future and Stream in command-line apps, check out the <a href="/libraries/dart-io">dart:io documentation</a>. Also see these articles and tutorials:</p><ul><li><a href="/libraries/async/async-await">Asynchronous programming: futures, async, await</a></li><li><a href="/libraries/async/futures-error-handling">Futures and error handling</a></li><li><a href="/libraries/async/using-streams">Asynchronous programming: streams</a></li><li><a href="/libraries/async/creating-streams">Creating streams in Dart</a></li><li><a href="/language/concurrency">Dart asynchronous programming: Isolates and event loops</a></li></ul><nav id="prev-next"><ul><li class="previous"><a href="/libraries/dart-core">⟨ dart:core</a></li><li class="next"><a href="/libraries/dart-math">dart:math ⟩</a></li></ul></nav><p id="page-github-links"><span>Unless stated otherwise, the documentation on this site reflects Dart 3.7.0. Page last updated on 2025-02-12.</span> <a href="https://github.com/dart-lang/site-www/tree/main/src/content/libraries/dart-async.md" target="_blank" rel="noopener">View source</a> <span>or </span><a href="https://github.com/dart-lang/site-www/issues/new?template=1_page_issue.yml&page-url=https://dart.dev/libraries/dart-async/&page-source=https://github.com/dart-lang/site-www/tree/main/src/content/libraries/dart-async.md" title="Report an issue with this page" target="_blank" rel="noopener">report an issue</a>.</p></div></article></main></div><footer id="page-footer"><div class="footer-section footer-main"><a href="/" class="brand" title="Dart"><img src="/assets/img/logo/logo-white-text.svg" alt="Dart" width="164"></a><div class="footer-social-links"><a href="https://medium.com/dartlang" target="_blank" rel="noopener" title="Dart's Medium publication"><svg><use href="/assets/img/social/medium.svg#medium"></use></svg> </a><a href="https://github.com/dart-lang" target="_blank" rel="noopener" title="Dart's GitHub organization"><svg><use href="/assets/img/social/github.svg#github"></use></svg> </a><a href="https://bsky.app/profile/dart.dev" target="_blank" rel="noopener" title="Dart's Bluesky profile"><svg><use href="/assets/img/social/bluesky.svg#bluesky"></use></svg> </a><a href="https://twitter.com/dart_lang" target="_blank" rel="noopener" title="Dart's X (Twitter) profile"><svg><use href="/assets/img/social/x.svg#x"></use></svg></a></div></div><div class="footer-section footer-tray"><div class="footer-licenses">Except as otherwise noted, this site is licensed under a <a href="https://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 International License</a>, and code samples are licensed under the <a href="https://opensource.org/licenses/BSD-3-Clause">3-Clause BSD License</a>.</div><div class="footer-utility-links"><ul><li><a href="/terms" title="Terms of use">Terms</a></li><li><a href="https://policies.google.com/privacy" target="_blank" rel="noopener" title="Privacy policy">Privacy</a></li><li><a href="/security" title="Security philosophy and practices">Security</a></li></ul></div></div></footer></div></body></html>