CINXE.COM

Dart basics | 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="A brief introduction to Dart programs and important concepts."><title>Dart basics | 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="Introduction to Dart"><meta name="twitter:description" content="A brief introduction to Dart programs and important concepts."><meta property="og:title" content="Introduction to Dart"><meta property="og:description" content="A brief introduction to Dart programs and important concepts."><meta property="og:url" content="/language/"><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=2"><script src="/assets/js/os-tabs.js?v=2"></script><script src="/assets/js/main.js?v=2"></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="page-header" class="site-header"><nav id="mainnav" class="site-header"><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 active collapsible" data-toggle="collapse" data-target="#-sidenav-1" role="button" aria-expanded="true" aria-controls="-sidenav-1"><span>Language</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse show" id="-sidenav-1"><li class="nav-item"><a class="nav-link active" 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 collapsed collapsible" data-toggle="collapse" data-target="#-sidenav-2" role="button" aria-expanded="false" aria-controls="-sidenav-2"><span>Core libraries</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" 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" 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="#hello-world">Hello World</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#variables">Variables</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#control-flow-statements">Control flow statements</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#functions">Functions</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#comments">Comments</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#imports">Imports</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#classes">Classes</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#enums">Enums</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#inheritance">Inheritance</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#mixins">Mixins</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#interfaces-and-abstract-classes">Interfaces and abstract classes</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#async">Async</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#exceptions">Exceptions</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#important-concepts">Important concepts</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#additional-resources">Additional resources</a></li></ul></div><article><div class="content"><div id="site-content-title"><h1>Introduction to Dart</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="#hello-world">Hello World</a></li><li class="toc-entry"><a href="#variables">Variables</a></li><li class="toc-entry"><a href="#control-flow-statements">Control flow statements</a></li><li class="toc-entry"><a href="#functions">Functions</a></li><li class="toc-entry"><a href="#comments">Comments</a></li><li class="toc-entry"><a href="#imports">Imports</a></li><li class="toc-entry"><a href="#classes">Classes</a></li><li class="toc-entry"><a href="#enums">Enums</a></li><li class="toc-entry"><a href="#inheritance">Inheritance</a></li><li class="toc-entry"><a href="#mixins">Mixins</a></li><li class="toc-entry"><a href="#interfaces-and-abstract-classes">Interfaces and abstract classes</a></li><li class="toc-entry"><a href="#async">Async</a></li><li class="toc-entry"><a href="#exceptions">Exceptions</a></li><li class="toc-entry"><a href="#important-concepts">Important concepts</a></li><li class="toc-entry"><a href="#additional-resources">Additional resources</a></li></ul><span class="site-toc--inline__toggle toc-toggle-more-items"><i class="material-symbols">more_horiz</i></span></div><p>This page provides a brief introduction to the Dart language through samples of its main features.</p><p>To learn more about the Dart language, visit the in-depth, individual topic pages listed under <strong>Language</strong> in the left side menu.</p><p>For coverage of Dart's core libraries, check out the <a href="/libraries">core library documentation</a>. You can also check out the <a href="/resources/dart-cheatsheet">Dart cheatsheet</a>, for a more interactive introduction.</p><div class="header-wrapper"><h2 id="hello-world">Hello World</h2><a class="heading-link" href="#hello-world" aria-label="Link to 'Hello World' section">#</a></div><p>Every app requires the top-level <code>main()</code> function, where execution starts. Functions that don't explicitly return a value have the <code>void</code> return type. To display text on the console, you can use the top-level <code>print()</code> function:</p> <?code-excerpt "misc/test/samples_test.dart (hello-world)"?> <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> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(</span><span style="color:#11796D">'Hello, World!'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p>Read more about <a href="/language/functions#the-main-function">the <code>main()</code> function</a> in Dart, including optional parameters for command-line arguments.</p><div class="header-wrapper"><h2 id="variables">Variables</h2><a class="heading-link" href="#variables" aria-label="Link to 'Variables' section">#</a></div><p>Even in <a href="/language/type-system">type-safe</a> Dart code, you can declare most variables without explicitly specifying their type using <code>var</code>. Thanks to type inference, these variables' types are determined by their initial values:</p> <?code-excerpt "misc/test/samples_test.dart (var)"?> <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"> name = </span><span style="color:#11796D">'Voyager I'</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#D43324">var</span><span style="color:#222222"> year = </span><span style="color:#11796D">1977</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#D43324">var</span><span style="color:#222222"> antennaDiameter = </span><span style="color:#11796D">3.7</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#D43324">var</span><span style="color:#222222"> flybyObjects = [</span><span style="color:#11796D">'Jupiter'</span><span style="color:#222222">, </span><span style="color:#11796D">'Saturn'</span><span style="color:#222222">, </span><span style="color:#11796D">'Uranus'</span><span style="color:#222222">, </span><span style="color:#11796D">'Neptune'</span><span style="color:#222222">];</span></span> <span class="line"><span style="color:#D43324">var</span><span style="color:#222222"> image = {</span></span> <span class="line"><span style="color:#11796D"> 'tags'</span><span style="color:#222222">: [</span><span style="color:#11796D">'saturn'</span><span style="color:#222222">],</span></span> <span class="line"><span style="color:#11796D"> 'url'</span><span style="color:#222222">: </span><span style="color:#11796D">'//path/to/saturn.jpg'</span><span style="color:#222222">,</span></span> <span class="line"><span style="color:#222222">};</span></span></code></pre></div></div><p><a href="/language/variables">Read more</a> about variables in Dart, including default values, the <code>final</code> and <code>const</code> keywords, and static types.</p><div class="header-wrapper"><h2 id="control-flow-statements">Control flow statements</h2><a class="heading-link" href="#control-flow-statements" aria-label="Link to 'Control flow statements' section">#</a></div><p>Dart supports the usual control flow statements:</p> <?code-excerpt "misc/test/samples_test.dart (control-flow)"?> <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">if</span><span style="color:#222222"> (year >= </span><span style="color:#11796D">2001</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">'21st century'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222">} </span><span style="color:#D43324">else</span><span style="color:#D43324"> if</span><span style="color:#222222"> (year >= </span><span style="color:#11796D">1901</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">'20th century'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222">}</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324">for</span><span style="color:#222222"> (</span><span style="color:#D43324">final</span><span style="color:#222222"> object </span><span style="color:#D43324">in</span><span style="color:#222222"> flybyObjects) {</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(object);</span></span> <span class="line"><span style="color:#222222">}</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324">for</span><span style="color:#222222"> (</span><span style="color:#0468D7">int</span><span style="color:#222222"> month = </span><span style="color:#11796D">1</span><span style="color:#222222">; month &#x3C;= </span><span style="color:#11796D">12</span><span style="color:#222222">; month++) {</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(month);</span></span> <span class="line"><span style="color:#222222">}</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324">while</span><span style="color:#222222"> (year &#x3C; </span><span style="color:#11796D">2016</span><span style="color:#222222">) {</span></span> <span class="line"><span style="color:#222222"> year += </span><span style="color:#11796D">1</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p>Read more about control flow statements in Dart, including <a href="/language/loops"><code>break</code> and <code>continue</code></a>, <a href="/language/branches"><code>switch</code> and <code>case</code></a>, and <a href="/language/error-handling#assert"><code>assert</code></a>.</p><div class="header-wrapper"><h2 id="functions">Functions</h2><a class="heading-link" href="#functions" aria-label="Link to 'Functions' section">#</a></div><p><a href="/effective-dart/design#types">We recommend</a> specifying the types of each function's arguments and return value:</p> <?code-excerpt "misc/test/samples_test.dart (functions)"?> <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">int</span><span style="color:#6200EE"> fibonacci</span><span style="color:#222222">(</span><span style="color:#0468D7">int</span><span style="color:#222222"> n) {</span></span> <span class="line"><span style="color:#D43324"> if</span><span style="color:#222222"> (n == </span><span style="color:#11796D">0</span><span style="color:#222222"> || n == </span><span style="color:#11796D">1</span><span style="color:#222222">) </span><span style="color:#D43324">return</span><span style="color:#222222"> n;</span></span> <span class="line"><span style="color:#D43324"> return</span><span style="color:#6200EE"> fibonacci</span><span style="color:#222222">(n - </span><span style="color:#11796D">1</span><span style="color:#222222">) + </span><span style="color:#6200EE">fibonacci</span><span style="color:#222222">(n - </span><span style="color:#11796D">2</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222">}</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324">var</span><span style="color:#222222"> result = </span><span style="color:#6200EE">fibonacci</span><span style="color:#222222">(</span><span style="color:#11796D">20</span><span style="color:#222222">);</span></span></code></pre></div></div><p>A shorthand <code>=&gt;</code> (<em>arrow</em>) syntax is handy for functions that contain a single statement. This syntax is especially useful when passing anonymous functions as arguments:</p> <?code-excerpt "misc/test/samples_test.dart (arrow)"?> <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">flybyObjects.</span><span style="color:#6200EE">where</span><span style="color:#222222">((name) => name.</span><span style="color:#6200EE">contains</span><span style="color:#222222">(</span><span style="color:#11796D">'turn'</span><span style="color:#222222">)).</span><span style="color:#6200EE">forEach</span><span style="color:#222222">(print);</span></span></code></pre></div></div><p>Besides showing an anonymous function (the argument to <code>where()</code>), this code shows that you can use a function as an argument: the top-level <code>print()</code> function is an argument to <code>forEach()</code>.</p><p><a href="/language/functions">Read more</a> about functions in Dart, including optional parameters, default parameter values, and lexical scope.</p><div class="header-wrapper"><h2 id="comments">Comments</h2><a class="heading-link" href="#comments" aria-label="Link to 'Comments' section">#</a></div><p>Dart comments usually start with <code>//</code>.</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:#6E6E70">// This is a normal, one-line comment.</span></span> <span class="line"></span> <span class="line"><span style="color:#6E6E70">/// This is a documentation comment, used to document libraries,</span></span> <span class="line"><span style="color:#6E6E70">/// classes, and their members. Tools like IDEs and dartdoc treat</span></span> <span class="line"><span style="color:#6E6E70">/// doc comments specially.</span></span> <span class="line"></span> <span class="line"><span style="color:#6E6E70">/* Comments like these are also supported. */</span></span></code></pre></div></div><p><a href="/language/comments">Read more</a> about comments in Dart, including how the documentation tooling works.</p><div class="header-wrapper"><h2 id="imports">Imports</h2><a class="heading-link" href="#imports" aria-label="Link to 'Imports' section">#</a></div><p>To access APIs defined in other libraries, use <code>import</code>.</p> <?code-excerpt "misc/test/samples_test.dart (import)" plaster="none"?> <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">// Importing core libraries</span></span> <span class="line"><span style="color:#D43324">import</span><span style="color:#11796D"> 'dart:math'</span><span style="color:#222222">;</span></span> <span class="line"></span> <span class="line"><span style="color:#6E6E70">// Importing libraries from external packages</span></span> <span class="line"><span style="color:#D43324">import</span><span style="color:#11796D"> 'package:test/test.dart'</span><span style="color:#222222">;</span></span> <span class="line"></span> <span class="line"><span style="color:#6E6E70">// Importing files</span></span> <span class="line"><span style="color:#D43324">import</span><span style="color:#11796D"> 'path/to/my_other_file.dart'</span><span style="color:#222222">;</span></span></code></pre></div></div><p><a href="/language/libraries">Read more</a> about libraries and visibility in Dart, including library prefixes, <code>show</code> and <code>hide</code>, and lazy loading through the <code>deferred</code> keyword.</p><div class="header-wrapper"><h2 id="classes">Classes</h2><a class="heading-link" href="#classes" aria-label="Link to 'Classes' section">#</a></div><p>Here's an example of a class with three properties, two constructors, and a method. One of the properties can't be set directly, so it's defined using a getter method (instead of a variable). The method uses string interpolation to print variables' string equivalents inside of string literals.</p> <?code-excerpt "misc/lib/samples/spacecraft.dart (class)"?> <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">class</span><span style="color:#0468D7"> Spacecraft</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#0468D7"> String</span><span style="color:#222222"> name;</span></span> <span class="line"><span style="color:#0468D7"> DateTime</span><span style="color:#222222">? launchDate;</span></span> <span class="line"></span> <span class="line"><span style="color:#6E6E70"> // Read-only non-final property</span></span> <span class="line"><span style="color:#0468D7"> int</span><span style="color:#222222">? </span><span style="color:#D43324">get</span><span style="color:#222222"> launchYear => launchDate?.year;</span></span> <span class="line"></span> <span class="line"><span style="color:#6E6E70"> // Constructor, with syntactic sugar for assignment to members.</span></span> <span class="line"><span style="color:#0468D7"> Spacecraft</span><span style="color:#222222">(</span><span style="color:#D43324">this</span><span style="color:#222222">.name, </span><span style="color:#D43324">this</span><span style="color:#222222">.launchDate) {</span></span> <span class="line"><span style="color:#6E6E70"> // Initialization code goes here.</span></span> <span class="line"><span style="color:#222222"> }</span></span> <span class="line"></span> <span class="line"><span style="color:#6E6E70"> // Named constructor that forwards to the default one.</span></span> <span class="line"><span style="color:#0468D7"> Spacecraft</span><span style="color:#222222">.</span><span style="color:#6200EE">unlaunched</span><span style="color:#222222">(</span><span style="color:#0468D7">String</span><span style="color:#222222"> name) : </span><span style="color:#D43324">this</span><span style="color:#222222">(name, </span><span style="color:#11796D">null</span><span style="color:#222222">);</span></span> <span class="line"></span> <span class="line"><span style="color:#6E6E70"> // Method.</span></span> <span class="line"><span style="color:#D43324"> void</span><span style="color:#6200EE"> describe</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">'Spacecraft: </span><span style="color:#11796D">$</span><span style="color:#222222">name</span><span style="color:#11796D">'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#6E6E70"> // Type promotion doesn't work on getters.</span></span> <span class="line"><span style="color:#D43324"> var</span><span style="color:#222222"> launchDate = </span><span style="color:#D43324">this</span><span style="color:#222222">.launchDate;</span></span> <span class="line"><span style="color:#D43324"> if</span><span style="color:#222222"> (launchDate != </span><span style="color:#11796D">null</span><span style="color:#222222">) {</span></span> <span class="line"><span style="color:#0468D7"> int</span><span style="color:#222222"> years = </span><span style="color:#0468D7">DateTime</span><span style="color:#222222">.</span><span style="color:#6200EE">now</span><span style="color:#222222">().</span><span style="color:#6200EE">difference</span><span style="color:#222222">(launchDate).inDays ~/ </span><span style="color:#11796D">365</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">'Launched: </span><span style="color:#11796D">$</span><span style="color:#222222">launchYear</span><span style="color:#11796D"> (</span><span style="color:#11796D">$</span><span style="color:#222222">years</span><span style="color:#11796D"> years ago)'</span><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"> print</span><span style="color:#222222">(</span><span style="color:#11796D">'Unlaunched'</span><span style="color:#222222">);</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><a href="/language/built-in-types#strings">Read more</a> about strings, including string interpolation, literals, expressions, and the <code>toString()</code> method.</p><p>You might use the <code>Spacecraft</code> class like this:</p> <?code-excerpt "misc/test/samples_test.dart (use-class)" plaster="none"?> <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"> voyager = </span><span style="color:#0468D7">Spacecraft</span><span style="color:#222222">(</span><span style="color:#11796D">'Voyager I'</span><span style="color:#222222">, </span><span style="color:#0468D7">DateTime</span><span style="color:#222222">(</span><span style="color:#11796D">1977</span><span style="color:#222222">, </span><span style="color:#11796D">9</span><span style="color:#222222">, </span><span style="color:#11796D">5</span><span style="color:#222222">));</span></span> <span class="line"><span style="color:#222222">voyager.</span><span style="color:#6200EE">describe</span><span style="color:#222222">();</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324">var</span><span style="color:#222222"> voyager3 = </span><span style="color:#0468D7">Spacecraft</span><span style="color:#222222">.</span><span style="color:#6200EE">unlaunched</span><span style="color:#222222">(</span><span style="color:#11796D">'Voyager III'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222">voyager3.</span><span style="color:#6200EE">describe</span><span style="color:#222222">();</span></span></code></pre></div></div><p><a href="/language/classes">Read more</a> about classes in Dart, including initializer lists, optional <code>new</code> and <code>const</code>, redirecting constructors, <code>factory</code> constructors, getters, setters, and much more.</p><div class="header-wrapper"><h2 id="enums">Enums</h2><a class="heading-link" href="#enums" aria-label="Link to 'Enums' section">#</a></div><p>Enums are a way of enumerating a predefined set of values or instances in a way which ensures that there cannot be any other instances of that type.</p><p>Here is an example of a simple <code>enum</code> that defines a simple list of predefined planet types:</p> <?code-excerpt "misc/lib/samples/spacecraft.dart (simple-enum)"?> <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">enum</span><span style="color:#0468D7"> PlanetType</span><span style="color:#222222"> { terrestrial, gas, ice }</span></span></code></pre></div></div><p>Here is an example of an enhanced enum declaration of a class describing planets, with a defined set of constant instances, namely the planets of our own solar system.</p> <?code-excerpt "misc/lib/samples/spacecraft.dart (enhanced-enum)"?> <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">/// Enum that enumerates the different planets in our solar system</span></span> <span class="line"><span style="color:#6E6E70">/// and some of their properties.</span></span> <span class="line"><span style="color:#D43324">enum</span><span style="color:#0468D7"> Planet</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#6200EE"> mercury</span><span style="color:#222222">(planetType: </span><span style="color:#0468D7">PlanetType</span><span style="color:#222222">.terrestrial, moons: </span><span style="color:#11796D">0</span><span style="color:#222222">, hasRings: </span><span style="color:#11796D">false</span><span style="color:#222222">),</span></span> <span class="line"><span style="color:#6200EE"> venus</span><span style="color:#222222">(planetType: </span><span style="color:#0468D7">PlanetType</span><span style="color:#222222">.terrestrial, moons: </span><span style="color:#11796D">0</span><span style="color:#222222">, hasRings: </span><span style="color:#11796D">false</span><span style="color:#222222">),</span></span> <span class="line"><span style="color:#6E6E70"> // 路路路</span></span> <span class="line"><span style="color:#6200EE"> uranus</span><span style="color:#222222">(planetType: </span><span style="color:#0468D7">PlanetType</span><span style="color:#222222">.ice, moons: </span><span style="color:#11796D">27</span><span style="color:#222222">, hasRings: </span><span style="color:#11796D">true</span><span style="color:#222222">),</span></span> <span class="line"><span style="color:#6200EE"> neptune</span><span style="color:#222222">(planetType: </span><span style="color:#0468D7">PlanetType</span><span style="color:#222222">.ice, moons: </span><span style="color:#11796D">14</span><span style="color:#222222">, hasRings: </span><span style="color:#11796D">true</span><span style="color:#222222">);</span></span> <span class="line"></span> <span class="line"><span style="color:#6E6E70"> /// A constant generating constructor</span></span> <span class="line"><span style="color:#D43324"> const</span><span style="color:#0468D7"> Planet</span><span style="color:#222222">({</span></span> <span class="line"><span style="color:#D43324"> required</span><span style="color:#D43324"> this</span><span style="color:#222222">.planetType,</span></span> <span class="line"><span style="color:#D43324"> required</span><span style="color:#D43324"> this</span><span style="color:#222222">.moons,</span></span> <span class="line"><span style="color:#D43324"> required</span><span style="color:#D43324"> this</span><span style="color:#222222">.hasRings,</span></span> <span class="line"><span style="color:#222222"> });</span></span> <span class="line"></span> <span class="line"><span style="color:#6E6E70"> /// All instance variables are final</span></span> <span class="line"><span style="color:#D43324"> final</span><span style="color:#0468D7"> PlanetType</span><span style="color:#222222"> planetType;</span></span> <span class="line"><span style="color:#D43324"> final</span><span style="color:#0468D7"> int</span><span style="color:#222222"> moons;</span></span> <span class="line"><span style="color:#D43324"> final</span><span style="color:#0468D7"> bool</span><span style="color:#222222"> hasRings;</span></span> <span class="line"></span> <span class="line"><span style="color:#6E6E70"> /// Enhanced enums support getters and other methods</span></span> <span class="line"><span style="color:#0468D7"> bool</span><span style="color:#D43324"> get</span><span style="color:#222222"> isGiant =></span></span> <span class="line"><span style="color:#222222"> planetType == </span><span style="color:#0468D7">PlanetType</span><span style="color:#222222">.gas || planetType == </span><span style="color:#0468D7">PlanetType</span><span style="color:#222222">.ice;</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p>You might use the <code>Planet</code> enum like this:</p> <?code-excerpt "misc/test/samples_test.dart (use-enum)" plaster="none"?> <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">final</span><span style="color:#222222"> yourPlanet = </span><span style="color:#0468D7">Planet</span><span style="color:#222222">.earth;</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324">if</span><span style="color:#222222"> (!yourPlanet.isGiant) {</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(</span><span style="color:#11796D">'Your planet is not a "giant planet".'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p><a href="/language/enums">Read more</a> about enums in Dart, including enhanced enum requirements, automatically introduced properties, accessing enumerated value names, switch statement support, and much more.</p><div class="header-wrapper"><h2 id="inheritance">Inheritance</h2><a class="heading-link" href="#inheritance" aria-label="Link to 'Inheritance' section">#</a></div><p>Dart has single inheritance.</p> <?code-excerpt "misc/lib/samples/spacecraft.dart (extends)"?> <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">class</span><span style="color:#0468D7"> Orbiter</span><span style="color:#D43324"> extends</span><span style="color:#0468D7"> Spacecraft</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#0468D7"> double</span><span style="color:#222222"> altitude;</span></span> <span class="line"></span> <span class="line"><span style="color:#0468D7"> Orbiter</span><span style="color:#222222">(</span><span style="color:#D43324">super</span><span style="color:#222222">.name, </span><span style="color:#0468D7">DateTime</span><span style="color:#D43324"> super</span><span style="color:#222222">.launchDate, </span><span style="color:#D43324">this</span><span style="color:#222222">.altitude);</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p><a href="/language/extend">Read more</a> about extending classes, the optional <code>@override</code> annotation, and more.</p><div class="header-wrapper"><h2 id="mixins">Mixins</h2><a class="heading-link" href="#mixins" aria-label="Link to 'Mixins' section">#</a></div><p>Mixins are a way of reusing code in multiple class hierarchies. The following is a mixin declaration:</p> <?code-excerpt "misc/lib/samples/spacecraft.dart (mixin)"?> <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">mixin</span><span style="color:#0468D7"> Piloted</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#0468D7"> int</span><span style="color:#222222"> astronauts = </span><span style="color:#11796D">1</span><span style="color:#222222">;</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324"> void</span><span style="color:#6200EE"> describeCrew</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">'Number of astronauts: </span><span style="color:#11796D">$</span><span style="color:#222222">astronauts</span><span style="color:#11796D">'</span><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>To add a mixin's capabilities to a class, just extend the class with the mixin.</p> <?code-excerpt "misc/lib/samples/spacecraft.dart (mixin-use)" replace="/with/[!$&!]/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">class</span><span style="color:#0468D7"> PilotedCraft</span><span style="color:#D43324"> extends</span><span style="color:#0468D7"> Spacecraft</span><span style="color:#D43324"> </span><mark class="highlight"><span style="color:#D43324">with</span></mark><span style="color:#0468D7"> Piloted</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#6E6E70"> // 路路路</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p><code>PilotedCraft</code> now has the <code>astronauts</code> field as well as the <code>describeCrew()</code> method.</p><p><a href="/language/mixins">Read more</a> about mixins.</p><div class="header-wrapper"><h2 id="interfaces-and-abstract-classes">Interfaces and abstract classes</h2><a class="heading-link" href="#interfaces-and-abstract-classes" aria-label="Link to 'Interfaces and abstract classes' section">#</a></div><p>All classes implicitly define an interface. Therefore, you can implement any class.</p> <?code-excerpt "misc/lib/samples/spacecraft.dart (implements)"?> <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">class</span><span style="color:#0468D7"> MockSpaceship</span><span style="color:#D43324"> implements</span><span style="color:#0468D7"> Spacecraft</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#6E6E70"> // 路路路</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p>Read more about <a href="/language/classes#implicit-interfaces">implicit interfaces</a>, or about the explicit <a href="/language/class-modifiers#interface"><code>interface</code> keyword</a>.</p><p>You can create an abstract class to be extended (or implemented) by a concrete class. Abstract classes can contain abstract methods (with empty bodies).</p> <?code-excerpt "misc/lib/samples/spacecraft.dart (abstract)" replace="/abstract/[!$&!]/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"><mark class="highlight"><span style="color:#D43324">abstract</span></mark><span style="color:#D43324"> class</span><span style="color:#0468D7"> Describable</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#D43324"> void</span><span style="color:#6200EE"> describe</span><span style="color:#222222">();</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324"> void</span><span style="color:#6200EE"> describeWithEmphasis</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">'========='</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#6200EE"> describe</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">'========='</span><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>Any class extending <code>Describable</code> has the <code>describeWithEmphasis()</code> method, which calls the extender's implementation of <code>describe()</code>.</p><p><a href="/language/class-modifiers#abstract">Read more</a> about abstract classes and methods.</p><div class="header-wrapper"><h2 id="async">Async</h2><a class="heading-link" href="#async" aria-label="Link to 'Async' section">#</a></div><p>Avoid callback hell and make your code much more readable by using <code>async</code> and <code>await</code>.</p> <?code-excerpt "misc/test/samples_test.dart (async)" replace="/async/[!$&!]/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">const</span><span style="color:#222222"> oneSecond = </span><span style="color:#0468D7">Duration</span><span style="color:#222222">(seconds: </span><span style="color:#11796D">1</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#6E6E70">// 路路路</span></span> <span class="line"><span style="color:#0468D7">Future</span><span style="color:#222222">&#x3C;</span><span style="color:#D43324">void</span><span style="color:#222222">> </span><span style="color:#6200EE">printWithDelay</span><span style="color:#222222">(</span><span style="color:#0468D7">String</span><span style="color:#222222"> message) </span><mark class="highlight"><span style="color:#D43324">async</span></mark><span style="color:#222222"> {</span></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">delayed</span><span style="color:#222222">(oneSecond);</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(message);</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p>The method above is equivalent to:</p> <?code-excerpt "misc/test/samples_test.dart (future-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:#0468D7">Future</span><span style="color:#222222">&#x3C;</span><span style="color:#D43324">void</span><span style="color:#222222">> </span><span style="color:#6200EE">printWithDelay</span><span style="color:#222222">(</span><span style="color:#0468D7">String</span><span style="color:#222222"> message) {</span></span> <span class="line"><span style="color:#D43324"> return</span><span style="color:#0468D7"> Future</span><span style="color:#222222">.</span><span style="color:#6200EE">delayed</span><span style="color:#222222">(oneSecond).</span><span style="color:#6200EE">then</span><span style="color:#222222">((_) {</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(message);</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>As the next example shows, <code>async</code> and <code>await</code> help make asynchronous code easy to read.</p> <?code-excerpt "misc/test/samples_test.dart (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">&#x3C;</span><span style="color:#D43324">void</span><span style="color:#222222">> </span><span style="color:#6200EE">createDescriptions</span><span style="color:#222222">(</span><span style="color:#0468D7">Iterable</span><span style="color:#222222">&#x3C;</span><span style="color:#0468D7">String</span><span style="color:#222222">> objects) </span><span style="color:#D43324">async</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#D43324"> for</span><span style="color:#222222"> (</span><span style="color:#D43324">final</span><span style="color:#222222"> object </span><span style="color:#D43324">in</span><span style="color:#222222"> objects) {</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"> file = </span><span style="color:#0468D7">File</span><span style="color:#222222">(</span><span style="color:#11796D">'</span><span style="color:#11796D">$</span><span style="color:#222222">object</span><span style="color:#11796D">.txt'</span><span style="color:#222222">);</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:#222222"> file.</span><span style="color:#6200EE">exists</span><span style="color:#222222">()) {</span></span> <span class="line"><span style="color:#D43324"> var</span><span style="color:#222222"> modified = </span><span style="color:#D43324">await</span><span style="color:#222222"> file.</span><span style="color:#6200EE">lastModified</span><span style="color:#222222">();</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#11796D"> 'File for </span><span style="color:#11796D">$</span><span style="color:#222222">object</span><span style="color:#11796D"> already exists. It was modified on </span><span style="color:#11796D">$</span><span style="color:#222222">modified</span><span style="color:#11796D">.'</span><span style="color:#222222">,</span></span> <span class="line"><span style="color:#222222"> );</span></span> <span class="line"><span style="color:#D43324"> continue</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#222222"> }</span></span> <span class="line"><span style="color:#D43324"> await</span><span style="color:#222222"> file.</span><span style="color:#6200EE">create</span><span style="color:#222222">();</span></span> <span class="line"><span style="color:#D43324"> await</span><span style="color:#222222"> file.</span><span style="color:#6200EE">writeAsString</span><span style="color:#222222">(</span><span style="color:#11796D">'Start describing </span><span style="color:#11796D">$</span><span style="color:#222222">object</span><span style="color:#11796D"> in this file.'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222"> } </span><span style="color:#D43324">on</span><span style="color:#0468D7"> IOException</span><span style="color:#D43324"> catch</span><span style="color:#222222"> (e) {</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(</span><span style="color:#11796D">'Cannot create description for </span><span style="color:#11796D">$</span><span style="color:#222222">object</span><span style="color:#11796D">: </span><span style="color:#11796D">$</span><span style="color:#222222">e</span><span style="color:#11796D">'</span><span style="color:#222222">);</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>You can also use <code>async*</code>, which gives you a nice, readable way to build streams.</p> <?code-excerpt "misc/test/samples_test.dart (async-star)"?> <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">Stream</span><span style="color:#222222">&#x3C;</span><span style="color:#0468D7">String</span><span style="color:#222222">> </span><span style="color:#6200EE">report</span><span style="color:#222222">(</span><span style="color:#0468D7">Spacecraft</span><span style="color:#222222"> craft, </span><span style="color:#0468D7">Iterable</span><span style="color:#222222">&#x3C;</span><span style="color:#0468D7">String</span><span style="color:#222222">> objects) </span><span style="color:#D43324">async</span><span style="color:#222222">* {</span></span> <span class="line"><span style="color:#D43324"> for</span><span style="color:#222222"> (</span><span style="color:#D43324">final</span><span style="color:#222222"> object </span><span style="color:#D43324">in</span><span style="color:#222222"> objects) {</span></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">delayed</span><span style="color:#222222">(oneSecond);</span></span> <span class="line"><span style="color:#D43324"> yield</span><span style="color:#11796D"> '</span><span style="color:#11796D">${</span><span style="color:#222222">craft</span><span style="color:#11796D">.</span><span style="color:#222222">name</span><span style="color:#11796D">}</span><span style="color:#11796D"> flies by </span><span style="color:#11796D">$</span><span style="color:#222222">object</span><span style="color:#11796D">'</span><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><a href="/language/async">Read more</a> about asynchrony support, including <code>async</code> functions, <code>Future</code>, <code>Stream</code>, and the asynchronous loop (<code>await for</code>).</p><div class="header-wrapper"><h2 id="exceptions">Exceptions</h2><a class="heading-link" href="#exceptions" aria-label="Link to 'Exceptions' section">#</a></div><p>To raise an exception, use <code>throw</code>:</p> <?code-excerpt "misc/test/samples_test.dart (throw)"?> <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">if</span><span style="color:#222222"> (astronauts == </span><span style="color:#11796D">0</span><span style="color:#222222">) {</span></span> <span class="line"><span style="color:#D43324"> throw</span><span style="color:#0468D7"> StateError</span><span style="color:#222222">(</span><span style="color:#11796D">'No astronauts.'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p>To catch an exception, use a <code>try</code> statement with <code>on</code> or <code>catch</code> (or both):</p> <?code-excerpt "misc/test/samples_test.dart (try)" replace="/on.*e\)/[!$&!]/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">&#x3C;</span><span style="color:#D43324">void</span><span style="color:#222222">> </span><span style="color:#6200EE">describeFlybyObjects</span><span style="color:#222222">(</span><span style="color:#0468D7">List</span><span style="color:#222222">&#x3C;</span><span style="color:#0468D7">String</span><span style="color:#222222">> flybyObjects) </span><span style="color:#D43324">async</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"> for</span><span style="color:#222222"> (</span><span style="color:#D43324">final</span><span style="color:#222222"> object </span><span style="color:#D43324">in</span><span style="color:#222222"> flybyObjects) {</span></span> <span class="line"><span style="color:#D43324"> var</span><span style="color:#222222"> description = </span><span style="color:#D43324">await</span><span style="color:#0468D7"> File</span><span style="color:#222222">(</span><span style="color:#11796D">'</span><span style="color:#11796D">$</span><span style="color:#222222">object</span><span style="color:#11796D">.txt'</span><span style="color:#222222">).</span><span style="color:#6200EE">readAsString</span><span style="color:#222222">();</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(description);</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:#D43324">on</span><span style="color:#0468D7"> IOException</span><span style="color:#D43324"> catch</span><span style="color:#222222"> (e)</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">'Could not describe object: </span><span style="color:#11796D">$</span><span style="color:#222222">e</span><span style="color:#11796D">'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222"> } </span><span style="color:#D43324">finally</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#222222"> flybyObjects.</span><span style="color:#6200EE">clear</span><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>Note that the code above is asynchronous; <code>try</code> works for both synchronous and asynchronous code in an <code>async</code> function.</p><p><a href="/language/error-handling#exceptions">Read more</a> about exceptions, including stack traces, <code>rethrow</code>, and the difference between <code>Error</code> and <code>Exception</code>.</p><div class="header-wrapper"><h2 id="important-concepts">Important concepts</h2><a class="heading-link" href="#important-concepts" aria-label="Link to 'Important concepts' section">#</a></div><p>As you continue to learn about the Dart language, keep these facts and concepts in mind:</p><ul><li><p>Everything you can place in a variable is an <em>object</em>, and every object is an instance of a <em>class</em>. Even numbers, functions, and <code>null</code> are objects. With the exception of <code>null</code> (if you enable <a href="/null-safety">sound null safety</a>), all objects inherit from the <a href="https://api.dart.dev/dart-core/Object-class.html"><code>Object</code></a> class.</p><aside class="alert alert-info"><div class="alert-header"><span class="material-symbols" aria-hidden="true">merge_type</span> <span>Version note</span></div><div class="alert-content"><p><a href="/null-safety">Null safety</a> was introduced in Dart 2.12. Using null safety requires a <a href="/resources/language/evolution#language-versioning">language version</a> of at least 2.12.</p></div></aside></li><li><p>Although Dart is strongly typed, type annotations are optional because Dart can infer types. In <code>var number = 101</code>, <code>number</code> is inferred to be of type <code>int</code>.</p></li><li><p>If you enable <a href="/null-safety">null safety</a>, variables can't contain <code>null</code> unless you say they can. You can make a variable nullable by putting a question mark (<code>?</code>) at the end of its type. For example, a variable of type <code>int?</code> might be an integer, or it might be <code>null</code>. If you <em>know</em> that an expression never evaluates to <code>null</code> but Dart disagrees, you can add <code>!</code> to assert that it isn't null (and to throw an exception if it is). An example: <code>int x = nullableButNotNullInt!</code></p></li><li><p>When you want to explicitly say that any type is allowed, use the type <code>Object?</code> (if you've enabled null safety), <code>Object</code>, or鈥攊f you must defer type checking until runtime鈥攖he <a href="/effective-dart/design#avoid-using-dynamic-unless-you-want-to-disable-static-checking">special type <code>dynamic</code></a>.</p></li><li><p>Dart supports generic types, like <code>List&lt;int&gt;</code> (a list of integers) or <code>List&lt;Object&gt;</code> (a list of objects of any type).</p></li><li><p>Dart supports top-level functions (such as <code>main()</code>), as well as functions tied to a class or object (<em>static</em> and <em>instance methods</em>, respectively). You can also create functions within functions (<em>nested</em> or <em>local functions</em>).</p></li><li><p>Similarly, Dart supports top-level <em>variables</em>, as well as variables tied to a class or object (static and instance variables). Instance variables are sometimes known as <em>fields</em> or <em>properties</em>.</p></li><li><p>Unlike Java, Dart doesn't have the keywords <code>public</code>, <code>protected</code>, and <code>private</code>. If an identifier starts with an underscore (<code>_</code>), it's private to its library. For details, see <a href="/language/libraries">Libraries and imports</a>.</p></li><li><p><em>Identifiers</em> can start with a letter or underscore (<code>_</code>), followed by any combination of those characters plus digits.</p></li><li><p>Dart has both <em>expressions</em> (which have runtime values) and <em>statements</em> (which don't). For example, the <a href="/language/operators#conditional-expressions">conditional expression</a> <code>condition ? expr1 : expr2</code> has a value of <code>expr1</code> or <code>expr2</code>. Compare that to an <a href="/language/branches#if">if-else statement</a>, which has no value. A statement often contains one or more expressions, but an expression can't directly contain a statement.</p></li><li><p>Dart tools can report two kinds of problems: <em>warnings</em> and <em>errors</em>. Warnings are just indications that your code might not work, but they don't prevent your program from executing. Errors can be either compile-time or run-time. A compile-time error prevents the code from executing at all; a run-time error results in an <a href="/language/error-handling#exceptions">exception</a> being raised while the code executes.</p></li></ul><div class="header-wrapper"><h2 id="additional-resources">Additional resources</h2><a class="heading-link" href="#additional-resources" aria-label="Link to 'Additional resources' section">#</a></div><p>You can find more documentation and code samples in the <a href="/libraries/dart-core">core library documentation</a> and the <a href="https://api.dart.dev">Dart API reference</a>. This site's code follows the conventions in the <a href="/effective-dart/style">Dart style guide</a>.</p><nav id="prev-next"><ul><li class="previous"></li><li class="next"><a href="/language/variables">Variables&nbsp;&nbsp;&rang;</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-13.</span> <a href="https://github.com/dart-lang/site-www/tree/main/src/content/language/index.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/language/&page-source=https://github.com/dart-lang/site-www/tree/main/src/content/language/index.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>

Pages: 1 2 3 4 5 6 7 8 9 10