CINXE.COM

Effective Dart: Style | 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="Formatting and naming rules for consistent, readable code."><title>Effective Dart: Style | 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="Effective Dart: Style"><meta name="twitter:description" content="Formatting and naming rules for consistent, readable code."><meta property="og:title" content="Effective Dart: Style"><meta property="og:description" content="Formatting and naming rules for consistent, readable code."><meta property="og:url" content="/effective-dart/style/"><meta property="og:image" content="/assets/img/logo/dart-logo-for-shares.png?2" eleventy:ignore><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Google+Sans:wght@400;500;700&display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css2?family=Google+Sans+Display:wght@400&display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css2?family=Google+Sans+Mono:wght@400;500;700&display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css2?family=Google+Sans+Text:wght@400;500;700&display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0..1,0" rel="stylesheet"><link rel="stylesheet" href="/assets/css/main.css?v=3"><script src="/assets/js/os-tabs.js?v=3"></script><script src="/assets/js/main.js?v=3"></script><script>!function(e,a,t,n,c,o,s){e.GoogleAnalyticsObject=c,e[c]=e[c]||function(){(e[c].q=e[c].q||[]).push(arguments)},e[c].l=1*new Date,o=a.createElement(t),s=a.getElementsByTagName(t)[0],o.async=1,o.src="//www.google-analytics.com/analytics.js",s.parentNode.insertBefore(o,s)}(window,document,"script",0,"ga"),ga("create","UA-26406144-4","auto"),ga("send","pageview")</script></head><body class="default.html"><a id="skip-to-main" class="filled-button" href="#site-content-title" tabindex="1">Skip to main content</a><section id="cookie-notice"><div class="container"><p>dart.dev uses cookies from Google to deliver and enhance the quality of its services and to analyze traffic.</p><div class="button-group"><a class="text-button" href="https://policies.google.com/technologies/cookies" target="_blank" rel="noopener">Learn more</a> <button id="cookie-consent" class="filled-button">OK, got it</button></div></div></section><noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5VSZM5J" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript><div id="site-banner" role="alert"><p>Announcing Dart 3.7! Find out about updates to the language, analyzer, pub.dev, and more, in the <a href="https://medium.com/dartlang/announcing-dart-3-7-bf864a1b195c" target="_blank">blog post</a>.</p></div><header id="site-header"><nav id="mainnav"><div id="menu-toggle"><span class="material-symbols" title="Toggle side navigation menu." aria-label="Toggle side navigation menu." type="button">menu</span></div><a href="/" class="brand" title="Dart"><img src="/assets/img/logo/logo-white-text.svg" alt="Dart"></a><ul class="navbar"><li><a href="/overview" class="nav-link">Overview</a></li><li class="mainnav__get-started"><a href="/docs" class="nav-link active"><span>Docs</span></a></li><li><a href="/community" class="nav-link">Community</a></li><li><a href="/#try-dart" class="nav-link">Try Dart</a></li><li><a href="/get-dart" class="nav-link">Get Dart</a></li><li class="searchfield"><form action="/search" class="site-header-search form-inline" id="cse-search-box"><input type="hidden" name="cx" value="011220921317074318178:_yy-tmb5t_i"> <input type="hidden" name="ie" value="UTF-8"> <input type="hidden" name="hl" value="en"> <input class="site-header-searchfield form-control search-field" type="search" name="q" id="search-main" autocomplete="off" placeholder="Search" aria-label="Search"></form></li></ul></nav></header><div id="site-below-header"><div id="site-main-row"><div id="sidenav"><form action="/search/" class="site-header-search form-inline"><input class="site-header-searchfield form-control search-field" type="search" name="q" id="search-side" autocomplete="off" placeholder="Search" aria-label="Search"></form><ul class="navbar-nav"><li aria-hidden="true"><div class="sidenav-divider"></div></li><li class="nav-item"><a href="/overview" class="nav-link">Overview</a></li><li class="nav-item"><a href="/community" class="nav-link">Community</a></li><li class="nav-item"><a href="https://dartpad.dev" class="nav-link">Try Dart</a></li><li class="nav-item"><a href="/get-dart" class="nav-link">Get Dart</a></li><li class="nav-item"><a href="/docs" class="nav-link">Docs</a></li><li aria-hidden="true"><div class="sidenav-divider"></div></li></ul><ul class="nav"><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#-sidenav-1" role="button" aria-expanded="false" aria-controls="-sidenav-1"><span>Language</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1"><li class="nav-item"><a class="nav-link" href="/language"><div><span>Introduction</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-2" role="button" aria-expanded="false" aria-controls="-sidenav-1-2"><span>Syntax basics</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-2"><li class="nav-item"><a class="nav-link" href="/language/variables"><div><span>Variables</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/operators"><div><span>Operators</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/comments"><div><span>Comments</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/metadata"><div><span>Metadata</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/libraries"><div><span>Libraries & imports</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/keywords"><div><span>Keywords</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-3" role="button" aria-expanded="false" aria-controls="-sidenav-1-3"><span>Types</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-3"><li class="nav-item"><a class="nav-link" href="/language/built-in-types"><div><span>Built-in types</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/records"><div><span>Records</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/collections"><div><span>Collections</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/generics"><div><span>Generics</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/typedefs"><div><span>Typedefs</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/type-system"><div><span>Type system</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-4" role="button" aria-expanded="false" aria-controls="-sidenav-1-4"><span>Patterns</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-4"><li class="nav-item"><a class="nav-link" href="/language/patterns"><div><span>Overview & usage</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/pattern-types"><div><span>Pattern types</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://codelabs.developers.google.com/codelabs/dart-patterns-records" target="_blank" rel="noopener"><div><span>Applied tutorial</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li></ul></li><li class="nav-item"><a class="nav-link" href="/language/functions"><div><span>Functions</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-6" role="button" aria-expanded="false" aria-controls="-sidenav-1-6"><span>Control flow</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-6"><li class="nav-item"><a class="nav-link" href="/language/loops"><div><span>Loops</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/branches"><div><span>Branches</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/error-handling"><div><span>Error handling</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-7" role="button" aria-expanded="false" aria-controls="-sidenav-1-7"><span>Classes & objects</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-7"><li class="nav-item"><a class="nav-link" href="/language/classes"><div><span>Classes</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/constructors"><div><span>Constructors</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/methods"><div><span>Methods</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/extend"><div><span>Extend a class</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/mixins"><div><span>Mixins</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/enums"><div><span>Enums</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/extension-methods"><div><span>Extension methods</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/extension-types"><div><span>Extension types</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/callable-objects"><div><span>Callable objects</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-8" role="button" aria-expanded="false" aria-controls="-sidenav-1-8"><span>Class modifiers</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-8"><li class="nav-item"><a class="nav-link" href="/language/class-modifiers"><div><span>Overview & usage</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/class-modifiers-for-apis"><div><span>Class modifiers for API maintainers</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/modifier-reference"><div><span>Reference</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-9" role="button" aria-expanded="false" aria-controls="-sidenav-1-9"><span>Concurrency</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-9"><li class="nav-item"><a class="nav-link" href="/language/concurrency"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/async"><div><span>Asynchronous support</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/isolates"><div><span>Isolates</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-10" role="button" aria-expanded="false" aria-controls="-sidenav-1-10"><span>Null safety</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-10"><li class="nav-item"><a class="nav-link" href="/null-safety"><div><span>Sound null safety</span></div></a></li><li class="nav-item"><a class="nav-link" href="/null-safety/migration-guide"><div><span>Migrating to null safety</span></div></a></li><li class="nav-item"><a class="nav-link" href="/null-safety/understanding-null-safety"><div><span>Understanding null safety</span></div></a></li><li class="nav-item"><a class="nav-link" href="/null-safety/unsound-null-safety"><div><span>Unsound null safety</span></div></a></li><li class="nav-item"><a class="nav-link" href="/null-safety/faq"><div><span>FAQ</span></div></a></li></ul></li></ul></li><li class="nav-item"><button class="nav-link 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 active collapsible" data-toggle="collapse" data-target="#-sidenav-3" role="button" aria-expanded="true" aria-controls="-sidenav-3"><span>Effective Dart</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse show" 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 active" 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="#identifiers">Identifiers</a><ul class="nav"><li class="toc-entry nav-item"><a class="nav-link" href="#do-name-types-using-uppercamelcase">DO name types using UpperCamelCase</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#do-name-extensions-using-uppercamelcase">DO name extensions using UpperCamelCase</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#do-name-packages-and-file-system-entities-using-lowercase-with-underscores">DO name packages, directories, and source files using lowercase_<wbr>with_<wbr>underscores</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#do-name-import-prefixes-using-lowercase_with_underscores">DO name import prefixes using lowercase_<wbr>with_<wbr>underscores</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#do-name-other-identifiers-using-lowercamelcase">DO name other identifiers using lowerCamelCase</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#prefer-using-lowercamelcase-for-constant-names">PREFER using lowerCamelCase for constant names</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#do-capitalize-acronyms-and-abbreviations-longer-than-two-letters-like-words">DO capitalize acronyms and abbreviations longer than two letters like words</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#prefer-using-_-__-etc-for-unused-callback-parameters">PREFER using _<wbr>, _<wbr>_<wbr>, etc. for unused callback parameters</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#dont-use-a-leading-underscore-for-identifiers-that-arent-private">DON'T use a leading underscore for identifiers that aren't private</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#dont-use-prefix-letters">DON'T use prefix letters</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#dont-explicitly-name-libraries">DON'T explicitly name libraries</a></li></ul></li><li class="toc-entry nav-item"><a class="nav-link" href="#ordering">Ordering</a><ul class="nav"><li class="toc-entry nav-item"><a class="nav-link" href="#do-place-dart-imports-before-other-imports">DO place dart: imports before other imports</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#do-place-package-imports-before-relative-imports">DO place package: imports before relative imports</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#do-specify-exports-in-a-separate-section-after-all-imports">DO specify exports in a separate section after all imports</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#do-sort-sections-alphabetically">DO sort sections alphabetically</a></li></ul></li><li class="toc-entry nav-item"><a class="nav-link" href="#formatting">Formatting</a><ul class="nav"><li class="toc-entry nav-item"><a class="nav-link" href="#do-format-your-code-using-dart-format">DO format your code using dart format</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#consider-changing-your-code-to-make-it-more-formatter-friendly">CONSIDER changing your code to make it more formatter-friendly</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#prefer-lines-80-characters-or-fewer">PREFER lines 80 characters or fewer</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#do-use-curly-braces-for-all-flow-control-statements">DO use curly braces for all flow control statements</a></li></ul></li></ul></div><article><div class="content"><div id="site-content-title"><h1>Effective Dart: Style</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="#identifiers">Identifiers</a><ul><li class="toc-entry"><a href="#do-name-types-using-uppercamelcase">DO name types using UpperCamelCase</a></li><li class="toc-entry"><a href="#do-name-extensions-using-uppercamelcase">DO name extensions using UpperCamelCase</a></li><li class="toc-entry"><a href="#do-name-packages-and-file-system-entities-using-lowercase-with-underscores">DO name packages, directories, and source files using lowercase_with_underscores</a></li><li class="toc-entry"><a href="#do-name-import-prefixes-using-lowercase_with_underscores">DO name import prefixes using lowercase_with_underscores</a></li><li class="toc-entry"><a href="#do-name-other-identifiers-using-lowercamelcase">DO name other identifiers using lowerCamelCase</a></li><li class="toc-entry"><a href="#prefer-using-lowercamelcase-for-constant-names">PREFER using lowerCamelCase for constant names</a></li><li class="toc-entry"><a href="#do-capitalize-acronyms-and-abbreviations-longer-than-two-letters-like-words">DO capitalize acronyms and abbreviations longer than two letters like words</a></li><li class="toc-entry"><a href="#prefer-using-_-__-etc-for-unused-callback-parameters">PREFER using _, __, etc. for unused callback parameters</a></li><li class="toc-entry"><a href="#dont-use-a-leading-underscore-for-identifiers-that-arent-private">DON'T use a leading underscore for identifiers that aren't private</a></li><li class="toc-entry"><a href="#dont-use-prefix-letters">DON'T use prefix letters</a></li><li class="toc-entry"><a href="#dont-explicitly-name-libraries">DON'T explicitly name libraries</a></li></ul></li><li class="toc-entry"><a href="#ordering">Ordering</a><ul><li class="toc-entry"><a href="#do-place-dart-imports-before-other-imports">DO place dart: imports before other imports</a></li><li class="toc-entry"><a href="#do-place-package-imports-before-relative-imports">DO place package: imports before relative imports</a></li><li class="toc-entry"><a href="#do-specify-exports-in-a-separate-section-after-all-imports">DO specify exports in a separate section after all imports</a></li><li class="toc-entry"><a href="#do-sort-sections-alphabetically">DO sort sections alphabetically</a></li></ul></li><li class="toc-entry"><a href="#formatting">Formatting</a><ul><li class="toc-entry"><a href="#do-format-your-code-using-dart-format">DO format your code using dart format</a></li><li class="toc-entry"><a href="#consider-changing-your-code-to-make-it-more-formatter-friendly">CONSIDER changing your code to make it more formatter-friendly</a></li><li class="toc-entry"><a href="#prefer-lines-80-characters-or-fewer">PREFER lines 80 characters or fewer</a></li><li class="toc-entry"><a href="#do-use-curly-braces-for-all-flow-control-statements">DO use curly braces for all flow control statements</a></li></ul></li></ul><span class="site-toc--inline__toggle toc-toggle-more-items"><i class="material-symbols">more_horiz</i></span></div> <?code-excerpt plaster="none"?> <?code-excerpt path-base="misc/lib/effective_dart"?> <p>A surprisingly important part of good code is good style. Consistent naming, ordering, and formatting helps code that <em>is</em> the same <em>look</em> the same. It takes advantage of the powerful pattern-matching hardware most of us have in our ocular systems. If we use a consistent style across the entire Dart ecosystem, it makes it easier for all of us to learn from and contribute to each others' code.</p><div class="header-wrapper"><h2 id="identifiers">Identifiers</h2><a class="heading-link" href="#identifiers" aria-label="Link to 'Identifiers' section">#</a></div><p>Identifiers come in three flavors in Dart.</p><ul><li><p><code>UpperCamelCase</code> names capitalize the first letter of each word, including the first.</p></li><li><p><code>lowerCamelCase</code> names capitalize the first letter of each word, <em>except</em> the first which is always lowercase, even if it's an acronym.</p></li><li><p><code>lowercase_with_underscores</code> names use only lowercase letters, even for acronyms, and separate words with <code>_</code>.</p></li></ul><div class="header-wrapper"><h3 id="do-name-types-using-uppercamelcase">DO name types using <code>UpperCamelCase</code></h3><a class="heading-link" href="#do-name-types-using-uppercamelcase" aria-label="Link to 'DO name types using UpperCamelCase' section">#</a></div><p class="linter-rule">Linter rule: <a href="/tools/linter-rules/camel_case_types">camel_case_types</a></p><p>Classes, enum types, typedefs, and type parameters should capitalize the first letter of each word (including the first word), and use no separators.</p> <?code-excerpt "style_good.dart (type-names)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-good"><span class="code-block-tag">good</span><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"> SliderMenu</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#222222"> ...</span></span> <span class="line"><span style="color:#222222">}</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324">class</span><span style="color:#0468D7"> HttpRequest</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#222222"> ...</span></span> <span class="line"><span style="color:#222222">}</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324">typedef</span><span style="color:#0468D7"> Predicate</span><span style="color:#222222">&#x3C;</span><span style="color:#0468D7">T</span><span style="color:#222222">> = </span><span style="color:#0468D7">bool</span><span style="color:#0468D7"> Function</span><span style="color:#222222">(</span><span style="color:#0468D7">T</span><span style="color:#222222"> value);</span></span></code></pre></div></div><p>This even includes classes intended to be used in metadata annotations.</p> <?code-excerpt "style_good.dart (annotation-type-names)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-good"><span class="code-block-tag">good</span><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"> Foo</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#D43324"> const</span><span style="color:#0468D7"> Foo</span><span style="color:#222222">([</span><span style="color:#0468D7">Object</span><span style="color:#222222">? arg]);</span></span> <span class="line"><span style="color:#222222">}</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324">@Foo</span><span style="color:#222222">(anArg)</span></span> <span class="line"><span style="color:#D43324">class</span><span style="color:#0468D7"> A</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#222222"> ...</span></span> <span class="line"><span style="color:#222222">}</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324">@Foo</span><span style="color:#222222">()</span></span> <span class="line"><span style="color:#D43324">class</span><span style="color:#0468D7"> B</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#222222"> ...</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p>If the annotation class's constructor takes no parameters, you might want to create a separate <code>lowerCamelCase</code> constant for it.</p> <?code-excerpt "style_good.dart (annotation-const)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-good"><span class="code-block-tag">good</span><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"> foo = </span><span style="color:#0468D7">Foo</span><span style="color:#222222">();</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324">@foo</span></span> <span class="line"><span style="color:#D43324">class</span><span style="color:#0468D7"> C</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><div class="header-wrapper"><h3 id="do-name-extensions-using-uppercamelcase">DO name extensions using <code>UpperCamelCase</code></h3><a class="heading-link" href="#do-name-extensions-using-uppercamelcase" aria-label="Link to 'DO name extensions using UpperCamelCase' section">#</a></div><p class="linter-rule">Linter rule: <a href="/tools/linter-rules/camel_case_extensions">camel_case_extensions</a></p><p>Like types, <a href="/language/extension-methods">extensions</a> should capitalize the first letter of each word (including the first word), and use no separators.</p> <?code-excerpt "style_good.dart (extension-names)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-good"><span class="code-block-tag">good</span><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">extension</span><span style="color:#0468D7"> MyFancyList</span><span style="color:#222222">&#x3C;</span><span style="color:#0468D7">T</span><span style="color:#222222">> </span><span style="color:#D43324">on</span><span style="color:#0468D7"> List</span><span style="color:#222222">&#x3C;</span><span style="color:#0468D7">T</span><span style="color:#222222">> {</span></span> <span class="line"><span style="color:#222222"> ...</span></span> <span class="line"><span style="color:#222222">}</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324">extension</span><span style="color:#0468D7"> SmartIterable</span><span style="color:#222222">&#x3C;</span><span style="color:#0468D7">T</span><span style="color:#222222">> </span><span style="color:#D43324">on</span><span style="color:#0468D7"> Iterable</span><span style="color:#222222">&#x3C;</span><span style="color:#0468D7">T</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 id="do-name-libraries-and-source-files-using-lowercase_with_underscores"></a></p><div class="header-wrapper"><h3 id="do-name-packages-and-file-system-entities-using-lowercase-with-underscores">DO name packages, directories, and source files using <code>lowercase_with_underscores</code></h3><a class="heading-link" href="#do-name-packages-and-file-system-entities-using-lowercase-with-underscores" aria-label="Link to 'DO name packages, directories, and source files using lowercase_with_underscores' section">#</a></div><p class="linter-rule">Linter rules: <a href="/tools/linter-rules/file_names">file_names</a>, <a href="/tools/linter-rules/package_names">package_names</a></p><p>Some file systems are not case-sensitive, so many projects require filenames to be all lowercase. Using a separating character allows names to still be readable in that form. Using underscores as the separator ensures that the name is still a valid Dart identifier, which may be helpful if the language later supports symbolic imports.</p><div class="code-block-wrapper language-plaintext"><div class="code-block-body has-tag tag-good"><span class="code-block-tag">good</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span>my_package</span></span> <span class="line"><span>鈹斺攢 lib</span></span> <span class="line"><span> 鈹斺攢 file_system.dart</span></span> <span class="line"><span> 鈹斺攢 slider_menu.dart</span></span></code></pre></div></div><div class="code-block-wrapper language-plaintext"><div class="code-block-body has-tag tag-bad"><span class="code-block-tag">bad</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span>mypackage</span></span> <span class="line"><span>鈹斺攢 lib</span></span> <span class="line"><span> 鈹斺攢 file-system.dart</span></span> <span class="line"><span> 鈹斺攢 SliderMenu.dart</span></span></code></pre></div></div><div class="header-wrapper"><h3 id="do-name-import-prefixes-using-lowercase_with_underscores">DO name import prefixes using <code>lowercase_with_underscores</code></h3><a class="heading-link" href="#do-name-import-prefixes-using-lowercase_with_underscores" aria-label="Link to 'DO name import prefixes using lowercase_with_underscores' section">#</a></div><p class="linter-rule">Linter rule: <a href="/tools/linter-rules/library_prefixes">library_prefixes</a></p> <?code-excerpt "style_lib_good.dart (import-as)" replace="/(package):examples\/effective_dart\/foo.dart[^']*/$1:angular_components\/angular_components.dart/g; /(package):examples\/effective_dart\/bar.dart[^']*/$1:js\/js.dart/g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-good"><span class="code-block-tag">good</span><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">import</span><span style="color:#11796D"> 'dart:math'</span><span style="color:#D43324"> as</span><span style="color:#222222"> math;</span></span> <span class="line"><span style="color:#D43324">import</span><span style="color:#11796D"> 'package:angular_components/angular_components.dart'</span><span style="color:#D43324"> as</span><span style="color:#222222"> angular_components;</span></span> <span class="line"><span style="color:#D43324">import</span><span style="color:#11796D"> 'package:js/js.dart'</span><span style="color:#D43324"> as</span><span style="color:#222222"> js;</span></span></code></pre></div></div><?code-excerpt "style_lib_good.dart (import-as)" replace="/(package):examples\/effective_dart\/foo.dart[^']*/$1:angular_components\/angular_components.dart/g; /as angular_components/as angularComponents/g; /(package):examples\/effective_dart\/bar.dart[^']*/$1:js\/js.dart/g; / math/ Math/g;/as js/as JS/g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-bad"><span class="code-block-tag">bad</span><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">import</span><span style="color:#11796D"> 'dart:math'</span><span style="color:#D43324"> as</span><span style="color:#222222"> Math;</span></span> <span class="line"><span style="color:#D43324">import</span><span style="color:#11796D"> 'package:angular_components/angular_components.dart'</span><span style="color:#D43324"> as</span><span style="color:#222222"> angularComponents;</span></span> <span class="line"><span style="color:#D43324">import</span><span style="color:#11796D"> 'package:js/js.dart'</span><span style="color:#D43324"> as</span><span style="color:#222222"> JS;</span></span></code></pre></div></div><div class="header-wrapper"><h3 id="do-name-other-identifiers-using-lowercamelcase">DO name other identifiers using <code>lowerCamelCase</code></h3><a class="heading-link" href="#do-name-other-identifiers-using-lowercamelcase" aria-label="Link to 'DO name other identifiers using lowerCamelCase' section">#</a></div><p class="linter-rule">Linter rule: <a href="/tools/linter-rules/non_constant_identifier_names">non_constant_identifier_names</a></p><p>Class members, top-level definitions, variables, parameters, and named parameters should capitalize the first letter of each word <em>except</em> the first word, and use no separators.</p> <?code-excerpt "style_good.dart (misc-names)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-good"><span class="code-block-tag">good</span><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"> count = </span><span style="color:#11796D">3</span><span style="color:#222222">;</span></span> <span class="line"></span> <span class="line"><span style="color:#0468D7">HttpRequest</span><span style="color:#222222"> httpRequest;</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324">void</span><span style="color:#6200EE"> align</span><span style="color:#222222">(</span><span style="color:#0468D7">bool</span><span style="color:#222222"> clearItems) {</span></span> <span class="line"><span style="color:#6E6E70"> // ...</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><div class="header-wrapper"><h3 id="prefer-using-lowercamelcase-for-constant-names">PREFER using <code>lowerCamelCase</code> for constant names</h3><a class="heading-link" href="#prefer-using-lowercamelcase-for-constant-names" aria-label="Link to 'PREFER using lowerCamelCase for constant names' section">#</a></div><p class="linter-rule">Linter rule: <a href="/tools/linter-rules/constant_identifier_names">constant_identifier_names</a></p><p>In new code, use <code>lowerCamelCase</code> for constant variables, including enum values.</p> <?code-excerpt "style_good.dart (const-names)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-good"><span class="code-block-tag">good</span><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"> pi = </span><span style="color:#11796D">3.14</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#D43324">const</span><span style="color:#222222"> defaultTimeout = </span><span style="color:#11796D">1000</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#D43324">final</span><span style="color:#222222"> urlScheme = </span><span style="color:#0468D7">RegExp</span><span style="color:#222222">(</span><span style="color:#11796D">'^([a-z]+):'</span><span style="color:#222222">);</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324">class</span><span style="color:#0468D7"> Dice</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#D43324"> static</span><span style="color:#D43324"> final</span><span style="color:#222222"> numberGenerator = </span><span style="color:#0468D7">Random</span><span style="color:#222222">();</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><?code-excerpt "style_bad.dart (const-names)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-bad"><span class="code-block-tag">bad</span><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">const</span><span style="color:#0468D7"> PI</span><span style="color:#222222"> = </span><span style="color:#11796D">3.14</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#D43324">const</span><span style="color:#0468D7"> DefaultTimeout</span><span style="color:#222222"> = </span><span style="color:#11796D">1000</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#D43324">final</span><span style="color:#0468D7"> URL_SCHEME</span><span style="color:#222222"> = </span><span style="color:#0468D7">RegExp</span><span style="color:#222222">(</span><span style="color:#11796D">'^([a-z]+):'</span><span style="color:#222222">);</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324">class</span><span style="color:#0468D7"> Dice</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#D43324"> static</span><span style="color:#D43324"> final</span><span style="color:#0468D7"> NUMBER_GENERATOR</span><span style="color:#222222"> = </span><span style="color:#0468D7">Random</span><span style="color:#222222">();</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p>You may use <code>SCREAMING_CAPS</code> for consistency with existing code, as in the following cases:</p><ul><li>When adding code to a file or library that already uses <code>SCREAMING_CAPS</code>.</li><li>When generating Dart code that's parallel to Java code鈥攆or example, in enumerated types generated from <a href="https://pub.dev/packages/protobuf">protobufs.</a></li></ul><aside class="alert alert-info"><div class="alert-header"><span class="material-symbols" aria-hidden="true">info</span> <span>Note</span></div><div class="alert-content"><p>We initially used Java's <code>SCREAMING_CAPS</code> style for constants. We changed for a few reasons:</p><ul><li><code>SCREAMING_CAPS</code> looks bad for many cases, particularly enum values for things like CSS colors.</li><li>Constants are often changed to final non-const variables, which would necessitate a name change.</li><li>The <code>values</code> property defined on an enum type is const and lowercase.</li></ul></div></aside><div class="header-wrapper"><h3 id="do-capitalize-acronyms-and-abbreviations-longer-than-two-letters-like-words">DO capitalize acronyms and abbreviations longer than two letters like words</h3><a class="heading-link" href="#do-capitalize-acronyms-and-abbreviations-longer-than-two-letters-like-words" aria-label="Link to 'DO capitalize acronyms and abbreviations longer than two letters like words' section">#</a></div><p>Capitalized acronyms can be hard to read, and multiple adjacent acronyms can lead to ambiguous names. For example, given an identifier <code>HTTPSFTP</code>, the reader can't tell if it refers to <code>HTTPS</code> <code>FTP</code> or <code>HTTP</code> <code>SFTP</code>. To avoid this, capitalize most acronyms and abbreviations like regular words. This identifier would be <code>HttpsFtp</code> if referring to the former or <code>HttpSftp</code> for the latter.</p><p>Two-letter abbreviations and acronyms are the exception. If both letters are capitalized in English, then they should both stay capitalized when used in an identifier. Otherwise, capitalize it like a word.</p><div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-good"><span class="code-block-tag">good</span><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">// Longer than two letters, so always like a word:</span></span> <span class="line"><span style="color:#0468D7">Http</span><span style="color:#6E6E70"> // "hypertext transfer protocol"</span></span> <span class="line"><span style="color:#0468D7">Nasa</span><span style="color:#6E6E70"> // "national aeronautics and space administration"</span></span> <span class="line"><span style="color:#0468D7">Uri</span><span style="color:#6E6E70"> // "uniform resource identifier"</span></span> <span class="line"><span style="color:#0468D7">Esq</span><span style="color:#6E6E70"> // "esquire"</span></span> <span class="line"><span style="color:#0468D7">Ave</span><span style="color:#6E6E70"> // "avenue"</span></span> <span class="line"></span> <span class="line"><span style="color:#6E6E70">// Two letters, capitalized in English, so capitalized in an identifier:</span></span> <span class="line"><span style="color:#0468D7">ID</span><span style="color:#6E6E70"> // "identifier"</span></span> <span class="line"><span style="color:#0468D7">TV</span><span style="color:#6E6E70"> // "television"</span></span> <span class="line"><span style="color:#0468D7">UI</span><span style="color:#6E6E70"> // "user interface"</span></span> <span class="line"></span> <span class="line"><span style="color:#6E6E70">// Two letters, not capitalized in English, so like a word in an identifier:</span></span> <span class="line"><span style="color:#0468D7">Mr</span><span style="color:#6E6E70"> // "mister"</span></span> <span class="line"><span style="color:#0468D7">St</span><span style="color:#6E6E70"> // "street"</span></span> <span class="line"><span style="color:#0468D7">Rd</span><span style="color:#6E6E70"> // "road"</span></span></code></pre></div></div><div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-bad"><span class="code-block-tag">bad</span><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">HTTP</span><span style="color:#6E6E70"> // "hypertext transfer protocol"</span></span> <span class="line"><span style="color:#0468D7">NASA</span><span style="color:#6E6E70"> // "national aeronautics and space administration"</span></span> <span class="line"><span style="color:#0468D7">URI</span><span style="color:#6E6E70"> // "uniform resource identifier"</span></span> <span class="line"><span style="color:#222222">esq </span><span style="color:#6E6E70">// "esquire"</span></span> <span class="line"><span style="color:#0468D7">Ave</span><span style="color:#6E6E70"> // "avenue"</span></span> <span class="line"></span> <span class="line"><span style="color:#0468D7">Id</span><span style="color:#6E6E70"> // "identifier"</span></span> <span class="line"><span style="color:#0468D7">Tv</span><span style="color:#6E6E70"> // "television"</span></span> <span class="line"><span style="color:#0468D7">Ui</span><span style="color:#6E6E70"> // "user interface"</span></span> <span class="line"></span> <span class="line"><span style="color:#0468D7">MR</span><span style="color:#6E6E70"> // "mister"</span></span> <span class="line"><span style="color:#0468D7">ST</span><span style="color:#6E6E70"> // "street"</span></span> <span class="line"><span style="color:#0468D7">RD</span><span style="color:#6E6E70"> // "road"</span></span></code></pre></div></div><p>When any form of abbreviation comes at the beginning of a <code>lowerCamelCase</code> identifier, the abbreviation should be all lowercase:</p><div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">var</span><span style="color:#222222"> httpConnection = </span><span style="color:#6200EE">connect</span><span style="color:#222222">();</span></span> <span class="line"><span style="color:#D43324">var</span><span style="color:#222222"> tvSet = </span><span style="color:#0468D7">Television</span><span style="color:#222222">();</span></span> <span class="line"><span style="color:#D43324">var</span><span style="color:#222222"> mrRogers = </span><span style="color:#11796D">'hello, neighbor'</span><span style="color:#222222">;</span></span></code></pre></div></div><div class="header-wrapper"><h3 id="prefer-using-_-__-etc-for-unused-callback-parameters">PREFER using <code>_</code>, <code>__</code>, etc. for unused callback parameters</h3><a class="heading-link" href="#prefer-using-_-__-etc-for-unused-callback-parameters" aria-label="Link to 'PREFER using _, __, etc. for unused callback parameters' section">#</a></div><p>Sometimes the type signature of a callback function requires a parameter, but the callback implementation doesn't <em>use</em> the parameter. In this case, it's idiomatic to name the unused parameter <code>_</code>. If the function has multiple unused parameters, use additional underscores to avoid name collisions: <code>__</code>, <code>___</code>, etc.</p> <?code-excerpt "style_good.dart (unused-callback-params)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-good"><span class="code-block-tag">good</span><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">futureOfVoid.</span><span style="color:#6200EE">then</span><span style="color:#222222">((_) {</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(</span><span style="color:#11796D">'Operation complete.'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222">});</span></span></code></pre></div></div><p>This guideline is only for functions that are both <em>anonymous and local</em>. These functions are usually used immediately in a context where it's clear what the unused parameter represents. In contrast, top-level functions and method declarations don't have that context, so their parameters must be named so that it's clear what each parameter is for, even if it isn't used.</p><aside class="alert alert-info"><div class="alert-header"><span class="material-symbols" aria-hidden="true">merge_type</span> <span>Version note</span></div><div class="alert-content"><p>Since Dart 3.7, the <a href="/language/variables#wildcard-variables">wildcard variable <code>_</code></a> no longer creates a variable, so you can use <code>_</code> for multiple parameters simultaneously without name collision:</p><div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-good"><span class="code-block-tag">good</span><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> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(</span><span style="color:#11796D">'error'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div></div></aside><div class="header-wrapper"><h3 id="dont-use-a-leading-underscore-for-identifiers-that-arent-private">DON'T use a leading underscore for identifiers that aren't private</h3><a class="heading-link" href="#dont-use-a-leading-underscore-for-identifiers-that-arent-private" aria-label="Link to 'DON'T use a leading underscore for identifiers that aren't private' section">#</a></div><p>Dart uses a leading underscore in an identifier to mark members and top-level declarations as private. This trains users to associate a leading underscore with one of those kinds of declarations. They see &quot;_&quot; and think &quot;private&quot;.</p><p>There is no concept of &quot;private&quot; for local variables, parameters, local functions, or library prefixes. When one of those has a name that starts with an underscore, it sends a confusing signal to the reader. To avoid that, don't use leading underscores in those names.</p><div class="header-wrapper"><h3 id="dont-use-prefix-letters">DON'T use prefix letters</h3><a class="heading-link" href="#dont-use-prefix-letters" aria-label="Link to 'DON'T use prefix letters' section">#</a></div><p><a href="https://en.wikipedia.org/wiki/Hungarian_notation">Hungarian notation</a> and other schemes arose in the time of BCPL, when the compiler didn't do much to help you understand your code. Because Dart can tell you the type, scope, mutability, and other properties of your declarations, there's no reason to encode those properties in identifier names.</p><div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-good"><span class="code-block-tag">good</span><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">defaultTimeout</span></span></code></pre></div></div><div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-bad"><span class="code-block-tag">bad</span><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">kDefaultTimeout</span></span></code></pre></div></div><div class="header-wrapper"><h3 id="dont-explicitly-name-libraries">DON'T explicitly name libraries</h3><a class="heading-link" href="#dont-explicitly-name-libraries" aria-label="Link to 'DON'T explicitly name libraries' section">#</a></div><p>Appending a name to the <code>library</code> directive is technically possible, but is a legacy feature and discouraged.</p><p>Dart generates a unique tag for each library based on its path and filename. Naming libraries overrides this generated URI. Without the URI, it can be harder for tools to find the main library file in question.</p> <?code-excerpt "usage_bad.dart (library-dir)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-bad"><span class="code-block-tag">bad</span><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">library</span><span style="color:#222222"> my_library;</span></span></code></pre></div></div><?code-excerpt "docs_good.dart (library-doc)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-good"><span class="code-block-tag">good</span><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#6E6E70">/// A really great test library.</span></span> <span class="line"><span style="color:#D43324">@TestOn</span><span style="color:#222222">(</span><span style="color:#11796D">'browser'</span><span style="color:#222222">)</span></span> <span class="line"><span style="color:#D43324">library</span><span style="color:#222222">;</span></span></code></pre></div></div><div class="header-wrapper"><h2 id="ordering">Ordering</h2><a class="heading-link" href="#ordering" aria-label="Link to 'Ordering' section">#</a></div><p>To keep the preamble of your file tidy, we have a prescribed order that directives should appear in. Each &quot;section&quot; should be separated by a blank line.</p><p>A single linter rule handles all the ordering guidelines: <a href="/tools/linter-rules/directives_ordering">directives_ordering.</a></p><div class="header-wrapper"><h3 id="do-place-dart-imports-before-other-imports">DO place <code>dart:</code> imports before other imports</h3><a class="heading-link" href="#do-place-dart-imports-before-other-imports" aria-label="Link to 'DO place dart: imports before other imports' section">#</a></div><p class="linter-rule">Linter rule: <a href="/tools/linter-rules/directives_ordering">directives_ordering</a></p> <?code-excerpt "style_lib_good.dart (dart-import-first)" replace="/\w+\/effective_dart\///g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-good"><span class="code-block-tag">good</span><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">import</span><span style="color:#11796D"> 'dart:async'</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#D43324">import</span><span style="color:#11796D"> 'dart:collection'</span><span style="color:#222222">;</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324">import</span><span style="color:#11796D"> 'package:bar/bar.dart'</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#D43324">import</span><span style="color:#11796D"> 'package:foo/foo.dart'</span><span style="color:#222222">;</span></span></code></pre></div></div><div class="header-wrapper"><h3 id="do-place-package-imports-before-relative-imports">DO place <code>package:</code> imports before relative imports</h3><a class="heading-link" href="#do-place-package-imports-before-relative-imports" aria-label="Link to 'DO place package: imports before relative imports' section">#</a></div><p class="linter-rule">Linter rule: <a href="/tools/linter-rules/directives_ordering">directives_ordering</a></p> <?code-excerpt "style_lib_good.dart (pkg-import-before-local)" replace="/\w+\/effective_dart\///g;/'foo/'util/g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-good"><span class="code-block-tag">good</span><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">import</span><span style="color:#11796D"> 'package:bar/bar.dart'</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#D43324">import</span><span style="color:#11796D"> 'package:foo/foo.dart'</span><span style="color:#222222">;</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324">import</span><span style="color:#11796D"> 'util.dart'</span><span style="color:#222222">;</span></span></code></pre></div></div><div class="header-wrapper"><h3 id="do-specify-exports-in-a-separate-section-after-all-imports">DO specify exports in a separate section after all imports</h3><a class="heading-link" href="#do-specify-exports-in-a-separate-section-after-all-imports" aria-label="Link to 'DO specify exports in a separate section after all imports' section">#</a></div><p class="linter-rule">Linter rule: <a href="/tools/linter-rules/directives_ordering">directives_ordering</a></p> <?code-excerpt "style_lib_good.dart (export)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-good"><span class="code-block-tag">good</span><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">import</span><span style="color:#11796D"> 'src/error.dart'</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#D43324">import</span><span style="color:#11796D"> 'src/foo_bar.dart'</span><span style="color:#222222">;</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324">export</span><span style="color:#11796D"> 'src/error.dart'</span><span style="color:#222222">;</span></span></code></pre></div></div><?code-excerpt "style_lib_bad.dart (export)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-bad"><span class="code-block-tag">bad</span><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">import</span><span style="color:#11796D"> 'src/error.dart'</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#D43324">export</span><span style="color:#11796D"> 'src/error.dart'</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#D43324">import</span><span style="color:#11796D"> 'src/foo_bar.dart'</span><span style="color:#222222">;</span></span></code></pre></div></div><div class="header-wrapper"><h3 id="do-sort-sections-alphabetically">DO sort sections alphabetically</h3><a class="heading-link" href="#do-sort-sections-alphabetically" aria-label="Link to 'DO sort sections alphabetically' section">#</a></div><p class="linter-rule">Linter rule: <a href="/tools/linter-rules/directives_ordering">directives_ordering</a></p> <?code-excerpt "style_lib_good.dart (sorted)" replace="/\w+\/effective_dart\///g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-good"><span class="code-block-tag">good</span><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">import</span><span style="color:#11796D"> 'package:bar/bar.dart'</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#D43324">import</span><span style="color:#11796D"> 'package:foo/foo.dart'</span><span style="color:#222222">;</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324">import</span><span style="color:#11796D"> 'foo.dart'</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#D43324">import</span><span style="color:#11796D"> 'foo/foo.dart'</span><span style="color:#222222">;</span></span></code></pre></div></div><?code-excerpt "style_lib_bad.dart (sorted)" replace="/\w+\/effective_dart\///g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-bad"><span class="code-block-tag">bad</span><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">import</span><span style="color:#11796D"> 'package:foo/foo.dart'</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#D43324">import</span><span style="color:#11796D"> 'package:bar/bar.dart'</span><span style="color:#222222">;</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324">import</span><span style="color:#11796D"> 'foo/foo.dart'</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#D43324">import</span><span style="color:#11796D"> 'foo.dart'</span><span style="color:#222222">;</span></span></code></pre></div></div><div class="header-wrapper"><h2 id="formatting">Formatting</h2><a class="heading-link" href="#formatting" aria-label="Link to 'Formatting' section">#</a></div><p>Like many languages, Dart ignores whitespace. However, <em>humans</em> don't. Having a consistent whitespace style helps ensure that human readers see code the same way the compiler does.</p><div class="header-wrapper"><h3 id="do-format-your-code-using-dart-format">DO format your code using <code>dart format</code></h3><a class="heading-link" href="#do-format-your-code-using-dart-format" aria-label="Link to 'DO format your code using dart format' section">#</a></div><p>Formatting is tedious work and is particularly time-consuming during refactoring. Fortunately, you don't have to worry about it. We provide a sophisticated automated code formatter called <a href="/tools/dart-format"><code>dart format</code></a> that does it for you. The official whitespace-handling rules for Dart are <em>whatever <code>dart format</code> produces</em>. The <a href="https://github.com/dart-lang/dart_style/wiki/FAQ">formatter FAQ</a> can provide more insight into the style choices it enforces.</p><p>The remaining formatting guidelines are for the few things <code>dart format</code> cannot fix for you.</p><div class="header-wrapper"><h3 id="consider-changing-your-code-to-make-it-more-formatter-friendly">CONSIDER changing your code to make it more formatter-friendly</h3><a class="heading-link" href="#consider-changing-your-code-to-make-it-more-formatter-friendly" aria-label="Link to 'CONSIDER changing your code to make it more formatter-friendly' section">#</a></div><p>The formatter does the best it can with whatever code you throw at it, but it can't work miracles. If your code has particularly long identifiers, deeply nested expressions, a mixture of different kinds of operators, etc. the formatted output may still be hard to read.</p><p>When that happens, reorganize or simplify your code. Consider shortening a local variable name or hoisting out an expression into a new local variable. In other words, make the same kinds of modifications that you'd make if you were formatting the code by hand and trying to make it more readable. Think of <code>dart format</code> as a partnership where you work together, sometimes iteratively, to produce beautiful code.</p><p><a id="avoid-lines-longer-than-80-characters"></a></p><div class="header-wrapper"><h3 id="prefer-lines-80-characters-or-fewer">PREFER lines 80 characters or fewer</h3><a class="heading-link" href="#prefer-lines-80-characters-or-fewer" aria-label="Link to 'PREFER lines 80 characters or fewer' section">#</a></div><p class="linter-rule">Linter rule: <a href="/tools/linter-rules/lines_longer_than_80_chars">lines_longer_than_80_chars</a></p><p>Readability studies show that long lines of text are harder to read because your eye has to travel farther when moving to the beginning of the next line. This is why newspapers and magazines use multiple columns of text.</p><p>If you really find yourself wanting lines longer than 80 characters, our experience is that your code is likely too verbose and could be a little more compact. The main offender is usually <code>VeryLongCamelCaseClassNames</code>. Ask yourself, &quot;Does each word in that type name tell me something critical or prevent a name collision?&quot; If not, consider omitting it.</p><p>Note that <code>dart format</code> defaults to 80 characters or fewer, though you can <a href="/tools/dart-format#configuring-formatter-page-width">configure</a> the default. It does not split long string literals to fit in 80 columns, so you have to do that manually.</p><p><strong>Exception:</strong> When a URI or file path occurs in a comment or string (usually in an import or export), it may remain whole even if it causes the line to go over 80 characters. This makes it easier to search source files for a path.</p><p><strong>Exception:</strong> Multi-line strings can contain lines longer than 80 characters because newlines are significant inside the string and splitting the lines into shorter ones can alter the program.</p><p><a id="do-use-curly-braces-for-all-flow-control-structures"></a></p><div class="header-wrapper"><h3 id="do-use-curly-braces-for-all-flow-control-statements">DO use curly braces for all flow control statements</h3><a class="heading-link" href="#do-use-curly-braces-for-all-flow-control-statements" aria-label="Link to 'DO use curly braces for all flow control statements' section">#</a></div><p class="linter-rule">Linter rule: <a href="/tools/linter-rules/curly_braces_in_flow_control_structures">curly_braces_in_flow_control_structures</a></p><p>Doing so avoids the <a href="https://en.wikipedia.org/wiki/Dangling_else">dangling else</a> problem.</p> <?code-excerpt "style_good.dart (curly-braces)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-good"><span class="code-block-tag">good</span><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"> (isWeekDay) {</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(</span><span style="color:#11796D">'Bike to work!'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222">} </span><span style="color:#D43324">else</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(</span><span style="color:#11796D">'Go dancing or read a book!'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p><strong>Exception:</strong> When you have an <code>if</code> statement with no <code>else</code> clause and the whole <code>if</code> statement fits on one line, you can omit the braces if you prefer:</p> <?code-excerpt "style_good.dart (one-line-if)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-good"><span class="code-block-tag">good</span><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"> (arg == </span><span style="color:#11796D">null</span><span style="color:#222222">) </span><span style="color:#D43324">return</span><span style="color:#222222"> defaultValue;</span></span></code></pre></div></div><p>If the body wraps to the next line, though, use braces:</p> <?code-excerpt "style_good.dart (one-line-if-wrap)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-good"><span class="code-block-tag">good</span><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"> (overflowChars != other.overflowChars) {</span></span> <span class="line"><span style="color:#D43324"> return</span><span style="color:#222222"> overflowChars &#x3C; other.overflowChars;</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><?code-excerpt "style_bad.dart (one-line-if-wrap)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-bad"><span class="code-block-tag">bad</span><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"> (overflowChars != other.overflowChars)</span></span> <span class="line"><span style="color:#D43324"> return</span><span style="color:#222222"> overflowChars &#x3C; other.overflowChars;</span></span></code></pre></div></div><nav id="prev-next"><ul><li class="previous"><a href="/effective-dart">&lang;&nbsp;&nbsp;Overview</a></li><li class="next"><a href="/effective-dart/documentation">Documentation&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-21.</span> <a href="https://github.com/dart-lang/site-www/tree/main/src/content/effective-dart/style.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/effective-dart/style/&page-source=https://github.com/dart-lang/site-www/tree/main/src/content/effective-dart/style.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