CINXE.COM

Records | 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 the record data structure in Dart."><title>Records | 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="Records"><meta name="twitter:description" content="Summary of the record data structure in Dart."><meta property="og:title" content="Records"><meta property="og:description" content="Summary of the record data structure in Dart."><meta property="og:url" content="/language/records/"><meta property="og:image" content="/assets/img/logo/dart-logo-for-shares.png?2" eleventy:ignore><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Google+Sans:wght@400;500;700&display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css2?family=Google+Sans+Display:wght@400&display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css2?family=Google+Sans+Mono:wght@400;500;700&display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css2?family=Google+Sans+Text:wght@400;500;700&display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0..1,0" rel="stylesheet"><link rel="stylesheet" href="/assets/css/main.css?v=3"><script src="/assets/js/os-tabs.js?v=3"></script><script src="/assets/js/main.js?v=3"></script><script>!function(e,a,t,n,c,o,s){e.GoogleAnalyticsObject=c,e[c]=e[c]||function(){(e[c].q=e[c].q||[]).push(arguments)},e[c].l=1*new Date,o=a.createElement(t),s=a.getElementsByTagName(t)[0],o.async=1,o.src="//www.google-analytics.com/analytics.js",s.parentNode.insertBefore(o,s)}(window,document,"script",0,"ga"),ga("create","UA-26406144-4","auto"),ga("send","pageview")</script></head><body class="default.html"><a id="skip-to-main" class="filled-button" href="#site-content-title" tabindex="1">Skip to main content</a><section id="cookie-notice"><div class="container"><p>dart.dev uses cookies from Google to deliver and enhance the quality of its services and to analyze traffic.</p><div class="button-group"><a class="text-button" href="https://policies.google.com/technologies/cookies" target="_blank" rel="noopener">Learn more</a> <button id="cookie-consent" class="filled-button">OK, got it</button></div></div></section><noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5VSZM5J" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript><div id="site-banner" role="alert"><p>Announcing Dart 3.7! Find out about updates to the language, analyzer, pub.dev, and more, in the <a href="https://medium.com/dartlang/announcing-dart-3-7-bf864a1b195c" target="_blank">blog post</a>.</p></div><header id="site-header"><nav id="mainnav"><div id="menu-toggle"><span class="material-symbols" title="Toggle side navigation menu." aria-label="Toggle side navigation menu." type="button">menu</span></div><a href="/" class="brand" title="Dart"><img src="/assets/img/logo/logo-white-text.svg" alt="Dart"></a><ul class="navbar"><li><a href="/overview" class="nav-link">Overview</a></li><li class="mainnav__get-started"><a href="/docs" class="nav-link active"><span>Docs</span></a></li><li><a href="/community" class="nav-link">Community</a></li><li><a href="/#try-dart" class="nav-link">Try Dart</a></li><li><a href="/get-dart" class="nav-link">Get Dart</a></li><li class="searchfield"><form action="/search" class="site-header-search form-inline" id="cse-search-box"><input type="hidden" name="cx" value="011220921317074318178:_yy-tmb5t_i"> <input type="hidden" name="ie" value="UTF-8"> <input type="hidden" name="hl" value="en"> <input class="site-header-searchfield form-control search-field" type="search" name="q" id="search-main" autocomplete="off" placeholder="Search" aria-label="Search"></form></li></ul></nav></header><div id="site-below-header"><div id="site-main-row"><div id="sidenav"><form action="/search/" class="site-header-search form-inline"><input class="site-header-searchfield form-control search-field" type="search" name="q" id="search-side" autocomplete="off" placeholder="Search" aria-label="Search"></form><ul class="navbar-nav"><li aria-hidden="true"><div class="sidenav-divider"></div></li><li class="nav-item"><a href="/overview" class="nav-link">Overview</a></li><li class="nav-item"><a href="/community" class="nav-link">Community</a></li><li class="nav-item"><a href="https://dartpad.dev" class="nav-link">Try Dart</a></li><li class="nav-item"><a href="/get-dart" class="nav-link">Get Dart</a></li><li class="nav-item"><a href="/docs" class="nav-link">Docs</a></li><li aria-hidden="true"><div class="sidenav-divider"></div></li></ul><ul class="nav"><li class="nav-item"><button class="nav-link 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 active collapsible" data-toggle="collapse" data-target="#-sidenav-1-3" role="button" aria-expanded="true" aria-controls="-sidenav-1-3"><span>Types</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse show" 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 active" href="/language/records"><div><span>Records</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/collections"><div><span>Collections</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/generics"><div><span>Generics</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/typedefs"><div><span>Typedefs</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/type-system"><div><span>Type system</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-4" role="button" aria-expanded="false" aria-controls="-sidenav-1-4"><span>Patterns</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-4"><li class="nav-item"><a class="nav-link" href="/language/patterns"><div><span>Overview & usage</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/pattern-types"><div><span>Pattern types</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://codelabs.developers.google.com/codelabs/dart-patterns-records" target="_blank" rel="noopener"><div><span>Applied tutorial</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li></ul></li><li class="nav-item"><a class="nav-link" href="/language/functions"><div><span>Functions</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-6" role="button" aria-expanded="false" aria-controls="-sidenav-1-6"><span>Control flow</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-6"><li class="nav-item"><a class="nav-link" href="/language/loops"><div><span>Loops</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/branches"><div><span>Branches</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/error-handling"><div><span>Error handling</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-7" role="button" aria-expanded="false" aria-controls="-sidenav-1-7"><span>Classes & objects</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-7"><li class="nav-item"><a class="nav-link" href="/language/classes"><div><span>Classes</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/constructors"><div><span>Constructors</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/methods"><div><span>Methods</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/extend"><div><span>Extend a class</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/mixins"><div><span>Mixins</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/enums"><div><span>Enums</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/extension-methods"><div><span>Extension methods</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/extension-types"><div><span>Extension types</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/callable-objects"><div><span>Callable objects</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-8" role="button" aria-expanded="false" aria-controls="-sidenav-1-8"><span>Class modifiers</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-8"><li class="nav-item"><a class="nav-link" href="/language/class-modifiers"><div><span>Overview & usage</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/class-modifiers-for-apis"><div><span>Class modifiers for API maintainers</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/modifier-reference"><div><span>Reference</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-9" role="button" aria-expanded="false" aria-controls="-sidenav-1-9"><span>Concurrency</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-9"><li class="nav-item"><a class="nav-link" href="/language/concurrency"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/async"><div><span>Asynchronous support</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/isolates"><div><span>Isolates</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-10" role="button" aria-expanded="false" aria-controls="-sidenav-1-10"><span>Null safety</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-10"><li class="nav-item"><a class="nav-link" href="/null-safety"><div><span>Sound null safety</span></div></a></li><li class="nav-item"><a class="nav-link" href="/null-safety/migration-guide"><div><span>Migrating to null safety</span></div></a></li><li class="nav-item"><a class="nav-link" href="/null-safety/understanding-null-safety"><div><span>Understanding null safety</span></div></a></li><li class="nav-item"><a class="nav-link" href="/null-safety/unsound-null-safety"><div><span>Unsound null safety</span></div></a></li><li class="nav-item"><a class="nav-link" href="/null-safety/faq"><div><span>FAQ</span></div></a></li></ul></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#-sidenav-2" role="button" aria-expanded="false" aria-controls="-sidenav-2"><span>Core libraries</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-2"><li class="nav-item"><a class="nav-link" href="/libraries"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/libraries/dart-core"><div><span>dart:core</span></div></a></li><li class="nav-item"><a class="nav-link" href="/libraries/dart-async"><div><span>dart:async</span></div></a></li><li class="nav-item"><a class="nav-link" href="/libraries/dart-math"><div><span>dart:math</span></div></a></li><li class="nav-item"><a class="nav-link" href="/libraries/dart-convert"><div><span>dart:convert</span></div></a></li><li class="nav-item"><a class="nav-link" href="/libraries/dart-io"><div><span>dart:io</span></div></a></li><li class="nav-item"><a class="nav-link" href="/interop/js-interop"><div><span>dart:js_interop</span></div></a></li><div class="sidenav-divider"></div><li class="nav-item"><a class="nav-link" href="/libraries/collections/iterables"><div><span>Iterable collections</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-2-10" role="button" aria-expanded="false" aria-controls="-sidenav-2-10"><span>Asynchronous programming</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-2-10"><li class="nav-item"><a class="nav-link" href="/libraries/async/async-await"><div><span>Tutorial</span></div></a></li><li class="nav-item"><a class="nav-link" href="/libraries/async/futures-error-handling"><div><span>Futures and error handling</span></div></a></li><li class="nav-item"><a class="nav-link" href="/libraries/async/using-streams"><div><span>Using streams</span></div></a></li><li class="nav-item"><a class="nav-link" href="/libraries/async/creating-streams"><div><span>Creating streams</span></div></a></li></ul></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#-sidenav-3" role="button" aria-expanded="false" aria-controls="-sidenav-3"><span>Effective Dart</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-3"><li class="nav-item"><a class="nav-link" href="/effective-dart"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/effective-dart/style"><div><span>Style</span></div></a></li><li class="nav-item"><a class="nav-link" href="/effective-dart/documentation"><div><span>Documentation</span></div></a></li><li class="nav-item"><a class="nav-link" href="/effective-dart/usage"><div><span>Usage</span></div></a></li><li class="nav-item"><a class="nav-link" href="/effective-dart/design"><div><span>Design</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#-sidenav-4" role="button" aria-expanded="false" aria-controls="-sidenav-4"><span>Packages</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-4"><li class="nav-item"><a class="nav-link" href="/tools/pub/packages"><div><span>How to use packages</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/useful-packages"><div><span>Commonly used packages</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/create-packages"><div><span>Creating packages</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/publishing"><div><span>Publishing packages</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/writing-package-pages"><div><span>Writing package pages</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/workspaces"><div><span>Workspaces (monorepo support)</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-4-7" role="button" aria-expanded="false" aria-controls="-sidenav-4-7"><span>Package reference</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-4-7"><li class="nav-item"><a class="nav-link" href="/tools/pub/dependencies"><div><span>Dependencies</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/glossary"><div><span>Glossary</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/package-layout"><div><span>Package layout conventions</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/environment-variables"><div><span>Pub environment variables</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/pubspec"><div><span>Pubspec file</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/troubleshoot"><div><span>Troubleshooting pub</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/verified-publishers"><div><span>Verified publishers</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/security-advisories"><div><span>Security advisories</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/versioning"><div><span>Versioning</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/custom-package-repositories"><div><span>Custom package repositories</span></div></a></li></ul></li><li class="nav-item"><a class="nav-link" href="/tools/pub/private-files"><div><span>What not to commit</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#-sidenav-5" role="button" aria-expanded="false" aria-controls="-sidenav-5"><span>Development</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-5"><li class="nav-item"><a class="nav-link" href="/libraries/serialization/json"><div><span>JSON serialization</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/language/number-representation"><div><span>Number representation</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/google-apis"><div><span>Google APIs</span></div></a></li><li class="nav-item"><a class="nav-link" href="/multiplatform-apps"><div><span>Multi-platform apps</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-5-5" role="button" aria-expanded="false" aria-controls="-sidenav-5-5"><span>Command-line & server apps</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-5-5"><li class="nav-item"><a class="nav-link" href="/server"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tutorials/server/get-started"><div><span>Get started</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tutorials/server/cmdline"><div><span>Write command-line apps</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tutorials/server/fetch-data"><div><span>Fetch data from the internet</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tutorials/server/httpserver"><div><span>Write HTTP servers</span></div></a></li><li class="nav-item"><a class="nav-link" href="/server/libraries"><div><span>Libraries & packages</span></div></a></li><li class="nav-item"><a class="nav-link" href="/server/google-cloud"><div><span>Google Cloud</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-5-6" role="button" aria-expanded="false" aria-controls="-sidenav-5-6"><span>Web apps</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-5-6"><li class="nav-item"><a class="nav-link" href="/web"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/web/get-started"><div><span>Get started</span></div></a></li><li class="nav-item"><a class="nav-link" href="/web/deployment"><div><span>Deployment</span></div></a></li><li class="nav-item"><a class="nav-link" href="/web/libraries"><div><span>Libraries & packages</span></div></a></li><li class="nav-item"><a class="nav-link" href="/web/wasm"><div><span>Wasm compilation</span></div></a></li></ul></li><li class="nav-item"><a class="nav-link" href="/libraries/core/environment-declarations"><div><span>Environment declarations</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#-sidenav-6" role="button" aria-expanded="false" aria-controls="-sidenav-6"><span>Interoperability</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-6"><li class="nav-item"><a class="nav-link" href="/interop/c-interop"><div><span>C interop</span></div></a></li><li class="nav-item"><a class="nav-link" href="/interop/objective-c-interop"><div><span>Objective-C & Swift interop</span></div></a></li><li class="nav-item"><a class="nav-link" href="/interop/java-interop"><div><span>Java & Kotlin interop</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-6-4" role="button" aria-expanded="false" aria-controls="-sidenav-6-4"><span>JavaScript interop</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-6-4"><li class="nav-item"><a class="nav-link" href="/interop/js-interop"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/interop/js-interop/usage"><div><span>Usage</span></div></a></li><li class="nav-item"><a class="nav-link" href="/interop/js-interop/js-types"><div><span>JS types</span></div></a></li><li class="nav-item"><a class="nav-link" href="/interop/js-interop/tutorials"><div><span>Tutorials</span></div></a></li><li class="nav-item"><a class="nav-link" href="/interop/js-interop/past-js-interop"><div><span>Past JS interop</span></div></a></li><div class="sidenav-divider"></div><li class="nav-item"><a class="nav-link" href="/interop/js-interop/package-web"><div><span>Web interop</span></div></a></li></ul></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#-sidenav-7" role="button" aria-expanded="false" aria-controls="-sidenav-7"><span>Tools & techniques</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-7"><li class="nav-item"><a class="nav-link" href="/tools"><div><span>Overview</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-7-2" role="button" aria-expanded="false" aria-controls="-sidenav-7-2"><span>Editors & debuggers</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-7-2"><li class="nav-item"><a class="nav-link" href="/tools/jetbrains-plugin"><div><span>IntelliJ & Android Studio</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/vs-code"><div><span>VS Code</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dart-devtools"><div><span>Dart DevTools</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-7-2-4" role="button" aria-expanded="false" aria-controls="-sidenav-7-2-4"><span>DartPad</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-7-2-4"><li class="nav-item"><a class="nav-link" href="/tools/dartpad"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dartpad/troubleshoot"><div><span>Troubleshooting DartPad</span></div></a></li></ul></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-7-3" role="button" aria-expanded="false" aria-controls="-sidenav-7-3"><span>Command-line tools</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-7-3"><li class="nav-item"><button class="nav-link collapsible" data-toggle="collapse" data-target="#-sidenav-7-3-1" role="button" aria-expanded="true" aria-controls="-sidenav-7-3-1"><span>Dart SDK</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse show" id="-sidenav-7-3-1"><li class="nav-item"><a class="nav-link" href="/tools/sdk"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dart-tool"><div><span>dart</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dart-analyze"><div><span>dart analyze</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dart-compile"><div><span>dart compile</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dart-create"><div><span>dart create</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dart-doc"><div><span>dart doc</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dart-fix"><div><span>dart fix</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dart-format"><div><span>dart format</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dart-info"><div><span>dart info</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/cmd"><div><span>dart pub</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dart-run"><div><span>dart run</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dart-test"><div><span>dart test</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dartaotruntime"><div><span>dartaotruntime</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/experiment-flags"><div><span>Experiment flags</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible" data-toggle="collapse" data-target="#-sidenav-7-3-2" role="button" aria-expanded="true" aria-controls="-sidenav-7-3-2"><span>Other command-line tools</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse show" id="-sidenav-7-3-2"><li class="nav-item"><a class="nav-link" href="/tools/build_runner"><div><span>build_runner</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/webdev"><div><span>webdev</span></div></a></li></ul></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-7-4" role="button" aria-expanded="false" aria-controls="-sidenav-7-4"><span>Static analysis</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-7-4"><li class="nav-item"><a class="nav-link" href="/tools/analysis"><div><span>Customizing static analysis</span></div></a></li><li class="nav-item"><a class="nav-link" href="/deprecated/sound-problems"><div><span>Fixing common type problems</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/non-promotion-reasons"><div><span>Fixing type promotion failures</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/linter-rules"><div><span>Linter rules</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/diagnostic-messages"><div><span>Diagnostic messages</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-7-5" role="button" aria-expanded="false" aria-controls="-sidenav-7-5"><span>Testing & optimization</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-7-5"><li class="nav-item"><a class="nav-link" href="/tools/testing"><div><span>Testing</span></div></a></li><li class="nav-item"><a class="nav-link" href="/web/debugging"><div><span>Debugging web apps</span></div></a></li></ul></li></ul></li><li aria-hidden="true"><div class="sidenav-divider"></div></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#-sidenav-9" role="button" aria-expanded="false" aria-controls="-sidenav-9"><span>Resources</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-9"><li class="nav-item"><a class="nav-link" href="/resources/dart-cheatsheet"><div><span>Language cheatsheet</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/breaking-changes"><div><span>Breaking changes</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/language/evolution"><div><span>Language evolution</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/language/spec"><div><span>Language specification</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/dart-3-migration"><div><span>Dart 3 migration guide</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-9-6" role="button" aria-expanded="false" aria-controls="-sidenav-9-6"><span>Coming from ...</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-9-6"><li class="nav-item"><a class="nav-link" href="/resources/coming-from/js-to-dart"><div><span>JavaScript to Dart</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/coming-from/swift-to-dart"><div><span>Swift to Dart</span></div></a></li></ul></li><div class="sidenav-divider"></div><li class="nav-item"><a class="nav-link" href="/resources/faq"><div><span>FAQ</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/glossary"><div><span>Glossary</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/books"><div><span>Books</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/videos"><div><span>Videos</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tutorials"><div><span>Tutorials</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible" data-toggle="collapse" data-target="#-sidenav-10" role="button" aria-expanded="true" aria-controls="-sidenav-10"><span>Related sites</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse show" id="-sidenav-10"><li class="nav-item"><a class="nav-link" href="https://api.dart.dev" target="_blank" rel="noopener"><div><span>API reference</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://medium.com/dartlang" target="_blank" rel="noopener"><div><span>Blog</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://dartpad.dev" target="_blank" rel="noopener"><div><span>DartPad (online editor)</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://flutter.dev" target="_blank" rel="noopener"><div><span>Flutter</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://pub.dev" target="_blank" rel="noopener"><div><span>Package site</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li></ul></li></ul></div><main id="page-content"><div id="site-toc--side" class="site-toc"><header class="site-toc__title">Contents</header><ul class="section-nav"><li class="toc-entry nav-item"><a class="nav-link" href="#record-syntax">Record syntax</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#record-fields">Record fields</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#record-types">Record types</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#record-equality">Record equality</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#multiple-returns">Multiple returns</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#records-as-simple-data-structures">Records as simple data structures</a><ul class="nav"><li class="toc-entry nav-item"><a class="nav-link" href="#records-and-typedefs">Records and typedefs</a></li></ul></li></ul></div><article><div class="content"><div id="site-content-title"><h1>Records</h1></div><div id="site-toc--inline" class="site-toc"><header class="site-toc__title">Contents</header><ul class="section-nav"><li class="toc-entry"><a href="#record-syntax">Record syntax</a></li><li class="toc-entry"><a href="#record-fields">Record fields</a></li><li class="toc-entry"><a href="#record-types">Record types</a></li><li class="toc-entry"><a href="#record-equality">Record equality</a></li><li class="toc-entry"><a href="#multiple-returns">Multiple returns</a></li><li class="toc-entry"><a href="#records-as-simple-data-structures">Records as simple data structures</a><ul><li class="toc-entry"><a href="#records-and-typedefs">Records and typedefs</a></li></ul></li></ul></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>Records require a <a href="/resources/language/evolution#language-versioning">language version</a> of at least 3.0.</p></div></aside><p>Records are an anonymous, immutable, aggregate type. Like other <a href="/language/collections">collection types</a>, they let you bundle multiple objects into a single object. Unlike other collection types, records are fixed-sized, heterogeneous, and typed.</p><p>Records are real values; you can store them in variables, nest them, pass them to and from functions, and store them in data structures such as lists, maps, and sets.</p><div class="header-wrapper"><h2 id="record-syntax">Record syntax</h2><a class="heading-link" href="#record-syntax" aria-label="Link to 'Record syntax' section">#</a></div><p><em>Records expressions</em> are comma-delimited lists of named or positional fields, enclosed in parentheses:</p> <?code-excerpt "language/test/records_test.dart (record-syntax)"?> <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"> record = (</span><span style="color:#11796D">'first'</span><span style="color:#222222">, a: </span><span style="color:#11796D">2</span><span style="color:#222222">, b: </span><span style="color:#11796D">true</span><span style="color:#222222">, </span><span style="color:#11796D">'last'</span><span style="color:#222222">);</span></span></code></pre></div></div><p><em>Record type annotations</em> are comma-delimited lists of types enclosed in parentheses. You can use record type annotations to define return types and parameter types. For example, the following <code>(int, int)</code> statements are record type annotations:</p> <?code-excerpt "language/test/records_test.dart (record-type-annotation)"?> <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">(</span><span style="color:#0468D7">int</span><span style="color:#222222">, </span><span style="color:#0468D7">int</span><span style="color:#222222">) </span><span style="color:#6200EE">swap</span><span style="color:#222222">((</span><span style="color:#0468D7">int</span><span style="color:#222222">, </span><span style="color:#0468D7">int</span><span style="color:#222222">) record) {</span></span> <span class="line"><span style="color:#D43324"> var</span><span style="color:#222222"> (a, b) = record;</span></span> <span class="line"><span style="color:#D43324"> return</span><span style="color:#222222"> (b, a);</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p>Fields in record expressions and type annotations mirror how <a href="/language/functions#parameters">parameters and arguments</a> work in functions. Positional fields go directly inside the parentheses:</p> <?code-excerpt "language/test/records_test.dart (record-type-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">// Record type annotation in a variable declaration:</span></span> <span class="line"><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">) record;</span></span> <span class="line"></span> <span class="line"><span style="color:#6E6E70">// Initialize it with a record expression:</span></span> <span class="line"><span style="color:#222222">record = (</span><span style="color:#11796D">'A string'</span><span style="color:#222222">, </span><span style="color:#11796D">123</span><span style="color:#222222">);</span></span></code></pre></div></div><p>In a record type annotation, named fields go inside a curly brace-delimited section of type-and-name pairs, after all positional fields. In a record expression, the names go before each field value with a colon after:</p> <?code-excerpt "language/test/records_test.dart (record-type-named-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">// Record type annotation in a variable declaration:</span></span> <span class="line"><span style="color:#222222">({</span><span style="color:#0468D7">int</span><span style="color:#222222"> a, </span><span style="color:#0468D7">bool</span><span style="color:#222222"> b}) record;</span></span> <span class="line"></span> <span class="line"><span style="color:#6E6E70">// Initialize it with a record expression:</span></span> <span class="line"><span style="color:#222222">record = (a: </span><span style="color:#11796D">123</span><span style="color:#222222">, b: </span><span style="color:#11796D">true</span><span style="color:#222222">);</span></span></code></pre></div></div><p>The names of named fields in a record type are part of the <a href="#record-types">record's type definition</a>, or its <em>shape</em>. Two records with named fields with different names have different types:</p> <?code-excerpt "language/test/records_test.dart (record-type-mismatched-names)"?> <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">({</span><span style="color:#0468D7">int</span><span style="color:#222222"> a, </span><span style="color:#0468D7">int</span><span style="color:#222222"> b}) recordAB = (a: </span><span style="color:#11796D">1</span><span style="color:#222222">, b: </span><span style="color:#11796D">2</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222">({</span><span style="color:#0468D7">int</span><span style="color:#222222"> x, </span><span style="color:#0468D7">int</span><span style="color:#222222"> y}) recordXY = (x: </span><span style="color:#11796D">3</span><span style="color:#222222">, y: </span><span style="color:#11796D">4</span><span style="color:#222222">);</span></span> <span class="line"></span> <span class="line"><span style="color:#6E6E70">// Compile error! These records don't have the same type.</span></span> <span class="line"><span style="color:#6E6E70">// recordAB = recordXY;</span></span></code></pre></div></div><p>In a record type annotation, you can also name the <em>positional</em> fields, but these names are purely for documentation and don't affect the record's type:</p> <?code-excerpt "language/test/records_test.dart (record-type-matched-names)"?> <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">(</span><span style="color:#0468D7">int</span><span style="color:#222222"> a, </span><span style="color:#0468D7">int</span><span style="color:#222222"> b) recordAB = (</span><span style="color:#11796D">1</span><span style="color:#222222">, </span><span style="color:#11796D">2</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222">(</span><span style="color:#0468D7">int</span><span style="color:#222222"> x, </span><span style="color:#0468D7">int</span><span style="color:#222222"> y) recordXY = (</span><span style="color:#11796D">3</span><span style="color:#222222">, </span><span style="color:#11796D">4</span><span style="color:#222222">);</span></span> <span class="line"></span> <span class="line"><span style="color:#222222">recordAB = recordXY; </span><span style="color:#6E6E70">// OK.</span></span></code></pre></div></div><p>This is similar to how positional parameters in a <a href="/language/functions#function-types">function declaration or function typedef</a> can have names but those names don't affect the signature of the function.</p><p>For more information and examples, check out <a href="#record-types">Record types</a> and <a href="#record-equality">Record equality</a>.</p><div class="header-wrapper"><h2 id="record-fields">Record fields</h2><a class="heading-link" href="#record-fields" aria-label="Link to 'Record fields' section">#</a></div><p>Record fields are accessible through built-in getters. Records are immutable, so fields do not have setters.</p><p>Named fields expose getters of the same name. Positional fields expose getters of the name <code>$&lt;position&gt;</code>, skipping named fields:</p> <?code-excerpt "language/test/records_test.dart (record-getters)"?> <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"> record = (</span><span style="color:#11796D">'first'</span><span style="color:#222222">, a: </span><span style="color:#11796D">2</span><span style="color:#222222">, b: </span><span style="color:#11796D">true</span><span style="color:#222222">, </span><span style="color:#11796D">'last'</span><span style="color:#222222">);</span></span> <span class="line"></span> <span class="line"><span style="color:#6200EE">print</span><span style="color:#222222">(record.$1); </span><span style="color:#6E6E70">// Prints 'first'</span></span> <span class="line"><span style="color:#6200EE">print</span><span style="color:#222222">(record.a); </span><span style="color:#6E6E70">// Prints 2</span></span> <span class="line"><span style="color:#6200EE">print</span><span style="color:#222222">(record.b); </span><span style="color:#6E6E70">// Prints true</span></span> <span class="line"><span style="color:#6200EE">print</span><span style="color:#222222">(record.$2); </span><span style="color:#6E6E70">// Prints 'last'</span></span></code></pre></div></div><p>To streamline record field access even more, check out the page on <a href="/language/patterns#destructuring-multiple-returns">Patterns</a>.</p><div class="header-wrapper"><h2 id="record-types">Record types</h2><a class="heading-link" href="#record-types" aria-label="Link to 'Record types' section">#</a></div><p>There is no type declaration for individual record types. Records are structurally typed based on the types of their fields. A record's <em>shape</em> (the set of its fields, the fields' types, and their names, if any) uniquely determines the type of a record.</p><p>Each field in a record has its own type. Field types can differ within the same record. The type system is aware of each field's type wherever it is accessed from the record:</p> <?code-excerpt "language/test/records_test.dart (record-getters-two)"?> <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">(</span><span style="color:#0468D7">num</span><span style="color:#222222">, </span><span style="color:#0468D7">Object</span><span style="color:#222222">) pair = (</span><span style="color:#11796D">42</span><span style="color:#222222">, </span><span style="color:#11796D">'a'</span><span style="color:#222222">);</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324">var</span><span style="color:#222222"> first = pair.$1; </span><span style="color:#6E6E70">// Static type `num`, runtime type `int`.</span></span> <span class="line"><span style="color:#D43324">var</span><span style="color:#222222"> second = pair.$2; </span><span style="color:#6E6E70">// Static type `Object`, runtime type `String`.</span></span></code></pre></div></div><p>Consider two unrelated libraries that create records with the same set of fields. The type system understands that those records are the same type even though the libraries are not coupled to each other.</p><div class="header-wrapper"><h2 id="record-equality">Record equality</h2><a class="heading-link" href="#record-equality" aria-label="Link to 'Record equality' section">#</a></div><p>Two records are equal if they have the same <em>shape</em> (set of fields), and their corresponding fields have the same values. Since named field <em>order</em> is not part of a record's shape, the order of named fields does not affect equality.</p><p>For example:</p> <?code-excerpt "language/test/records_test.dart (record-shape)"?> <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">(</span><span style="color:#0468D7">int</span><span style="color:#222222"> x, </span><span style="color:#0468D7">int</span><span style="color:#222222"> y, </span><span style="color:#0468D7">int</span><span style="color:#222222"> z) point = (</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:#222222">(</span><span style="color:#0468D7">int</span><span style="color:#222222"> r, </span><span style="color:#0468D7">int</span><span style="color:#222222"> g, </span><span style="color:#0468D7">int</span><span style="color:#222222"> b) color = (</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> <span class="line"><span style="color:#6200EE">print</span><span style="color:#222222">(point == color); </span><span style="color:#6E6E70">// Prints 'true'.</span></span></code></pre></div></div><?code-excerpt "language/test/records_test.dart (record-shape-mismatch)"?> <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">({</span><span style="color:#0468D7">int</span><span style="color:#222222"> x, </span><span style="color:#0468D7">int</span><span style="color:#222222"> y, </span><span style="color:#0468D7">int</span><span style="color:#222222"> z}) point = (x: </span><span style="color:#11796D">1</span><span style="color:#222222">, y: </span><span style="color:#11796D">2</span><span style="color:#222222">, z: </span><span style="color:#11796D">3</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222">({</span><span style="color:#0468D7">int</span><span style="color:#222222"> r, </span><span style="color:#0468D7">int</span><span style="color:#222222"> g, </span><span style="color:#0468D7">int</span><span style="color:#222222"> b}) color = (r: </span><span style="color:#11796D">1</span><span style="color:#222222">, g: </span><span style="color:#11796D">2</span><span style="color:#222222">, b: </span><span style="color:#11796D">3</span><span style="color:#222222">);</span></span> <span class="line"></span> <span class="line"><span style="color:#6200EE">print</span><span style="color:#222222">(point == color); </span><span style="color:#6E6E70">// Prints 'false'. Lint: Equals on unrelated types.</span></span></code></pre></div></div><p>Records automatically define <code>hashCode</code> and <code>==</code> methods based on the structure of their fields.</p><div class="header-wrapper"><h2 id="multiple-returns">Multiple returns</h2><a class="heading-link" href="#multiple-returns" aria-label="Link to 'Multiple returns' section">#</a></div><p>Records allow functions to return multiple values bundled together. To retrieve record values from a return, <a href="/language/patterns#destructuring">destructure</a> the values into local variables using <a href="/language/patterns#destructuring-multiple-returns">pattern matching</a>.</p> <?code-excerpt "language/test/records_test.dart (record-multiple-returns)"?> <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">// Returns multiple values in a record:</span></span> <span class="line"><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 style="color:#6200EE">userInfo</span><span style="color:#222222">(</span><span style="color:#0468D7">Map</span><span style="color:#222222">&#x3C;</span><span style="color:#0468D7">String</span><span style="color:#222222">, </span><span style="color:#0468D7">dynamic</span><span style="color:#222222">> json) {</span></span> <span class="line"><span style="color:#D43324"> return</span><span style="color:#222222"> (json[</span><span style="color:#11796D">'name'</span><span style="color:#222222">] </span><span style="color:#D43324">as</span><span style="color:#0468D7"> String</span><span style="color:#222222">, json[</span><span style="color:#11796D">'age'</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:#222222">}</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324">final</span><span style="color:#222222"> json = &#x3C;</span><span style="color:#0468D7">String</span><span style="color:#222222">, </span><span style="color:#0468D7">dynamic</span><span style="color:#222222">>{</span><span style="color:#11796D">'name'</span><span style="color:#222222">: </span><span style="color:#11796D">'Dash'</span><span style="color:#222222">, </span><span style="color:#11796D">'age'</span><span style="color:#222222">: </span><span style="color:#11796D">10</span><span style="color:#222222">, </span><span style="color:#11796D">'color'</span><span style="color:#222222">: </span><span style="color:#11796D">'blue'</span><span style="color:#222222">};</span></span> <span class="line"></span> <span class="line"><span style="color:#6E6E70">// Destructures using a record pattern with positional fields:</span></span> <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> <span class="line"></span> <span class="line"><span style="color:#6E6E70">/* Equivalent to:</span></span> <span class="line"><span style="color:#6E6E70"> var info = userInfo(json);</span></span> <span class="line"><span style="color:#6E6E70"> var name = info.$1;</span></span> <span class="line"><span style="color:#6E6E70"> var age = info.$2;</span></span> <span class="line"><span style="color:#6E6E70">*/</span></span></code></pre></div></div><p>You can also destructure a record using its <a href="#record-fields">named fields</a>, using the colon <code>:</code> syntax, which you can read more about on the <a href="/language/pattern-types#record">Pattern types</a> page:</p> <?code-excerpt "language/test/records_test.dart (record-name-destructure)"?> <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">({</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 style="color:#6200EE">userInfo</span><span style="color:#222222">(</span><span style="color:#0468D7">Map</span><span style="color:#222222">&#x3C;</span><span style="color:#0468D7">String</span><span style="color:#222222">, </span><span style="color:#0468D7">dynamic</span><span style="color:#222222">> json)</span></span> <span class="line"><span style="color:#6E6E70">// 路路路</span></span> <span class="line"><span style="color:#6E6E70">// Destructures using a record pattern with named fields:</span></span> <span class="line"><span style="color:#D43324">final</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>You can return multiple values from a function without records, but other methods come with downsides. For example, creating a class is much more verbose, and using other collection types like <code>List</code> or <code>Map</code> loses type safety.</p><aside class="alert alert-info"><div class="alert-header"><span class="material-symbols" aria-hidden="true">info</span> <span>Note</span></div><div class="alert-content"><p>Records' multiple-return and heterogeneous-type characteristics enable parallelization of futures of different types, which you can read about in the <a href="/libraries/dart-async#handling-errors-for-multiple-futures"><code>dart:async</code> documentation</a>.</p></div></aside><div class="header-wrapper"><h2 id="records-as-simple-data-structures">Records as simple data structures</h2><a class="heading-link" href="#records-as-simple-data-structures" aria-label="Link to 'Records as simple data structures' section">#</a></div><p>Records only hold data. When that's all you need, they're immediately available and easy to use without needing to declare any new classes. For a simple list of data tuples that all have the same shape, a <em>list of records</em> is the most direct representation.</p><p>Take this list of &quot;button definitions&quot;, 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:#D43324">final</span><span style="color:#222222"> buttons = [</span></span> <span class="line"><span style="color:#222222"> (</span></span> <span class="line"><span style="color:#222222"> label: </span><span style="color:#11796D">"Button I"</span><span style="color:#222222">,</span></span> <span class="line"><span style="color:#222222"> icon: </span><span style="color:#D43324">const</span><span style="color:#0468D7"> Icon</span><span style="color:#222222">(</span><span style="color:#0468D7">Icons</span><span style="color:#222222">.upload_file),</span></span> <span class="line"><span style="color:#222222"> onPressed: () => </span><span style="color:#6200EE">print</span><span style="color:#222222">(</span><span style="color:#11796D">"Action -> Button I"</span><span style="color:#222222">),</span></span> <span class="line"><span style="color:#222222"> ),</span></span> <span class="line"><span style="color:#222222"> (</span></span> <span class="line"><span style="color:#222222"> label: </span><span style="color:#11796D">"Button II"</span><span style="color:#222222">,</span></span> <span class="line"><span style="color:#222222"> icon: </span><span style="color:#D43324">const</span><span style="color:#0468D7"> Icon</span><span style="color:#222222">(</span><span style="color:#0468D7">Icons</span><span style="color:#222222">.info),</span></span> <span class="line"><span style="color:#222222"> onPressed: () => </span><span style="color:#6200EE">print</span><span style="color:#222222">(</span><span style="color:#11796D">"Action -> Button II"</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>This code can be written directly without needing any additional declarations.</p><div class="header-wrapper"><h3 id="records-and-typedefs">Records and typedefs</h3><a class="heading-link" href="#records-and-typedefs" aria-label="Link to 'Records and typedefs' section">#</a></div><p>You can choose to use <a href="/language/typedefs">typedefs</a> to give the record type itself a name, and use that rather than writing out the full record type. This method allows you to state that some fields can be null (<code>?</code>), even if none of the current entries in the list have a null value.</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">typedef</span><span style="color:#0468D7"> ButtonItem</span><span style="color:#222222"> = ({</span><span style="color:#0468D7">String</span><span style="color:#222222"> label, </span><span style="color:#0468D7">Icon</span><span style="color:#222222"> icon, </span><span style="color:#D43324">void</span><span style="color:#0468D7"> Function</span><span style="color:#222222">()? onPressed});</span></span> <span class="line"><span style="color:#D43324">final</span><span style="color:#0468D7"> List</span><span style="color:#222222">&#x3C;</span><span style="color:#0468D7">ButtonItem</span><span style="color:#222222">> buttons = [</span></span> <span class="line"><span style="color:#6E6E70"> // ...</span></span> <span class="line"><span style="color:#222222">];</span></span></code></pre></div></div><p>Because record types are structural types, giving a name like <code>ButtonItem</code> only introduces an alias that makes it easier to refer to the structural type: <code>({String label, Icon icon, void Function()? onPressed})</code>.</p><p>Having all your code refer to a record type by its alias makes it easier to later change the record's implementation without needing to update every reference.</p><p>Code can work with the given button definitions the same way it would with simple class instances:</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"> List</span><span style="color:#222222">&#x3C;</span><span style="color:#0468D7">Container</span><span style="color:#222222">> widget = [</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"> button </span><span style="color:#D43324">in</span><span style="color:#222222"> buttons)</span></span> <span class="line"><span style="color:#0468D7"> Container</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#222222"> margin: </span><span style="color:#D43324">const</span><span style="color:#0468D7"> EdgeInsets</span><span style="color:#222222">.</span><span style="color:#6200EE">all</span><span style="color:#222222">(</span><span style="color:#11796D">4.0</span><span style="color:#222222">),</span></span> <span class="line"><span style="color:#222222"> child: </span><span style="color:#0468D7">OutlinedButton</span><span style="color:#222222">.</span><span style="color:#6200EE">icon</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#222222"> onPressed: button.onPressed,</span></span> <span class="line"><span style="color:#222222"> icon: button.icon,</span></span> <span class="line"><span style="color:#222222"> label: </span><span style="color:#0468D7">Text</span><span style="color:#222222">(button.label),</span></span> <span class="line"><span style="color:#222222"> ),</span></span> <span class="line"><span style="color:#222222"> ),</span></span> <span class="line"><span style="color:#222222"> ];</span></span></code></pre></div></div><p>You could even decide to later change the record type to a class type to add methods:</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"> ButtonItem</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#D43324"> final</span><span style="color:#0468D7"> String</span><span style="color:#222222"> label;</span></span> <span class="line"><span style="color:#D43324"> final</span><span style="color:#0468D7"> Icon</span><span style="color:#222222"> icon;</span></span> <span class="line"><span style="color:#D43324"> final</span><span style="color:#D43324"> void</span><span style="color:#0468D7"> Function</span><span style="color:#222222">()? onPressed;</span></span> <span class="line"><span style="color:#0468D7"> ButtonItem</span><span style="color:#222222">({</span><span style="color:#D43324">required</span><span style="color:#D43324"> this</span><span style="color:#222222">.label, </span><span style="color:#D43324">required</span><span style="color:#D43324"> this</span><span style="color:#222222">.icon, </span><span style="color:#D43324">this</span><span style="color:#222222">.onPressed});</span></span> <span class="line"><span style="color:#0468D7"> bool</span><span style="color:#D43324"> get</span><span style="color:#222222"> hasOnpressed => onPressed != </span><span style="color:#11796D">null</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p>Or to an <a href="/language/extension-types">extension type</a>:</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"> ButtonItem</span><span style="color:#222222">._(({</span><span style="color:#0468D7">String</span><span style="color:#222222"> label, </span><span style="color:#0468D7">Icon</span><span style="color:#222222"> icon, </span><span style="color:#D43324">void</span><span style="color:#0468D7"> Function</span><span style="color:#222222">()? onPressed}) _) {</span></span> <span class="line"><span style="color:#0468D7"> String</span><span style="color:#D43324"> get</span><span style="color:#222222"> label => _.label;</span></span> <span class="line"><span style="color:#0468D7"> Icon</span><span style="color:#D43324"> get</span><span style="color:#222222"> icon => _.icon;</span></span> <span class="line"><span style="color:#D43324"> void</span><span style="color:#0468D7"> Function</span><span style="color:#222222">()? </span><span style="color:#D43324">get</span><span style="color:#222222"> onPressed => _.onPressed;</span></span> <span class="line"><span style="color:#0468D7"> ButtonItem</span><span style="color:#222222">({</span><span style="color:#D43324">required</span><span style="color:#0468D7"> String</span><span style="color:#222222"> label, </span><span style="color:#D43324">required</span><span style="color:#0468D7"> Icon</span><span style="color:#222222"> icon, </span><span style="color:#D43324">void</span><span style="color:#0468D7"> Function</span><span style="color:#222222">()? onPressed})</span></span> <span class="line"><span style="color:#222222"> : </span><span style="color:#D43324">this</span><span style="color:#222222">._((label: label, icon: icon, onPressed: onPressed));</span></span> <span class="line"><span style="color:#0468D7"> bool</span><span style="color:#D43324"> get</span><span style="color:#222222"> hasOnpressed => _.onPressed != </span><span style="color:#11796D">null</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p>And then create the list of button definitions using that type's constructors:</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">final</span><span style="color:#0468D7"> List</span><span style="color:#222222">&#x3C;</span><span style="color:#0468D7">ButtonItem</span><span style="color:#222222">> buttons = [</span></span> <span class="line"><span style="color:#0468D7"> ButtonItem</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#222222"> label: </span><span style="color:#11796D">"Button I"</span><span style="color:#222222">,</span></span> <span class="line"><span style="color:#222222"> icon: </span><span style="color:#D43324">const</span><span style="color:#0468D7"> Icon</span><span style="color:#222222">(</span><span style="color:#0468D7">Icons</span><span style="color:#222222">.upload_file),</span></span> <span class="line"><span style="color:#222222"> onPressed: () => </span><span style="color:#6200EE">print</span><span style="color:#222222">(</span><span style="color:#11796D">"Action -> Button I"</span><span style="color:#222222">),</span></span> <span class="line"><span style="color:#222222"> ),</span></span> <span class="line"><span style="color:#0468D7"> ButtonItem</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#222222"> label: </span><span style="color:#11796D">"Button II"</span><span style="color:#222222">,</span></span> <span class="line"><span style="color:#222222"> icon: </span><span style="color:#D43324">const</span><span style="color:#0468D7"> Icon</span><span style="color:#222222">(</span><span style="color:#0468D7">Icons</span><span style="color:#222222">.info),</span></span> <span class="line"><span style="color:#222222"> onPressed: () => </span><span style="color:#6200EE">print</span><span style="color:#222222">(</span><span style="color:#11796D">"Action -> Button II"</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>Again, all while not needing to change the code that uses that list.</p><p>Changing any type does require the code using it to be very careful about not making assumptions. A type alias does not offer any protection or guarantee, for the code using it as a reference, that the value being aliased is a record. Extension types, also, offer little protection. Only a class can provide full abstraction and encapsulation.</p><nav id="prev-next"><ul><li class="previous"><a href="/language/built-in-types">&lang;&nbsp;&nbsp;Built-in types</a></li><li class="next"><a href="/language/collections">Collections&nbsp;&nbsp;&rang;</a></li></ul></nav><p id="page-github-links"><span>Unless stated otherwise, the documentation on this site reflects Dart 3.7.0. Page last updated on 2025-02-19.</span> <a href="https://github.com/dart-lang/site-www/tree/main/src/content/language/records.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/records/&page-source=https://github.com/dart-lang/site-www/tree/main/src/content/language/records.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