CINXE.COM

Language evolution | 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="Notable changes and additions to the Dart programming language."><title>Language evolution | Dart</title><link rel="icon" sizes="64x64" href="/assets/img/logo/dart-64.png" eleventy:ignore><link href="/assets/img/touch-icon-iphone.png" rel="apple-touch-icon" eleventy:ignore><link href="/assets/img/touch-icon-ipad.png" rel="apple-touch-icon" sizes="152x152" eleventy:ignore><link href="/assets/img/touch-icon-iphone-retina.png" rel="apple-touch-icon" sizes="180x180" eleventy:ignore><link href="/assets/img/touch-icon-ipad-retina.png" rel="apple-touch-icon" sizes="167x167" eleventy:ignore><meta name="twitter:card" content="summary"><meta name="twitter:site" content="@dart_lang"><meta name="twitter:title" content="Dart language evolution"><meta name="twitter:description" content="Notable changes and additions to the Dart programming language."><meta property="og:title" content="Dart language evolution"><meta property="og:description" content="Notable changes and additions to the Dart programming language."><meta property="og:url" content="/resources/language/evolution/"><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" 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 collapsed collapsible" data-toggle="collapse" data-target="#-sidenav-1" role="button" aria-expanded="false" aria-controls="-sidenav-1"><span>Language</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1"><li class="nav-item"><a class="nav-link" href="/language"><div><span>Introduction</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-2" role="button" aria-expanded="false" aria-controls="-sidenav-1-2"><span>Syntax basics</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-2"><li class="nav-item"><a class="nav-link" href="/language/variables"><div><span>Variables</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/operators"><div><span>Operators</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/comments"><div><span>Comments</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/metadata"><div><span>Metadata</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/libraries"><div><span>Libraries & imports</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/keywords"><div><span>Keywords</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-3" role="button" aria-expanded="false" aria-controls="-sidenav-1-3"><span>Types</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-3"><li class="nav-item"><a class="nav-link" href="/language/built-in-types"><div><span>Built-in types</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/records"><div><span>Records</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/collections"><div><span>Collections</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/generics"><div><span>Generics</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/typedefs"><div><span>Typedefs</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/type-system"><div><span>Type system</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-4" role="button" aria-expanded="false" aria-controls="-sidenav-1-4"><span>Patterns</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-4"><li class="nav-item"><a class="nav-link" href="/language/patterns"><div><span>Overview & usage</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/pattern-types"><div><span>Pattern types</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://codelabs.developers.google.com/codelabs/dart-patterns-records" target="_blank" rel="noopener"><div><span>Applied tutorial</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li></ul></li><li class="nav-item"><a class="nav-link" href="/language/functions"><div><span>Functions</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-6" role="button" aria-expanded="false" aria-controls="-sidenav-1-6"><span>Control flow</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-6"><li class="nav-item"><a class="nav-link" href="/language/loops"><div><span>Loops</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/branches"><div><span>Branches</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/error-handling"><div><span>Error handling</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-7" role="button" aria-expanded="false" aria-controls="-sidenav-1-7"><span>Classes & objects</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-7"><li class="nav-item"><a class="nav-link" href="/language/classes"><div><span>Classes</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/constructors"><div><span>Constructors</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/methods"><div><span>Methods</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/extend"><div><span>Extend a class</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/mixins"><div><span>Mixins</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/enums"><div><span>Enums</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/extension-methods"><div><span>Extension methods</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/extension-types"><div><span>Extension types</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/callable-objects"><div><span>Callable objects</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-8" role="button" aria-expanded="false" aria-controls="-sidenav-1-8"><span>Class modifiers</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-8"><li class="nav-item"><a class="nav-link" href="/language/class-modifiers"><div><span>Overview & usage</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/class-modifiers-for-apis"><div><span>Class modifiers for API maintainers</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/modifier-reference"><div><span>Reference</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-9" role="button" aria-expanded="false" aria-controls="-sidenav-1-9"><span>Concurrency</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-9"><li class="nav-item"><a class="nav-link" href="/language/concurrency"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/async"><div><span>Asynchronous support</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/isolates"><div><span>Isolates</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-10" role="button" aria-expanded="false" aria-controls="-sidenav-1-10"><span>Null safety</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-10"><li class="nav-item"><a class="nav-link" href="/null-safety"><div><span>Sound null safety</span></div></a></li><li class="nav-item"><a class="nav-link" href="/null-safety/migration-guide"><div><span>Migrating to null safety</span></div></a></li><li class="nav-item"><a class="nav-link" href="/null-safety/understanding-null-safety"><div><span>Understanding null safety</span></div></a></li><li class="nav-item"><a class="nav-link" href="/null-safety/unsound-null-safety"><div><span>Unsound null safety</span></div></a></li><li class="nav-item"><a class="nav-link" href="/null-safety/faq"><div><span>FAQ</span></div></a></li></ul></li></ul></li><li class="nav-item"><button class="nav-link 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 active collapsible" data-toggle="collapse" data-target="#-sidenav-9" role="button" aria-expanded="true" aria-controls="-sidenav-9"><span>Resources</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse show" 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 active" 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="#changes-in-each-release">Changes in each release</a><ul class="nav"><li class="toc-entry nav-item"><a class="nav-link" href="#dart-3-7">Dart 3.7</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#dart-3-6">Dart 3.6</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#dart-3-5">Dart 3.5</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#dart-3-4">Dart 3.4</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#dart-3-3">Dart 3.3</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#dart-3-2">Dart 3.2</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#dart-3-1">Dart 3.1</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#dart-3-0">Dart 3.0</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#dart-2-19">Dart 2.19</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#dart-2-18">Dart 2.18</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#dart-2-17">Dart 2.17</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#dart-2-16">Dart 2.16</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#dart-2-15">Dart 2.15</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#dart-2-14">Dart 2.14</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#dart-2-13">Dart 2.13</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#dart-2-12">Dart 2.12</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#dart-2-10">Dart 2.10</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#dart-2-9">Dart 2.9</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#dart-2-8">Dart 2.8</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#dart-2-7">Dart 2.7</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#dart-2-6">Dart 2.6</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#dart-2-5">Dart 2.5</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#dart-2-4">Dart 2.4</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#dart-2-3">Dart 2.3</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#dart-2-2">Dart 2.2</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#dart-2-1">Dart 2.1</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#dart-2-0">Dart 2.0</a></li></ul></li><li class="toc-entry nav-item"><a class="nav-link" href="#language-versioning">Language versioning</a><ul class="nav"><li class="toc-entry nav-item"><a class="nav-link" href="#language-version-numbers">Language version numbers</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#per-library-language-version-selection">Per-library language version selection</a></li></ul></li></ul></div><article><div class="content"><div id="site-content-title"><h1>Dart language evolution</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="#changes-in-each-release">Changes in each release</a><ul><li class="toc-entry"><a href="#dart-3-7">Dart 3.7</a></li><li class="toc-entry"><a href="#dart-3-6">Dart 3.6</a></li><li class="toc-entry"><a href="#dart-3-5">Dart 3.5</a></li><li class="toc-entry"><a href="#dart-3-4">Dart 3.4</a></li><li class="toc-entry"><a href="#dart-3-3">Dart 3.3</a></li><li class="toc-entry"><a href="#dart-3-2">Dart 3.2</a></li><li class="toc-entry"><a href="#dart-3-1">Dart 3.1</a></li><li class="toc-entry"><a href="#dart-3-0">Dart 3.0</a></li><li class="toc-entry"><a href="#dart-2-19">Dart 2.19</a></li><li class="toc-entry"><a href="#dart-2-18">Dart 2.18</a></li><li class="toc-entry"><a href="#dart-2-17">Dart 2.17</a></li><li class="toc-entry"><a href="#dart-2-16">Dart 2.16</a></li><li class="toc-entry"><a href="#dart-2-15">Dart 2.15</a></li><li class="toc-entry"><a href="#dart-2-14">Dart 2.14</a></li><li class="toc-entry"><a href="#dart-2-13">Dart 2.13</a></li><li class="toc-entry"><a href="#dart-2-12">Dart 2.12</a></li><li class="toc-entry"><a href="#dart-2-10">Dart 2.10</a></li><li class="toc-entry"><a href="#dart-2-9">Dart 2.9</a></li><li class="toc-entry"><a href="#dart-2-8">Dart 2.8</a></li><li class="toc-entry"><a href="#dart-2-7">Dart 2.7</a></li><li class="toc-entry"><a href="#dart-2-6">Dart 2.6</a></li><li class="toc-entry"><a href="#dart-2-5">Dart 2.5</a></li><li class="toc-entry"><a href="#dart-2-4">Dart 2.4</a></li><li class="toc-entry"><a href="#dart-2-3">Dart 2.3</a></li><li class="toc-entry"><a href="#dart-2-2">Dart 2.2</a></li><li class="toc-entry"><a href="#dart-2-1">Dart 2.1</a></li><li class="toc-entry"><a href="#dart-2-0">Dart 2.0</a></li></ul></li><li class="toc-entry"><a href="#language-versioning">Language versioning</a><ul><li class="toc-entry"><a href="#language-version-numbers">Language version numbers</a></li><li class="toc-entry"><a href="#per-library-language-version-selection">Per-library language version selection</a></li></ul></li></ul><span class="site-toc--inline__toggle toc-toggle-more-items"><i class="material-symbols">more_horiz</i></span></div><p>This page lists notable changes and additions to the Dart programming language.</p><ul><li>To learn specific details about the most recent supported language version, check out the <a href="/language">language documentation</a> or the <a href="/resources/language/spec">language specification</a>.</li><li>For a full history of changes to the Dart SDK, see the <a href="https://github.com/dart-lang/sdk/blob/main/CHANGELOG.md">SDK changelog</a>.</li><li>For a full history of breaking changes, including <a href="#language-versioning">language versioned</a> changes, check out the <a href="/resources/breaking-changes">Breaking changes</a> page.</li></ul><p>To use a language feature introduced after 2.0, set an <a href="/tools/pub/pubspec#sdk-constraints">SDK constraint</a> no lower than the release when Dart first supported that feature.</p><p><strong>For example:</strong> To use null safety, introduced in <a href="#dart-2-12">2.12</a>, set <code>2.12.0</code> as the lower constraint in the <code>pubspec.yaml</code> file.</p><div class="code-block-wrapper language-yaml"><div class="code-block-body"><span class="code-block-language" title="Language yaml">yaml</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#0468D7">environment</span><span style="color:#222222">:</span></span> <span class="line"><span style="color:#0468D7"> sdk</span><span style="color:#222222">: </span><span style="color:#11796D">'>=2.12.0 &#x3C;3.0.0'</span></span></code></pre></div></div><aside class="alert alert-success"><div class="alert-header"><span class="material-symbols" aria-hidden="true">lightbulb</span> <span>Tip</span></div><div class="alert-content"><p>To review the features being discussed, investigated, and added to the Dart language, check out the <a href="https://github.com/dart-lang/language/projects/1">language funnel</a> tracker on the Dart language GitHub repo.</p></div></aside><div class="header-wrapper"><h2 id="changes-in-each-release">Changes in each release</h2><a class="heading-link" href="#changes-in-each-release" aria-label="Link to 'Changes in each release' section">#</a></div><div class="header-wrapper"><h3 id="dart-3-7">Dart 3.7</h3><a class="heading-link" href="#dart-3-7" aria-label="Link to 'Dart 3.7' section">#</a></div><p><em>Released 12 February 2025</em> | <a href="https://medium.com/dartlang/announcing-dart-3-7-bf864a1b195c">Dart 3.7 announcement</a></p><p>Dart 3.7 added support for <a href="/language/variables#wildcard-variables">wildcard variables</a> to the language. A wildcard variable is a local variable or parameter named <code>_</code>. Wildcard variables are non-binding, so they can be declared multiple times without collisions. For example:</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:#0468D7">Foo</span><span style="color:#222222">(_, </span><span style="color:#D43324">this</span><span style="color:#222222">._, </span><span style="color:#D43324">super</span><span style="color:#222222">._, </span><span style="color:#D43324">void</span><span style="color:#222222"> _()) {}</span></span></code></pre></div></div><p>The <code>dart format</code> command is also now tied to the language version as of 3.7. If the language version of an input file is 3.7 or later, the code is formatted with the new tall style.</p><p>The new style looks similar to the style you get when you add trailing commas to argument lists, except that now the formatter will add and remove those commas for you. When an argument or parameter lists splits, it is formatted like so:</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:#6200EE">longFunction</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#222222"> longArgument,</span></span> <span class="line"><span style="color:#222222"> anotherLongArgument,</span></span> <span class="line"><span style="color:#222222">);</span></span></code></pre></div></div><p>You can find more details in the <a href="https://github.com/dart-lang/sdk/blob/main/CHANGELOG.md#dart-format">changelog</a>.</p><div class="header-wrapper"><h3 id="dart-3-6">Dart 3.6</h3><a class="heading-link" href="#dart-3-6" aria-label="Link to 'Dart 3.6' section">#</a></div><p><em>Released 11 December 2024</em> | <a href="https://medium.com/dartlang/announcing-dart-3-6-778dd7a80983">Dart 3.6 announcement</a></p><p>Dart 3.6 added support for <a href="/language/built-in-types#digit-separators">digit separator</a> underscores (<code>_</code>) to the language. Digit separators improve readability of long number literals.</p><div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">var</span><span style="color:#222222"> m = </span><span style="color:#11796D">1__000_000__000_000__000_000</span><span style="color:#222222">;</span></span></code></pre></div></div><div class="header-wrapper"><h3 id="dart-3-5">Dart 3.5</h3><a class="heading-link" href="#dart-3-5" aria-label="Link to 'Dart 3.5' section">#</a></div><p><em>Released 6 August 2024</em> | <a href="https://medium.com/dartlang/dart-3-5-6ca36259fa2f">Dart 3.5 announcement</a></p><p>Dart 3.5 added no new language features, but made minor changes to the context considered during type inference. These include the following, non-language versioned changes:</p><ul><li>When the context for an <code>await</code> expression is <code>dynamic</code>, the context for the operand of expression is now <code>FutureOr&lt;_&gt;</code>.</li><li>When the context for an entire if-null expression (<code>e1 ?? e2</code>) is <code>dynamic</code>, the context for <code>e2</code> is now the static type of <code>e1</code>.</li></ul><div class="header-wrapper"><h3 id="dart-3-4">Dart 3.4</h3><a class="heading-link" href="#dart-3-4" aria-label="Link to 'Dart 3.4' section">#</a></div><p><em>Released 14 May 2024</em> | <a href="https://medium.com/dartlang/dart-3-4-bd8d23b4462a">Dart 3.4 announcement</a></p><p>Dart 3.4 made several improvements related to type analysis. These include:</p><ul><li>Improvements to the type analysis of conditional expressions, if-null expressions and assignments, and switch expressions.</li><li>Aligning the pattern context type schema for cast patterns with the spec.</li><li>Making the type schema for the null-aware spread operator (<code>...?</code>) nullable for maps and set literals, to match the behavior of list literals.</li></ul><div class="header-wrapper"><h3 id="dart-3-3">Dart 3.3</h3><a class="heading-link" href="#dart-3-3" aria-label="Link to 'Dart 3.3' section">#</a></div><p><em>Released 15 February 2024</em> | <a href="https://medium.com/dartlang/dart-3-3-325bf2bf6c13">Dart 3.3 announcement</a></p><p>Dart 3.3 added some enhancements to the language:</p><ul><li><p><a href="/language/extension-types">Extension types</a> are a new feature in Dart that allow zero-cost wrapping of an existing type. They are similar to wrapper classes and extension methods, but with implementation differences and different tradeoffs.</p><div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">extension type</span><span style="color:#0468D7"> Meters</span><span style="color:#222222">(</span><span style="color:#0468D7">int</span><span style="color:#222222"> value) {</span></span> <span class="line"><span style="color:#0468D7"> String</span><span style="color:#D43324"> get</span><span style="color:#222222"> label => </span><span style="color:#11796D">'</span><span style="color:#11796D">${</span><span style="color:#222222">value</span><span style="color:#11796D">}</span><span style="color:#11796D">m'</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#0468D7"> Meters</span><span style="color:#D43324"> operator</span><span style="color:#222222"> +(</span><span style="color:#0468D7">Meters</span><span style="color:#222222"> other) => </span><span style="color:#0468D7">Meters</span><span style="color:#222222">(value + other.value);</span></span> <span class="line"><span style="color:#222222">}</span></span> <span class="line"></span> <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:#D43324"> var</span><span style="color:#222222"> m = </span><span style="color:#0468D7">Meters</span><span style="color:#222222">(</span><span style="color:#11796D">42</span><span style="color:#222222">); </span><span style="color:#6E6E70">// Has type `Meters`.</span></span> <span class="line"><span style="color:#D43324"> var</span><span style="color:#222222"> m2 = m + m; </span><span style="color:#6E6E70">// OK, type `Meters`.</span></span> <span class="line"><span style="color:#6E6E70"> // int i = m; // Compile-time error, wrong type.</span></span> <span class="line"><span style="color:#6E6E70"> // m.isEven; // Compile-time error, no such member.</span></span> <span class="line"><span style="color:#D43324"> assert</span><span style="color:#222222">(</span><span style="color:#6200EE">identical</span><span style="color:#222222">(m, m.value)); </span><span style="color:#6E6E70">// Succeeds.</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div></li><li><p>Abstract getters are now promotable under the rules of <a href="/tools/non-promotion-reasons">private final field promotion</a>, if there are no conflicting declarations.</p></li></ul><div class="header-wrapper"><h3 id="dart-3-2">Dart 3.2</h3><a class="heading-link" href="#dart-3-2" aria-label="Link to 'Dart 3.2' section">#</a></div><p><em>Released 15 November 2023</em> | <a href="https://medium.com/dartlang/dart-3-2-c8de8fe1b91f">Dart 3.2 announcement</a></p><p>Dart 3.2 added enhancements to flow analysis, including:</p><ul><li><p>Expanded <a href="/null-safety/understanding-null-safety#type-promotion-on-null-checks">type promotion</a> to work on private final fields. Previously only available for local variables and parameters, now private final fields can promote to non-nullable types through null checks and <code>is</code> tests. For example, the following code is now sound:</p><div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">class</span><span style="color:#0468D7"> Example</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#D43324"> final</span><span style="color:#0468D7"> int</span><span style="color:#222222">? _privateField;</span></span> <span class="line"></span> <span class="line"><span style="color:#0468D7"> Example</span><span style="color:#222222">(</span><span style="color:#D43324">this</span><span style="color:#222222">._privateField);</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324"> void</span><span style="color:#6200EE"> f</span><span style="color:#222222">() {</span></span> <span class="line"><span style="color:#D43324"> if</span><span style="color:#222222"> (_privateField != </span><span style="color:#11796D">null</span><span style="color:#222222">) {</span></span> <span class="line"><span style="color:#6E6E70"> // _privateField has now been promoted; you can use it without</span></span> <span class="line"><span style="color:#6E6E70"> // null checking it.</span></span> <span class="line"><span style="color:#0468D7"> int</span><span style="color:#222222"> i = _privateField; </span><span style="color:#6E6E70">// OK</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> <span class="line"></span> <span class="line"><span style="color:#6E6E70">// Private field promotions also work from outside of the class:</span></span> <span class="line"><span style="color:#D43324">void</span><span style="color:#6200EE"> f</span><span style="color:#222222">(</span><span style="color:#0468D7">Example</span><span style="color:#222222"> x) {</span></span> <span class="line"><span style="color:#D43324"> if</span><span style="color:#222222"> (x._privateField != </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"> i = x._privateField; </span><span style="color:#6E6E70">// OK</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>For more information on when private final fields can and can't promote, check out <a href="/tools/non-promotion-reasons">Fixing type promotion failures</a>.</p></li><li><p>Corrected inconsistencies in type promotion behavior of <a href="/language/branches#if-case">if-case</a> statements where the value being matched against throws an exception.</p></li></ul><div class="header-wrapper"><h3 id="dart-3-1">Dart 3.1</h3><a class="heading-link" href="#dart-3-1" aria-label="Link to 'Dart 3.1' section">#</a></div><p><em>Released 16 August 2023</em> | <a href="https://medium.com/dartlang/dart-3-1-a-retrospective-on-functional-style-programming-in-dart-3-a1f4b3a7cdda">Dart 3.1 announcement</a></p><p>Dart 3.1 added no new features and made no changes to the language.</p><div class="header-wrapper"><h3 id="dart-3-0">Dart 3.0</h3><a class="heading-link" href="#dart-3-0" aria-label="Link to 'Dart 3.0' section">#</a></div><p><em>Released 10 May 2023</em> | <a href="https://medium.com/dartlang/announcing-dart-3-53f065a10635">Dart 3.0 announcement</a></p><p>Dart 3.0 introduced several new major language features:</p><ul><li><a href="/language/patterns">Patterns</a>, a new category of grammar that lets you match and destructure values.</li><li><a href="/language/records">Records</a>, a new type that lets you aggregate multiple values of different types in a single function return.</li><li><a href="/language/class-modifiers">Class modifiers</a>, a new set of keywords that let you control how a class or mixin can be used.</li><li><a href="/language/branches#switch-expressions">Switch expressions</a>, a new form of multi-way branching allowed where expressions are expected.</li><li><a href="/language/branches#if-case">If-case clauses</a>, a new conditional construct that matches a value against a pattern and executes the then or else branch, depending on whether the pattern matches.</li></ul><p>Dart 3.0 also introduced a few breaking language changes:</p><ul><li>Class declarations without the <a href="/language/mixins#class-mixin-or-mixin-class"><code>mixin</code></a> class modifier can no longer be applied as mixins.</li><li>It is now a compile time error if a colon (<code>:</code>) is used as the separator before the default value of an optional named parameter. Use an equal sign (<code>=</code>) instead.</li><li>It is now a compile-time error if a <code>continue</code> statement targets a label that is not attached to a loop statement (<code>for</code>, <code>do</code>, and <code>while</code>) or a <code>switch</code> member.</li></ul><aside class="alert alert-info"><div class="alert-header"><span class="material-symbols" aria-hidden="true">info</span> <span>Note</span></div><div class="alert-content"><p>The 3.0 release of the Dart SDK dropped support for <a href="#language-versioning">language versions</a> before 2.12.</p></div></aside><div class="header-wrapper"><h3 id="dart-2-19">Dart 2.19</h3><a class="heading-link" href="#dart-2-19" aria-label="Link to 'Dart 2.19' section">#</a></div><p><em>Released 25 January 2023</em></p><p>Dart 2.19 introduced some precautions surrounding type inference. These include:</p><ul><li>More flow analysis flags for unreachable code cases.</li><li>No longer delegate inaccessible private names to <code>noSuchMethod</code>.</li><li>Top-level type inference throws on cyclic dependencies.</li></ul><p>Dart 2.19 also introduced support for unnamed libraries. Library directives, used for appending library-level doc comments and annotations, can and <a href="/effective-dart/style#dont-explicitly-name-libraries">should</a> now be written without a name:</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">/// A really great test library.</span></span> <span class="line"><span style="color:#D43324">@TestOn</span><span style="color:#222222">(</span><span style="color:#11796D">'browser'</span><span style="color:#222222">)</span></span> <span class="line"><span style="color:#D43324">library</span><span style="color:#222222">;</span></span></code></pre></div></div><div class="header-wrapper"><h3 id="dart-2-18">Dart 2.18</h3><a class="heading-link" href="#dart-2-18" aria-label="Link to 'Dart 2.18' section">#</a></div><p><em>Released 30 August 2022</em> | <a href="https://medium.com/dartlang/dart-2-18-f4b3101f146c">Dart 2.18 announcement</a></p><p>Dart 2.18 enhanced type inference. This change allows information flow between arguments in generic function calls. Before 2.18, if you didn't specify an argument's type in some methods, Dart reported errors. These type errors cited potential null occurrences. With 2.18, the compiler infers the argument type from other values in an invocation. You don't need to specify the argument type inline.</p><p>Dart 2.18 also discontinued support for mixin classes that don't extend <code>Object</code>.</p><p>To learn more about these features, check out:</p><ul><li><a href="/language/type-system#type-argument-inference">Type argument inference</a></li><li><a href="/language/mixins">Adding features to a class: mixins</a></li></ul><div class="header-wrapper"><h3 id="dart-2-17">Dart 2.17</h3><a class="heading-link" href="#dart-2-17" aria-label="Link to 'Dart 2.17' section">#</a></div><p><em>Released 11 May 2022</em> | <a href="https://medium.com/dartlang/dart-2-17-b216bfc80c5d">Dart 2.17 announcement</a></p><p>Dart 2.17 expanded enum functionality with enhanced enums. Enhanced enums allow enum declarations to define members including fields, constructors, methods, getters, etc.</p><p>Dart 2.17 added support for super-initializer parameters in constructors. Super parameters allow you to avoid having to manually pass each parameter into the super invocation of a non-redirecting constructor. You can instead use super parameters to forward parameters to a superclass constructor.</p><p>Dart 2.17 removed some restrictions on named arguments. Named arguments can now be freely interleaved with positional arguments. As of Dart 2.17, you can write the following 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:#D43324">void</span><span style="color:#6200EE"> main</span><span style="color:#222222">() {</span></span> <span class="line"><span style="color:#6200EE"> test</span><span style="color:#222222">(skip: </span><span style="color:#11796D">true</span><span style="color:#222222">, </span><span style="color:#11796D">'A test description'</span><span style="color:#222222">, () {</span></span> <span class="line"><span style="color:#6E6E70"> // Very long function body here...</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 learn more about these features, check out:</p><ul><li><a href="/language/enums#declaring-enhanced-enums">Enhanced enums</a></li><li><a href="/language/constructors#super-parameters">Super parameters</a></li><li><a href="/language/functions#named-parameters">Named parameters</a></li></ul><div class="header-wrapper"><h3 id="dart-2-16">Dart 2.16</h3><a class="heading-link" href="#dart-2-16" aria-label="Link to 'Dart 2.16' section">#</a></div><p><em>Released 3 February 2022</em> | <a href="https://medium.com/dartlang/dart-2-15-7e7a598e508a">Dart 2.16 announcement</a></p><p>Dart 2.16 added no new features to the Dart language. It did expand the Dart tools.</p><div class="header-wrapper"><h3 id="dart-2-15">Dart 2.15</h3><a class="heading-link" href="#dart-2-15" aria-label="Link to 'Dart 2.15' section">#</a></div><p><em>Released 8 December 2021</em> | <a href="https://medium.com/dartlang/dart-2-15-7e7a598e508a">Dart 2.15 announcement</a></p><p>Dart 2.15 improved support for function pointers, known as <em>tear-offs.</em> In particular, constructor tear-offs are now supported.</p><div class="header-wrapper"><h3 id="dart-2-14">Dart 2.14</h3><a class="heading-link" href="#dart-2-14" aria-label="Link to 'Dart 2.14' section">#</a></div><p><em>Released 8 September 2021</em> | <a href="https://medium.com/dartlang/announcing-dart-2-14-b48b9bb2fb67">Dart 2.14 announcement</a></p><p>Dart 2.14 added the unsigned shift (or <em>triple-shift</em>) operator (<code>&gt;&gt;&gt;</code>). This new operator works like <code>&gt;&gt;</code>, except that it always fills the most significant bits with zeros.</p><p>To learn more about these operators, check out <a href="/language/operators#bitwise-and-shift-operators">bitwise and shift operators</a>.</p><p>Dart 2.14 removed some restrictions on type arguments. You can pass type arguments to annotations and use a generic function type as a type argument. As of Dart 2.14, you can write the following 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:#D43324">@TypeHelper</span><span style="color:#222222">&#x3C;</span><span style="color:#0468D7">int</span><span style="color:#222222">>(</span><span style="color:#11796D">42</span><span style="color:#222222">, </span><span style="color:#11796D">"The meaning"</span><span style="color:#222222">)</span></span> <span class="line"><span style="color:#D43324">late</span><span style="color:#0468D7"> List</span><span style="color:#222222">&#x3C;</span><span style="color:#0468D7">T</span><span style="color:#0468D7"> Function</span><span style="color:#222222">&#x3C;</span><span style="color:#0468D7">T</span><span style="color:#222222">>(</span><span style="color:#0468D7">T</span><span style="color:#222222">)> idFunctions;</span></span> <span class="line"><span style="color:#D43324">var</span><span style="color:#222222"> callback = [&#x3C;</span><span style="color:#0468D7">T</span><span style="color:#222222">>(</span><span style="color:#0468D7">T</span><span style="color:#222222"> value) => value];</span></span> <span class="line"><span style="color:#D43324">late</span><span style="color:#0468D7"> S</span><span style="color:#0468D7"> Function</span><span style="color:#222222">&#x3C;</span><span style="color:#0468D7">S</span><span style="color:#D43324"> extends</span><span style="color:#0468D7"> T</span><span style="color:#0468D7"> Function</span><span style="color:#222222">&#x3C;</span><span style="color:#0468D7">T</span><span style="color:#222222">>(</span><span style="color:#0468D7">T</span><span style="color:#222222">)>(</span><span style="color:#0468D7">S</span><span style="color:#222222">) f;</span></span></code></pre></div></div><div class="header-wrapper"><h3 id="dart-2-13">Dart 2.13</h3><a class="heading-link" href="#dart-2-13" aria-label="Link to 'Dart 2.13' section">#</a></div><p><em>Released 19 May 2021</em> | <a href="https://medium.com/dartlang/announcing-dart-2-13-c6d547b57067">Dart 2.13 announcement</a></p><p>Dart 2.13 expanded support for <strong><a href="/language/typedefs">type aliases</a></strong> (<code>typedef</code>). Type aliases used to work only for function types but now work for any type. You can use the new name created with a type alias anywhere the original type could be used.</p><p>Dart 2.13 improved the struct support in <strong><a href="/interop/c-interop">Dart FFI</a></strong>, adding support for inline arrays and packed structs.</p><div class="header-wrapper"><h3 id="dart-2-12">Dart 2.12</h3><a class="heading-link" href="#dart-2-12" aria-label="Link to 'Dart 2.12' section">#</a></div><p><em>Released 3 March 2021</em> | <a href="https://medium.com/dartlang/announcing-dart-2-12-499a6e689c87">Dart 2.12 announcement</a></p><p>Dart 2.12 added support for <strong><a href="/null-safety">sound null safety</a></strong>. When you opt into null safety, types in your code are non-nullable by default, meaning that variables can't contain null unless you say they can. With null safety, your runtime null-dereference errors turn into edit-time analysis errors.</p><p>In Dart 2.12, <strong><a href="/interop/c-interop">Dart FFI</a></strong> graduated from beta to the stable channel.</p><div class="header-wrapper"><h3 id="dart-2-10">Dart 2.10</h3><a class="heading-link" href="#dart-2-10" aria-label="Link to 'Dart 2.10' section">#</a></div><p><em>Released 1 October 2020</em> | <a href="https://medium.com/dartlang/announcing-dart-2-10-350823952bd5">Dart 2.10 announcement</a></p><p>Dart 2.10 added no new features to the Dart language.</p><div class="header-wrapper"><h3 id="dart-2-9">Dart 2.9</h3><a class="heading-link" href="#dart-2-9" aria-label="Link to 'Dart 2.9' section">#</a></div><p><em>Released 5 August 2020</em></p><p>Dart 2.9 added no new features to the Dart language.</p><div class="header-wrapper"><h3 id="dart-2-8">Dart 2.8</h3><a class="heading-link" href="#dart-2-8" aria-label="Link to 'Dart 2.8' section">#</a></div><p><em>Released 6 May 2020</em> | <a href="https://medium.com/dartlang/announcing-dart-2-8-7750918db0a">Dart 2.8 announcement</a></p><p>Dart 2.8 didn't add any features to the Dart language. It did contain a number of preparatory <a href="https://github.com/dart-lang/sdk/issues/40686">breaking changes</a> to improve nullability-related usability and performance for <a href="/null-safety">null safety</a>.</p><div class="header-wrapper"><h3 id="dart-2-7">Dart 2.7</h3><a class="heading-link" href="#dart-2-7" aria-label="Link to 'Dart 2.7' section">#</a></div><p><em>Released 11 December 2019</em> | <a href="https://medium.com/dartlang/dart-2-7-a3710ec54e97">Dart 2.7 announcement</a></p><p>Dart 2.7 added support for <strong><a href="/language/extension-methods">extension methods</a></strong>, enabling you to add functionality to any type —-even types you don't control—- with the brevity and auto-complete experience of regular method calls.</p><p>The following example extends the <code>String</code> class from <code>dart:core</code> with a new <code>parseInt()</code> method:</p><div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">extension</span><span style="color:#0468D7"> ParseNumbers</span><span style="color:#D43324"> on</span><span style="color:#0468D7"> String</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#0468D7"> int</span><span style="color:#6200EE"> parseInt</span><span style="color:#222222">() {</span></span> <span class="line"><span style="color:#D43324"> return</span><span style="color:#0468D7"> int</span><span style="color:#222222">.</span><span style="color:#6200EE">parse</span><span style="color:#222222">(</span><span style="color:#D43324">this</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> <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:#0468D7"> int</span><span style="color:#222222"> i = </span><span style="color:#11796D">'42'</span><span style="color:#222222">.</span><span style="color:#6200EE">parseInt</span><span style="color:#222222">();</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(i);</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><div class="header-wrapper"><h3 id="dart-2-6">Dart 2.6</h3><a class="heading-link" href="#dart-2-6" aria-label="Link to 'Dart 2.6' section">#</a></div><p><em>Released 5 November 2019</em> | <a href="https://medium.com/dartlang/dart2native-a76c815e6baf">Dart 2.6 announcement</a></p><p>Dart 2.6 introduced a <a href="https://github.com/dart-lang/sdk/issues/37985">breaking change (dart-lang/sdk#37985)</a>. Constraints where <code>Null</code> serves as a subtype of <code>FutureOr&lt;T&gt;</code> now yield <code>Null</code> as the solution for <code>T</code>.</p><p>For example: The following code now prints <code>Null</code>. Before Dart 2.6, it printed <code>dynamic</code>. The anonymous closure <code>() {}</code> returns the <code>Null</code> type.</p><div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">import</span><span style="color:#11796D"> 'dart:async'</span><span style="color:#222222">;</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324">void</span><span style="color:#6200EE"> foo</span><span style="color:#222222">&#x3C;</span><span style="color:#0468D7">T</span><span style="color:#222222">>(</span><span style="color:#0468D7">FutureOr</span><span style="color:#222222">&#x3C;</span><span style="color:#0468D7">T</span><span style="color:#222222">> </span><span style="color:#0468D7">Function</span><span style="color:#222222">() f) { </span><span style="color:#6200EE">print</span><span style="color:#222222">(</span><span style="color:#0468D7">T</span><span style="color:#222222">); }</span></span> <span class="line"></span> <span class="line"><span style="color:#6200EE">main</span><span style="color:#222222">() { </span><span style="color:#6200EE">foo</span><span style="color:#222222">(() {}); }</span></span></code></pre></div></div><div class="header-wrapper"><h3 id="dart-2-5">Dart 2.5</h3><a class="heading-link" href="#dart-2-5" aria-label="Link to 'Dart 2.5' section">#</a></div><p><em>Released 10 September 2019</em> | <a href="https://medium.com/dartlang/announcing-dart-2-5-super-charged-development-328822024970">Dart 2.5 announcement</a></p><p>Dart 2.5 didn't add any features to the Dart language, but it did add support for <a href="/interop/c-interop">calling native C code</a> from Dart code using a new <strong>core library, <code>dart:ffi</code>.</strong></p><div class="header-wrapper"><h3 id="dart-2-4">Dart 2.4</h3><a class="heading-link" href="#dart-2-4" aria-label="Link to 'Dart 2.4' section">#</a></div><p><em>Released 27 June 2019</em></p><p>Dart 2.4 introduces a breaking change <a href="https://github.com/dart-lang/sdk/issues/35097">dart-lang/sdk#35097</a>.</p><p>Dart now enforces covariance of type variables used in super-interfaces. For example: Prior to this release Dart accepted, but now rejects, the following 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:#D43324">class</span><span style="color:#0468D7"> A</span><span style="color:#222222">&#x3C;</span><span style="color:#0468D7">X</span><span style="color:#222222">> {};</span></span> <span class="line"><span style="color:#D43324">class</span><span style="color:#0468D7"> B</span><span style="color:#222222">&#x3C;</span><span style="color:#0468D7">X</span><span style="color:#222222">> </span><span style="color:#D43324">extends</span><span style="color:#0468D7"> A</span><span style="color:#222222">&#x3C;</span><span style="color:#D43324">void</span><span style="color:#0468D7"> Function</span><span style="color:#222222">(</span><span style="color:#0468D7">X</span><span style="color:#222222">)> {};</span></span></code></pre></div></div><p>You can now use <code>async</code> as an identifier in asynchronous and generator functions.</p><div class="header-wrapper"><h3 id="dart-2-3">Dart 2.3</h3><a class="heading-link" href="#dart-2-3" aria-label="Link to 'Dart 2.3' section">#</a></div><p><em>Released 8 May 2019</em> | <a href="https://medium.com/dartlang/announcing-dart-2-3-optimized-for-building-user-interfaces-e84919ca1dff">Dart 2.3 announcement</a></p><p>Dart 2.3 added three operators designed to improve code that performs list manipulation, such as declarative UI code.</p><p>The <strong><a href="/language/collections#spread-operators">spread operator</a></strong> enables unpacking the elements from one list into another. In the following example, the list returned by <code>buildMainElements()</code> is unpacked into the list being passed to the <code>children</code> argument:</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:#0468D7">Widget</span><span style="color:#6200EE"> build</span><span style="color:#222222">(</span><span style="color:#0468D7">BuildContext</span><span style="color:#222222"> context) {</span></span> <span class="line"><span style="color:#D43324"> return</span><span style="color:#0468D7"> Column</span><span style="color:#222222">(children: [</span></span> <span class="line"><span style="color:#0468D7"> Header</span><span style="color:#222222">(),</span></span> <span class="line"><span style="color:#222222"> ...</span><span style="color:#6200EE">buildMainElements</span><span style="color:#222222">(),</span></span> <span class="line"><span style="color:#0468D7"> Footer</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>The <strong><a href="/language/collections#control-flow-operators">collection if</a></strong> operator enables adding elements conditionally. The following example adds a <code>FlatButton</code> element unless the app displays the last page:</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:#0468D7">Widget</span><span style="color:#6200EE"> build</span><span style="color:#222222">(</span><span style="color:#0468D7">BuildContext</span><span style="color:#222222"> context) {</span></span> <span class="line"><span style="color:#D43324"> return</span><span style="color:#0468D7"> Column</span><span style="color:#222222">(children: [</span></span> <span class="line"><span style="color:#0468D7"> Text</span><span style="color:#222222">(mainText),</span></span> <span class="line"><span style="color:#D43324"> if</span><span style="color:#222222"> (page != pages.last)</span></span> <span class="line"><span style="color:#0468D7"> FlatButton</span><span style="color:#222222">(child: </span><span style="color:#0468D7">Text</span><span style="color:#222222">(</span><span style="color:#11796D">'Next'</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>The <strong><a href="/language/collections#control-flow-operators">collection for</a></strong> operator enables building repeated elements. The following example adds one <code>HeadingAction</code> element for each section in <code>sections</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:#0468D7">Widget</span><span style="color:#6200EE"> build</span><span style="color:#222222">(</span><span style="color:#0468D7">BuildContext</span><span style="color:#222222"> context) {</span></span> <span class="line"><span style="color:#D43324"> return</span><span style="color:#0468D7"> Column</span><span style="color:#222222">(children: [</span></span> <span class="line"><span style="color:#0468D7"> Text</span><span style="color:#222222">(mainText),</span></span> <span class="line"><span style="color:#D43324"> for</span><span style="color:#222222"> (</span><span style="color:#D43324">var</span><span style="color:#222222"> section </span><span style="color:#D43324">in</span><span style="color:#222222"> sections)</span></span> <span class="line"><span style="color:#0468D7"> HeadingAction</span><span style="color:#222222">(section.heading),</span></span> <span class="line"><span style="color:#222222"> ]);</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><div class="header-wrapper"><h3 id="dart-2-2">Dart 2.2</h3><a class="heading-link" href="#dart-2-2" aria-label="Link to 'Dart 2.2' section">#</a></div><p><em>Released 26 February 2019</em> | <a href="https://medium.com/dartlang/announcing-dart-2-2-faster-native-code-support-for-set-literals-7e2ab19cc86d">Dart 2.2 announcement</a></p><p>Dart 2.2 added support for <strong><a href="/language/collections#sets">set literals</a></strong>:</p><div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">const</span><span style="color:#0468D7"> Set</span><span style="color:#222222">&#x3C;</span><span style="color:#0468D7">String</span><span style="color:#222222">> currencies = {</span><span style="color:#11796D">'EUR'</span><span style="color:#222222">, </span><span style="color:#11796D">'USD'</span><span style="color:#222222">, </span><span style="color:#11796D">'JPY'</span><span style="color:#222222">};</span></span></code></pre></div></div><div class="header-wrapper"><h3 id="dart-2-1">Dart 2.1</h3><a class="heading-link" href="#dart-2-1" aria-label="Link to 'Dart 2.1' section">#</a></div><p><em>Released 15 November 2018</em> | <a href="https://medium.com/dartlang/announcing-dart-2-1-improved-performance-usability-9f55fca6f31a">Dart 2.1 announcement</a></p><p>Dart 2.1 added support for <strong>int-to-double conversion</strong>, allowing developers to set <code>double</code> values using integer literals. This feature removed the annoyance of being forced to use a <code>double</code> literal (for example, <code>4.0</code>) when the value was an integer in concept.</p><p>In the following Flutter code, <code>horizontal</code> and <code>vertical</code> have type <code>double</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:#222222">padding: </span><span style="color:#D43324">const</span><span style="color:#0468D7"> EdgeInsets</span><span style="color:#222222">.</span><span style="color:#6200EE">symmetric</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#222222"> horizontal: </span><span style="color:#11796D">4</span><span style="color:#222222">,</span></span> <span class="line"><span style="color:#222222"> vertical: </span><span style="color:#11796D">8</span><span style="color:#222222">,</span></span> <span class="line"><span style="color:#222222">)</span></span></code></pre></div></div><div class="header-wrapper"><h3 id="dart-2-0">Dart 2.0</h3><a class="heading-link" href="#dart-2-0" aria-label="Link to 'Dart 2.0' section">#</a></div><p><em>Released 22 February 2018</em> | <a href="https://medium.com/dartlang/announcing-dart-2-80ba01f43b6">Dart 2.0 announcement</a></p><p>Dart 2.0 implemented a new <strong><a href="/language/type-system">sound type system</a></strong>. Before Dart 2.0, types weren't fully sound, and Dart relied heavily on runtime type checking. Dart 1.x code had to be migrated to Dart 2.</p><div class="header-wrapper"><h2 id="language-versioning">Language versioning</h2><a class="heading-link" href="#language-versioning" aria-label="Link to 'Language versioning' section">#</a></div><p>A single Dart SDK can simultaneously support multiple versions of the Dart language. The compiler determines what version the code is targeting, and it interprets the code according to that version.</p><p>Language versioning becomes important on the rare occasions when Dart introduces an incompatible feature like <a href="/null-safety">null safety</a>. When Dart introduces a breaking change, code that did compile might no longer compile. Language versioning allows you to set each library's language version to maintain compatibility.</p><p>In the case of null safety, Dart SDKs 2.12 through 2.19 allowed you to <em>choose</em> to update your code to use null safety. Dart uses language versioning to permit non-null-safe code to run alongside null-safe code. This decision enabled migration from non-null-safe to null-safe code. To review an example of how an app or package can migrate to a new language version with an incompatible feature, check out <a href="/null-safety/migration-guide">Migrating to null safety</a>.</p><p>Each package has a default language version equal to the <strong>lower bound</strong> of the SDK constraint in the <code>pubspec.yaml</code> file.</p><p><strong>For example:</strong> The following entry in a <code>pubspec.yaml</code> file indicates that this package defaults to the Dart 2.18 language version.</p><div class="code-block-wrapper language-yaml"><div class="code-block-body"><span class="code-block-language" title="Language yaml">yaml</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#0468D7">environment</span><span style="color:#222222">:</span></span> <span class="line"><span style="color:#0468D7"> sdk</span><span style="color:#222222">: </span><span style="color:#11796D">'>=2.18.0 &#x3C;3.0.0'</span></span></code></pre></div></div><div class="header-wrapper"><h3 id="language-version-numbers">Language version numbers</h3><a class="heading-link" href="#language-version-numbers" aria-label="Link to 'Language version numbers' section">#</a></div><p>Dart formats its language versions as two numbers separated with a period. It reads as a major version number and a minor version number. Minor version numbers might introduce breaking changes.</p><p>Dart releases might append a patch number to a language version. Patches should not change the language except for bug fixes. To illustrate: Dart 2.18.3 serves as the latest release of the Dart 2.18 SDK language version.</p><p>Each Dart SDK supports all of the language versions within its major version number. That means that Dart SDK 2.18.3 supports language versions 2.0 through 2.18 inclusive, but not Dart 1.x.</p><p>Deriving the language version from the SDK version implies the following:</p><ul><li><p>Whenever a minor version of the SDK ships, a new language version appears. In practice, many of these language versions work in a very similar manner to previous versions and have with full compatibility between them. For example: The Dart 2.9 language works much like the Dart 2.8 language.</p></li><li><p>When a patch release of the SDK ships, it cannot introduce new language features. For example: The 2.18.3 release <em>remains</em> language version 2.18. It must remain compatible with 2.18.2, 2.18.1, and 2.18.0.</p></li></ul><div class="header-wrapper"><h3 id="per-library-language-version-selection">Per-library language version selection</h3><a class="heading-link" href="#per-library-language-version-selection" aria-label="Link to 'Per-library language version selection' section">#</a></div><p>By default, every Dart file in a package uses the same language version. Dart identifies the default language version as the lower-bound of the SDK constraint specified in the <code>pubspec.yaml</code> file. Sometimes, a Dart file might need to use an older language version. For example, you might not be able to migrate all the files in a package to null safety at the same time.</p><p>Dart supports per-library language version selection. To opt to have a different language version from the rest of a package, a <a href="/tools/pub/create-packages#organizing-a-package">Dart library</a> must include a comment in the following format:</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">// @dart = &#x3C;major>.&#x3C;minor></span></span></code></pre></div></div><p>For example:</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">// Description of what's in this file.</span></span> <span class="line"><span style="color:#6E6E70">// @dart = 2.17</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 style="color:#222222">...</span></span></code></pre></div></div><p>The <code>@dart</code> string must be in a <code>//</code> comment (not <code>///</code> or <code>/*</code>), and it must appear before any Dart code in the file. Whitespace (tabs and spaces) doesn't matter, except within the <code>@dart</code> and version strings. As the previous example shows, other comments can appear before the <code>@dart</code> comment.</p><p>To learn how and why the Dart team developed this versioning method, check out the <a href="https://github.com/dart-lang/language/blob/main/accepted/2.8/language-versioning/feature-specification.md#dart-language-versioning">language versioning specification</a>.</p><p id="page-github-links"><span>Unless stated otherwise, the documentation on this site reflects Dart 3.7.0. Page last updated on 2025-02-12.</span> <a href="https://github.com/dart-lang/site-www/tree/main/src/content/resources/language/evolution.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/resources/language/evolution/&page-source=https://github.com/dart-lang/site-www/tree/main/src/content/resources/language/evolution.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