CINXE.COM
Patterns | 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="Summary of patterns in Dart."><title>Patterns | 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="Patterns"><meta name="twitter:description" content="Summary of patterns in Dart."><meta property="og:title" content="Patterns"><meta property="og:description" content="Summary of patterns in Dart."><meta property="og:url" content="/language/patterns/"><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 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" 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 active collapsible" data-toggle="collapse" data-target="#-sidenav-1-4" role="button" aria-expanded="true" aria-controls="-sidenav-1-4"><span>Patterns</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse show" id="-sidenav-1-4"><li class="nav-item"><a class="nav-link active" 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="#what-patterns-do">What patterns do</a><ul class="nav"><li class="toc-entry nav-item"><a class="nav-link" href="#matching">Matching</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#destructuring">Destructuring</a></li></ul></li><li class="toc-entry nav-item"><a class="nav-link" href="#places-patterns-can-appear">Places patterns can appear</a><ul class="nav"><li class="toc-entry nav-item"><a class="nav-link" href="#variable-declaration">Variable declaration</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#variable-assignment">Variable assignment</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#switch-statements-and-expressions">Switch statements and expressions</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#for-and-for-in-loops">For and for-in loops</a></li></ul></li><li class="toc-entry nav-item"><a class="nav-link" href="#use-cases-for-patterns">Use cases for patterns</a><ul class="nav"><li class="toc-entry nav-item"><a class="nav-link" href="#destructuring-multiple-returns">Destructuring multiple returns</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#destructuring-class-instances">Destructuring class instances</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#algebraic-data-types">Algebraic data types</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#validating-incoming-json">Validating incoming JSON</a></li></ul></li></ul></div><article><div class="content"><div id="site-content-title"><h1>Patterns</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="#what-patterns-do">What patterns do</a><ul><li class="toc-entry"><a href="#matching">Matching</a></li><li class="toc-entry"><a href="#destructuring">Destructuring</a></li></ul></li><li class="toc-entry"><a href="#places-patterns-can-appear">Places patterns can appear</a><ul><li class="toc-entry"><a href="#variable-declaration">Variable declaration</a></li><li class="toc-entry"><a href="#variable-assignment">Variable assignment</a></li><li class="toc-entry"><a href="#switch-statements-and-expressions">Switch statements and expressions</a></li><li class="toc-entry"><a href="#for-and-for-in-loops">For and for-in loops</a></li></ul></li><li class="toc-entry"><a href="#use-cases-for-patterns">Use cases for patterns</a><ul><li class="toc-entry"><a href="#destructuring-multiple-returns">Destructuring multiple returns</a></li><li class="toc-entry"><a href="#destructuring-class-instances">Destructuring class instances</a></li><li class="toc-entry"><a href="#algebraic-data-types">Algebraic data types</a></li><li class="toc-entry"><a href="#validating-incoming-json">Validating incoming JSON</a></li></ul></li></ul><span class="site-toc--inline__toggle toc-toggle-more-items"><i class="material-symbols">more_horiz</i></span></div><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>Patterns require a <a href="/resources/language/evolution#language-versioning">language version</a> of at least 3.0.</p></div></aside><p>Patterns are a syntactic category in the Dart language, like statements and expressions. A pattern represents the shape of a set of values that it may match against actual values.</p><p>This page describes:</p><ul><li>What patterns do.</li><li>Where patterns are allowed in Dart code.</li><li>What the common use cases for patterns are.</li></ul><p>To learn about the different kinds of patterns, visit the <a href="/language/pattern-types">pattern types</a> page.</p><div class="header-wrapper"><h2 id="what-patterns-do">What patterns do</h2><a class="heading-link" href="#what-patterns-do" aria-label="Link to 'What patterns do' section">#</a></div><p>In general, a pattern may <strong>match</strong> a value, <strong>destructure</strong> a value, or both, depending on the context and shape of the pattern.</p><p>First, <em>pattern matching</em> allows you to check whether a given value:</p><ul><li>Has a certain shape.</li><li>Is a certain constant.</li><li>Is equal to something else.</li><li>Has a certain type.</li></ul><p>Then, <em>pattern destructuring</em> provides you with a convenient declarative syntax to break that value into its constituent parts. The same pattern can also let you bind variables to some or all of those parts in the process.</p><div class="header-wrapper"><h3 id="matching">Matching</h3><a class="heading-link" href="#matching" aria-label="Link to 'Matching' section">#</a></div><p>A pattern always tests against a value to determine if the value has the form you expect. In other words, you are checking if the value <em>matches</em> the pattern.</p><p>What constitutes a match depends on <a href="/language/pattern-types">what kind of pattern</a> you are using. For example, a constant pattern matches if the value is equal to the pattern's constant:</p> <?code-excerpt "language/lib/patterns/switch.dart (constant-pattern)"?> <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">switch</span><span style="color:#222222"> (number) {</span></span> <span class="line"><span style="color:#6E6E70"> // Constant pattern matches if 1 == number.</span></span> <span class="line"><span style="color:#D43324"> case</span><span style="color:#11796D"> 1</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">'one'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p>Many patterns make use of subpatterns, sometimes called <em>outer</em> and <em>inner</em> patterns, respectively. Patterns match recursively on their subpatterns. For example, the individual fields of any <a href="/language/collections">collection-type</a> pattern could be <a href="/language/pattern-types#variable">variable patterns</a> or <a href="/language/pattern-types#constant">constant patterns</a>:</p> <?code-excerpt "language/lib/patterns/switch.dart (list-pattern)"?> <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"> a = </span><span style="color:#11796D">'a'</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#D43324">const</span><span style="color:#222222"> b = </span><span style="color:#11796D">'b'</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#D43324">switch</span><span style="color:#222222"> (obj) {</span></span> <span class="line"><span style="color:#6E6E70"> // List pattern [a, b] matches obj first if obj is a list with two fields,</span></span> <span class="line"><span style="color:#6E6E70"> // then if its fields match the constant subpatterns 'a' and 'b'.</span></span> <span class="line"><span style="color:#D43324"> case</span><span style="color:#222222"> [a, b]:</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(</span><span style="color:#11796D">'</span><span style="color:#11796D">$</span><span style="color:#222222">a</span><span style="color:#11796D">, </span><span style="color:#11796D">$</span><span style="color:#222222">b</span><span style="color:#11796D">'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p>To ignore parts of a matched value, you can use a <a href="/language/pattern-types#wildcard">wildcard pattern</a> as a placeholder. In the case of list patterns, you can use a <a href="/language/pattern-types#rest-element">rest element</a>.</p><div class="header-wrapper"><h3 id="destructuring">Destructuring</h3><a class="heading-link" href="#destructuring" aria-label="Link to 'Destructuring' section">#</a></div><p>When an object and pattern match, the pattern can then access the object's data and extract it in parts. In other words, the pattern <em>destructures</em> the object:</p> <?code-excerpt "language/lib/patterns/destructuring.dart (list-pattern)"?> <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"> numList = [</span><span style="color:#11796D">1</span><span style="color:#222222">, </span><span style="color:#11796D">2</span><span style="color:#222222">, </span><span style="color:#11796D">3</span><span style="color:#222222">];</span></span> <span class="line"><span style="color:#6E6E70">// List pattern [a, b, c] destructures the three elements from numList...</span></span> <span class="line"><span style="color:#D43324">var</span><span style="color:#222222"> [a, b, c] = numList;</span></span> <span class="line"><span style="color:#6E6E70">// ...and assigns them to new variables.</span></span> <span class="line"><span style="color:#6200EE">print</span><span style="color:#222222">(a + b + c);</span></span></code></pre></div></div><p>You can nest <a href="/language/pattern-types">any kind of pattern</a> inside a destructuring pattern. For example, this case pattern matches and destructures a two-element list whose first element is <code>'a'</code> or <code>'b'</code>:</p> <?code-excerpt "language/lib/patterns/destructuring.dart (nested-pattern)"?> <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">switch</span><span style="color:#222222"> (list) {</span></span> <span class="line"><span style="color:#D43324"> case</span><span style="color:#222222"> [</span><span style="color:#11796D">'a'</span><span style="color:#222222"> || </span><span style="color:#11796D">'b'</span><span style="color:#222222">, </span><span style="color:#D43324">var</span><span style="color:#222222"> c]:</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(c);</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><div class="header-wrapper"><h2 id="places-patterns-can-appear">Places patterns can appear</h2><a class="heading-link" href="#places-patterns-can-appear" aria-label="Link to 'Places patterns can appear' section">#</a></div><p>You can use patterns in several places in the Dart language:</p><p><a id="pattern-uses"></a></p><ul><li>Local variable <a href="#variable-declaration">declarations</a> and <a href="#variable-assignment">assignments</a></li><li><a href="/language/loops#for-loops">for and for-in loops</a></li><li><a href="/language/branches#if-case">if-case</a> and <a href="/language/branches#switch-statements">switch-case</a></li><li>Control flow in <a href="/language/collections#control-flow-operators">collection literals</a></li></ul><p>This section describes common use cases for matching and destructuring with patterns.</p><div class="header-wrapper"><h3 id="variable-declaration">Variable declaration</h3><a class="heading-link" href="#variable-declaration" aria-label="Link to 'Variable declaration' section">#</a></div><p>You can use a <em>pattern variable declaration</em> anywhere Dart allows local variable declaration. The pattern matches against the value on the right of the declaration. Once matched, it destructures the value and binds it to new local variables:</p> <?code-excerpt "language/lib/patterns/destructuring.dart (variable-declaration)"?> <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">// Declares new variables a, b, and c.</span></span> <span class="line"><span style="color:#D43324">var</span><span style="color:#222222"> (a, [b, c]) = (</span><span style="color:#11796D">'str'</span><span style="color:#222222">, [</span><span style="color:#11796D">1</span><span style="color:#222222">, </span><span style="color:#11796D">2</span><span style="color:#222222">]);</span></span></code></pre></div></div><p>A pattern variable declaration must start with either <code>var</code> or <code>final</code>, followed by a pattern.</p><div class="header-wrapper"><h3 id="variable-assignment">Variable assignment</h3><a class="heading-link" href="#variable-assignment" aria-label="Link to 'Variable assignment' section">#</a></div><p>A <em>variable assignment pattern</em> falls on the left side of an assignment. First, it destructures the matched object. Then it assigns the values to <em>existing</em> variables, instead of binding new ones.</p><p>Use a variable assignment pattern to swap the values of two variables without declaring a third temporary one:</p> <?code-excerpt "language/lib/patterns/destructuring.dart (variable-assignment)"?> <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"> (a, b) = (</span><span style="color:#11796D">'left'</span><span style="color:#222222">, </span><span style="color:#11796D">'right'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222">(b, a) = (a, b); </span><span style="color:#6E6E70">// Swap.</span></span> <span class="line"><span style="color:#6200EE">print</span><span style="color:#222222">(</span><span style="color:#11796D">'</span><span style="color:#11796D">$</span><span style="color:#222222">a</span><span style="color:#11796D"> $</span><span style="color:#222222">b</span><span style="color:#11796D">'</span><span style="color:#222222">); </span><span style="color:#6E6E70">// Prints "right left".</span></span></code></pre></div></div><div class="header-wrapper"><h3 id="switch-statements-and-expressions">Switch statements and expressions</h3><a class="heading-link" href="#switch-statements-and-expressions" aria-label="Link to 'Switch statements and expressions' section">#</a></div><p>Every case clause contains a pattern. This applies to <a href="/language/branches#switch-statements">switch statements</a> and <a href="/language/branches#switch-expressions">expressions</a>, as well as <a href="/language/branches#if-case">if-case statements</a>. You can use <a href="/language/pattern-types">any kind of pattern</a> in a case.</p><p><em>Case patterns</em> are <a href="/resources/glossary#refutable-pattern">refutable</a>. They allow control flow to either:</p><ul><li>Match and destructure the object being switched on.</li><li>Continue execution if the object doesn't match.</li></ul><p>The values that a pattern destructures in a case become local variables. Their scope is only within the body of that case.</p> <?code-excerpt "language/lib/patterns/switch.dart (switch-statement)"?> <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">switch</span><span style="color:#222222"> (obj) {</span></span> <span class="line"><span style="color:#6E6E70"> // Matches if 1 == obj.</span></span> <span class="line"><span style="color:#D43324"> case</span><span style="color:#11796D"> 1</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">'one'</span><span style="color:#222222">);</span></span> <span class="line"></span> <span class="line"><span style="color:#6E6E70"> // Matches if the value of obj is between the</span></span> <span class="line"><span style="color:#6E6E70"> // constant values of 'first' and 'last'.</span></span> <span class="line"><span style="color:#D43324"> case</span><span style="color:#222222"> >= first && <= last:</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(</span><span style="color:#11796D">'in range'</span><span style="color:#222222">);</span></span> <span class="line"></span> <span class="line"><span style="color:#6E6E70"> // Matches if obj is a record with two fields,</span></span> <span class="line"><span style="color:#6E6E70"> // then assigns the fields to 'a' and 'b'.</span></span> <span class="line"><span style="color:#D43324"> case</span><span style="color:#222222"> (</span><span style="color:#D43324">var</span><span style="color:#222222"> a, </span><span style="color:#D43324">var</span><span style="color:#222222"> b):</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(</span><span style="color:#11796D">'a = </span><span style="color:#11796D">$</span><span style="color:#222222">a</span><span style="color:#11796D">, b = </span><span style="color:#11796D">$</span><span style="color:#222222">b</span><span style="color:#11796D">'</span><span style="color:#222222">);</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324"> default</span><span style="color:#222222">:</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p><a id="or-pattern-switch"></a></p><p><a href="/language/pattern-types#logical-or">Logical-or patterns</a> are useful for having multiple cases share a body in switch expressions or statements:</p> <?code-excerpt "language/lib/patterns/switch.dart (or-share-body)"?> <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"> isPrimary = </span><span style="color:#D43324">switch</span><span style="color:#222222"> (color) {</span></span> <span class="line"><span style="color:#0468D7"> Color</span><span style="color:#222222">.red || </span><span style="color:#0468D7">Color</span><span style="color:#222222">.yellow || </span><span style="color:#0468D7">Color</span><span style="color:#222222">.blue => </span><span style="color:#11796D">true</span><span style="color:#222222">,</span></span> <span class="line"><span style="color:#222222"> _ => </span><span style="color:#11796D">false</span><span style="color:#222222">,</span></span> <span class="line"><span style="color:#222222">};</span></span></code></pre></div></div><p>Switch statements can have multiple cases share a body <a href="/language/branches#switch-share">without using logical-or patterns</a>, but they are still uniquely useful for allowing multiple cases to share a <a href="/language/branches#guard-clause">guard</a>:</p> <?code-excerpt "language/lib/patterns/switch.dart (or-share-guard)"?> <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">switch</span><span style="color:#222222"> (shape) {</span></span> <span class="line"><span style="color:#D43324"> case</span><span style="color:#0468D7"> Square</span><span style="color:#222222">(size: </span><span style="color:#D43324">var</span><span style="color:#222222"> s) || </span><span style="color:#0468D7">Circle</span><span style="color:#222222">(size: </span><span style="color:#D43324">var</span><span style="color:#222222"> s) </span><span style="color:#D43324">when</span><span style="color:#222222"> s > </span><span style="color:#11796D">0</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">'Non-empty symmetric shape'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p><a href="/language/branches#guard-clause">Guard clauses</a> evaluate an arbitrary condition as part of a case, without exiting the switch if the condition is false (like using an <code>if</code> statement in the case body would cause).</p> <?code-excerpt "language/lib/control_flow/branches.dart (guard)"?> <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">switch</span><span style="color:#222222"> (pair) {</span></span> <span class="line"><span style="color:#D43324"> case</span><span style="color:#222222"> (</span><span style="color:#0468D7">int</span><span style="color:#222222"> a, </span><span style="color:#0468D7">int</span><span style="color:#222222"> b):</span></span> <span class="line"><span style="color:#D43324"> if</span><span style="color:#222222"> (a > b) </span><span style="color:#6200EE">print</span><span style="color:#222222">(</span><span style="color:#11796D">'First element greater'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#6E6E70"> // If false, prints nothing and exits the switch.</span></span> <span class="line"><span style="color:#D43324"> case</span><span style="color:#222222"> (</span><span style="color:#0468D7">int</span><span style="color:#222222"> a, </span><span style="color:#0468D7">int</span><span style="color:#222222"> b) </span><span style="color:#D43324">when</span><span style="color:#222222"> a > b:</span></span> <span class="line"><span style="color:#6E6E70"> // If false, prints nothing but proceeds to next case.</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(</span><span style="color:#11796D">'First element greater'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#D43324"> case</span><span style="color:#222222"> (</span><span style="color:#0468D7">int</span><span style="color:#222222"> a, </span><span style="color:#0468D7">int</span><span style="color:#222222"> b):</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(</span><span style="color:#11796D">'First element not greater'</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="for-and-for-in-loops">For and for-in loops</h3><a class="heading-link" href="#for-and-for-in-loops" aria-label="Link to 'For and for-in loops' section">#</a></div><p>You can use patterns in <a href="/language/loops#for-loops">for and for-in loops</a> to iterate-over and destructure values in a collection.</p><p>This example uses <a href="/language/pattern-types#object">object destructuring</a> in a for-in loop to destructure the <a href="https://api.dart.dev/dart-core/MapEntry-class.html"><code>MapEntry</code></a> objects that a <code><Map>.entries</code> call returns:</p> <?code-excerpt "language/lib/patterns/for_in.dart (for-in-pattern)"?> <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">Map</span><span style="color:#222222"><</span><span style="color:#0468D7">String</span><span style="color:#222222">, </span><span style="color:#0468D7">int</span><span style="color:#222222">> hist = {</span><span style="color:#11796D">'a'</span><span style="color:#222222">: </span><span style="color:#11796D">23</span><span style="color:#222222">, </span><span style="color:#11796D">'b'</span><span style="color:#222222">: </span><span style="color:#11796D">100</span><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">var</span><span style="color:#0468D7"> MapEntry</span><span style="color:#222222">(key: key, value: count) </span><span style="color:#D43324">in</span><span style="color:#222222"> hist.entries) {</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(</span><span style="color:#11796D">'</span><span style="color:#11796D">$</span><span style="color:#222222">key</span><span style="color:#11796D"> occurred </span><span style="color:#11796D">$</span><span style="color:#222222">count</span><span style="color:#11796D"> times'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p>The object pattern checks that <code>hist.entries</code> has the named type <code>MapEntry</code>, and then recurses into the named field subpatterns <code>key</code> and <code>value</code>. It calls the <code>key</code> getter and <code>value</code> getter on the <code>MapEntry</code> in each iteration, and binds the results to local variables <code>key</code> and <code>count</code>, respectively.</p><p>Binding the result of a getter call to a variable of the same name is a common use case, so object patterns can also infer the getter name from the <a href="/language/pattern-types#variable">variable subpattern</a>. This allows you to simplify the variable pattern from something redundant like <code>key: key</code> to just <code>:key</code>:</p> <?code-excerpt "language/lib/patterns/for_in.dart (for-in-short)"?> <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">for</span><span style="color:#222222"> (</span><span style="color:#D43324">var</span><span style="color:#0468D7"> MapEntry</span><span style="color:#222222">(:key, value: count) </span><span style="color:#D43324">in</span><span style="color:#222222"> hist.entries) {</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(</span><span style="color:#11796D">'</span><span style="color:#11796D">$</span><span style="color:#222222">key</span><span style="color:#11796D"> occurred </span><span style="color:#11796D">$</span><span style="color:#222222">count</span><span style="color:#11796D"> times'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><div class="header-wrapper"><h2 id="use-cases-for-patterns">Use cases for patterns</h2><a class="heading-link" href="#use-cases-for-patterns" aria-label="Link to 'Use cases for patterns' section">#</a></div><p>The <a href="#places-patterns-can-appear">previous section</a> describes <em>how</em> patterns fit into other Dart code constructs. You saw some interesting use cases as examples, like <a href="#variable-assignment">swapping</a> the values of two variables, or <a href="#for-and-for-in-loops">destructuring key-value pairs</a> in a map. This section describes even more use cases, answering:</p><ul><li><em>When and why</em> you might want to use patterns.</li><li>What kinds of problems they solve.</li><li>Which idioms they best suit.</li></ul><div class="header-wrapper"><h3 id="destructuring-multiple-returns">Destructuring multiple returns</h3><a class="heading-link" href="#destructuring-multiple-returns" aria-label="Link to 'Destructuring multiple returns' section">#</a></div><p>Records allow aggregating and <a href="/language/records#multiple-returns">returning multiple values</a> from a single function call. Patterns add the ability to destructure a record's fields directly into local variables, inline with the function call.</p><p>Instead of individually declaring new local variables for each record field, like this:</p> <?code-excerpt "language/lib/patterns/destructuring.dart (destructure-multiple-returns-1)"?> <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"> info = </span><span style="color:#6200EE">userInfo</span><span style="color:#222222">(json);</span></span> <span class="line"><span style="color:#D43324">var</span><span style="color:#222222"> name = info.$1;</span></span> <span class="line"><span style="color:#D43324">var</span><span style="color:#222222"> age = info.$2;</span></span></code></pre></div></div><p>You can destructure the fields of a record that a function returns into local variables using a <a href="#variable-declaration">variable declaration</a> or <a href="#variable-assignment">assigment pattern</a>, and a <a href="/language/pattern-types#record">record pattern</a> as its subpattern:</p> <?code-excerpt "language/lib/patterns/destructuring.dart (destructure-multiple-returns-2)"?> <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, age) = </span><span style="color:#6200EE">userInfo</span><span style="color:#222222">(json);</span></span></code></pre></div></div><p>To destructure a record with named fields using a pattern:</p> <?code-excerpt "language/lib/patterns/destructuring.dart (destructure-multiple-returns-3)"?> <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"> (:name, :age) =</span></span> <span class="line"><span style="color:#6200EE"> getData</span><span style="color:#222222">(); </span><span style="color:#6E6E70">// For example, return (name: 'doug', age: 25);</span></span></code></pre></div></div><div class="header-wrapper"><h3 id="destructuring-class-instances">Destructuring class instances</h3><a class="heading-link" href="#destructuring-class-instances" aria-label="Link to 'Destructuring class instances' section">#</a></div><p><a href="/language/pattern-types#object">Object patterns</a> match against named object types, allowing you to destructure their data using the getters the object's class already exposes.</p><p>To destructure an instance of a class, use the named type, followed by the properties to destructure enclosed in parentheses:</p> <?code-excerpt "language/lib/patterns/destructuring.dart (destructure-class-instances)"?> <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:#0468D7"> Foo</span><span style="color:#222222"> myFoo = </span><span style="color:#0468D7">Foo</span><span style="color:#222222">(one: </span><span style="color:#11796D">'one'</span><span style="color:#222222">, two: </span><span style="color:#11796D">2</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#D43324">var</span><span style="color:#0468D7"> Foo</span><span style="color:#222222">(:one, :two) = myFoo;</span></span> <span class="line"><span style="color:#6200EE">print</span><span style="color:#222222">(</span><span style="color:#11796D">'one </span><span style="color:#11796D">$</span><span style="color:#222222">one</span><span style="color:#11796D">, two </span><span style="color:#11796D">$</span><span style="color:#222222">two</span><span style="color:#11796D">'</span><span style="color:#222222">);</span></span></code></pre></div></div><div class="header-wrapper"><h3 id="algebraic-data-types">Algebraic data types</h3><a class="heading-link" href="#algebraic-data-types" aria-label="Link to 'Algebraic data types' section">#</a></div><p>Object destructuring and switch cases are conducive to writing code in an <a href="https://en.wikipedia.org/wiki/Algebraic_data_type">algebraic data type</a> style. Use this method when:</p><ul><li>You have a family of related types.</li><li>You have an operation that needs specific behavior for each type.</li><li>You want to group that behavior in one place instead of spreading it across all the different type definitions.</li></ul><p>Instead of implementing the operation as an instance method for every type, keep the operation's variations in a single function that switches over the subtypes:</p> <?code-excerpt "language/lib/patterns/algebraic_datatypes.dart (algebraic-datatypes)"?> <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">sealed</span><span style="color:#D43324"> class</span><span style="color:#0468D7"> Shape</span><span style="color:#222222"> {}</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324">class</span><span style="color:#0468D7"> Square</span><span style="color:#D43324"> implements</span><span style="color:#0468D7"> Shape</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#D43324"> final</span><span style="color:#0468D7"> double</span><span style="color:#222222"> length;</span></span> <span class="line"><span style="color:#0468D7"> Square</span><span style="color:#222222">(</span><span style="color:#D43324">this</span><span style="color:#222222">.length);</span></span> <span class="line"><span style="color:#222222">}</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324">class</span><span style="color:#0468D7"> Circle</span><span style="color:#D43324"> implements</span><span style="color:#0468D7"> Shape</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#D43324"> final</span><span style="color:#0468D7"> double</span><span style="color:#222222"> radius;</span></span> <span class="line"><span style="color:#0468D7"> Circle</span><span style="color:#222222">(</span><span style="color:#D43324">this</span><span style="color:#222222">.radius);</span></span> <span class="line"><span style="color:#222222">}</span></span> <span class="line"></span> <span class="line"><span style="color:#0468D7">double</span><span style="color:#6200EE"> calculateArea</span><span style="color:#222222">(</span><span style="color:#0468D7">Shape</span><span style="color:#222222"> shape) => </span><span style="color:#D43324">switch</span><span style="color:#222222"> (shape) {</span></span> <span class="line"><span style="color:#0468D7"> Square</span><span style="color:#222222">(length: </span><span style="color:#D43324">var</span><span style="color:#222222"> l) => l * l,</span></span> <span class="line"><span style="color:#0468D7"> Circle</span><span style="color:#222222">(radius: </span><span style="color:#D43324">var</span><span style="color:#222222"> r) => math.pi * r * r,</span></span> <span class="line"><span style="color:#222222">};</span></span></code></pre></div></div><div class="header-wrapper"><h3 id="validating-incoming-json">Validating incoming JSON</h3><a class="heading-link" href="#validating-incoming-json" aria-label="Link to 'Validating incoming JSON' section">#</a></div><p><a href="/language/pattern-types#map">Map</a> and <a href="/language/pattern-types#list">list</a> patterns work well for destructuring key-value pairs in JSON data:</p> <?code-excerpt "language/lib/patterns/json.dart (json-1)"?> <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"> json = {</span></span> <span class="line"><span style="color:#11796D"> 'user'</span><span style="color:#222222">: [</span><span style="color:#11796D">'Lily'</span><span style="color:#222222">, </span><span style="color:#11796D">13</span><span style="color:#222222">],</span></span> <span class="line"><span style="color:#222222">};</span></span> <span class="line"><span style="color:#D43324">var</span><span style="color:#222222"> {</span><span style="color:#11796D">'user'</span><span style="color:#222222">: [name, age]} = json;</span></span></code></pre></div></div><p>If you know that the JSON data has the structure you expect, the previous example is realistic. But data typically comes from an external source, like over the network. You need to validate it first to confirm its structure.</p><p>Without patterns, validation is verbose:</p> <?code-excerpt "language/lib/patterns/json.dart (json-2)"?> <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"> (json is </span><span style="color:#0468D7">Map</span><span style="color:#222222"><</span><span style="color:#0468D7">String</span><span style="color:#222222">, </span><span style="color:#0468D7">Object</span><span style="color:#222222">?> &&</span></span> <span class="line"><span style="color:#222222"> json.length == </span><span style="color:#11796D">1</span><span style="color:#222222"> &&</span></span> <span class="line"><span style="color:#222222"> json.</span><span style="color:#6200EE">containsKey</span><span style="color:#222222">(</span><span style="color:#11796D">'user'</span><span style="color:#222222">)) {</span></span> <span class="line"><span style="color:#D43324"> var</span><span style="color:#222222"> user = json[</span><span style="color:#11796D">'user'</span><span style="color:#222222">];</span></span> <span class="line"><span style="color:#D43324"> if</span><span style="color:#222222"> (user is </span><span style="color:#0468D7">List</span><span style="color:#222222"><</span><span style="color:#0468D7">Object</span><span style="color:#222222">> &&</span></span> <span class="line"><span style="color:#222222"> user.length == </span><span style="color:#11796D">2</span><span style="color:#222222"> &&</span></span> <span class="line"><span style="color:#222222"> user[</span><span style="color:#11796D">0</span><span style="color:#222222">] is </span><span style="color:#0468D7">String</span><span style="color:#222222"> &&</span></span> <span class="line"><span style="color:#222222"> user[</span><span style="color:#11796D">1</span><span style="color:#222222">] is </span><span style="color:#0468D7">int</span><span style="color:#222222">) {</span></span> <span class="line"><span style="color:#D43324"> var</span><span style="color:#222222"> name = user[</span><span style="color:#11796D">0</span><span style="color:#222222">] </span><span style="color:#D43324">as</span><span style="color:#0468D7"> String</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#D43324"> var</span><span style="color:#222222"> age = user[</span><span style="color:#11796D">1</span><span style="color:#222222">] </span><span style="color:#D43324">as</span><span style="color:#0468D7"> int</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">'User </span><span style="color:#11796D">$</span><span style="color:#222222">name</span><span style="color:#11796D"> is </span><span style="color:#11796D">$</span><span style="color:#222222">age</span><span style="color:#11796D"> years old.'</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 single <a href="#switch-statements-and-expressions">case pattern</a> can achieve the same validation. Single cases work best as <a href="/language/branches#if-case">if-case</a> statements. Patterns provide a more declarative, and much less verbose method of validating JSON:</p> <?code-excerpt "language/lib/patterns/json.dart (json-3)"?> <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"> (json </span><span style="color:#D43324">case</span><span style="color:#222222"> {</span><span style="color:#11796D">'user'</span><span style="color:#222222">: [</span><span style="color:#0468D7">String</span><span style="color:#222222"> name, </span><span style="color:#0468D7">int</span><span style="color:#222222"> age]}) {</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(</span><span style="color:#11796D">'User </span><span style="color:#11796D">$</span><span style="color:#222222">name</span><span style="color:#11796D"> is </span><span style="color:#11796D">$</span><span style="color:#222222">age</span><span style="color:#11796D"> years old.'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p>This case pattern simultaneously validates that:</p><ul><li><code>json</code> is a map, because it must first match the outer <a href="/language/pattern-types#map">map pattern</a> to proceed.<ul><li>And, since it's a map, it also confirms <code>json</code> is not null.</li></ul></li><li><code>json</code> contains a key <code>user</code>.</li><li>The key <code>user</code> pairs with a list of two values.</li><li>The types of the list values are <code>String</code> and <code>int</code>.</li><li>The new local variables to hold the values are <code>name</code> and <code>age</code>.</li></ul><nav id="subnav"><ul><li class="previous"><a href="/language/type-system">⟨ Type system</a></li><li class="next"><a href="/language/pattern-types">Pattern types ⟩</a></li></ul></nav><p id="page-github-links"><span>Unless stated otherwise, the documentation on this site reflects Dart 3.7.0. Page last updated on 2025-02-12.</span> <a href="https://github.com/dart-lang/site-www/tree/main/src/content/language/patterns.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/patterns/&page-source=https://github.com/dart-lang/site-www/tree/main/src/content/language/patterns.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>