CINXE.COM
Fixing common type problems | 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="Common type issues you may have and how to fix them."><title>Fixing common type problems | 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="Fixing common type problems"><meta name="twitter:description" content="Common type issues you may have and how to fix them."><meta property="og:title" content="Fixing common type problems"><meta property="og:description" content="Common type issues you may have and how to fix them."><meta property="og:url" content="/deprecated/sound-problems/"><meta property="og:image" content="/assets/img/logo/dart-logo-for-shares.png?2" eleventy:ignore><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Google+Sans:wght@400;500;700&display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css2?family=Google+Sans+Display:wght@400&display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css2?family=Google+Sans+Mono:wght@400;500;700&display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css2?family=Google+Sans+Text:wght@400;500;700&display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0..1,0" rel="stylesheet"><link rel="stylesheet" href="/assets/css/main.css?v=2"><script src="/assets/js/os-tabs.js?v=2"></script><script src="/assets/js/main.js?v=2"></script><script>!function(e,a,t,n,c,o,s){e.GoogleAnalyticsObject=c,e[c]=e[c]||function(){(e[c].q=e[c].q||[]).push(arguments)},e[c].l=1*new Date,o=a.createElement(t),s=a.getElementsByTagName(t)[0],o.async=1,o.src="//www.google-analytics.com/analytics.js",s.parentNode.insertBefore(o,s)}(window,document,"script",0,"ga"),ga("create","UA-26406144-4","auto"),ga("send","pageview")</script></head><body class="default.html"><a id="skip" href="#site-content-title" tabindex="1">Skip to main content</a><section id="cookie-notice"><div class="container"><p>dart.dev uses cookies from Google to deliver and enhance the quality of its services and to analyze traffic.</p><div class="button-group"><a class="text-button" href="https://policies.google.com/technologies/cookies" target="_blank" rel="noopener">Learn more</a> <button id="cookie-consent" class="filled-button">OK, got it</button></div></div></section><noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5VSZM5J" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript><div id="site-banner" role="alert"><p>Announcing Dart 3.7! Find out about updates to the language, analyzer, pub.dev, and more, in the <a href="https://medium.com/dartlang/announcing-dart-3-7-bf864a1b195c" target="_blank">blog post</a>.</p></div><header id="page-header" class="site-header"><nav id="mainnav" class="site-header"><div id="menu-toggle"><span class="material-symbols" title="Toggle side navigation menu." aria-label="Toggle side navigation menu." type="button">menu</span></div><a href="/" class="brand" title="Dart"><img src="/assets/img/logo/logo-white-text.svg" alt="Dart"></a><ul class="navbar"><li><a href="/overview" class="nav-link">Overview</a></li><li class="mainnav__get-started"><a href="/docs" class="nav-link active"><span>Docs</span></a></li><li><a href="/community" class="nav-link">Community</a></li><li><a href="/#try-dart" class="nav-link">Try Dart</a></li><li><a href="/get-dart" class="nav-link">Get Dart</a></li><li class="searchfield"><form action="/search" class="site-header__search form-inline" id="cse-search-box"><input type="hidden" name="cx" value="011220921317074318178:_yy-tmb5t_i"> <input type="hidden" name="ie" value="UTF-8"> <input type="hidden" name="hl" value="en"> <input class="site-header__searchfield form-control search-field" type="search" name="q" id="search-main" autocomplete="off" placeholder="Search" aria-label="Search"></form></li></ul></nav></header><div id="site-below-header"><div id="site-main-row"><div id="sidenav"><form action="/search/" class="site-header__search form-inline"><input class="site-header__searchfield form-control search-field" type="search" name="q" id="search-side" autocomplete="off" placeholder="Search" aria-label="Search"></form><ul class="navbar-nav"><li aria-hidden="true"><div class="sidenav-divider"></div></li><li class="nav-item"><a href="/overview" class="nav-link">Overview</a></li><li class="nav-item"><a href="/community" class="nav-link">Community</a></li><li class="nav-item"><a href="https://dartpad.dev" class="nav-link">Try Dart</a></li><li class="nav-item"><a href="/get-dart" class="nav-link">Get Dart</a></li><li class="nav-item"><a href="/docs" class="nav-link">Docs</a></li><li aria-hidden="true"><div class="sidenav-divider"></div></li></ul><ul class="nav"><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#-sidenav-1" role="button" aria-expanded="false" aria-controls="-sidenav-1"><span>Language</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1"><li class="nav-item"><a class="nav-link" href="/language"><div><span>Introduction</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-2" role="button" aria-expanded="false" aria-controls="-sidenav-1-2"><span>Syntax basics</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-2"><li class="nav-item"><a class="nav-link" href="/language/variables"><div><span>Variables</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/operators"><div><span>Operators</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/comments"><div><span>Comments</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/metadata"><div><span>Metadata</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/libraries"><div><span>Libraries & imports</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/keywords"><div><span>Keywords</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-3" role="button" aria-expanded="false" aria-controls="-sidenav-1-3"><span>Types</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-3"><li class="nav-item"><a class="nav-link" href="/language/built-in-types"><div><span>Built-in types</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/records"><div><span>Records</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/collections"><div><span>Collections</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/generics"><div><span>Generics</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/typedefs"><div><span>Typedefs</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/type-system"><div><span>Type system</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-4" role="button" aria-expanded="false" aria-controls="-sidenav-1-4"><span>Patterns</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-4"><li class="nav-item"><a class="nav-link" href="/language/patterns"><div><span>Overview & usage</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/pattern-types"><div><span>Pattern types</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://codelabs.developers.google.com/codelabs/dart-patterns-records" target="_blank" rel="noopener"><div><span>Applied tutorial</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li></ul></li><li class="nav-item"><a class="nav-link" href="/language/functions"><div><span>Functions</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-6" role="button" aria-expanded="false" aria-controls="-sidenav-1-6"><span>Control flow</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-6"><li class="nav-item"><a class="nav-link" href="/language/loops"><div><span>Loops</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/branches"><div><span>Branches</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/error-handling"><div><span>Error handling</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-7" role="button" aria-expanded="false" aria-controls="-sidenav-1-7"><span>Classes & objects</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-7"><li class="nav-item"><a class="nav-link" href="/language/classes"><div><span>Classes</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/constructors"><div><span>Constructors</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/methods"><div><span>Methods</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/extend"><div><span>Extend a class</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/mixins"><div><span>Mixins</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/enums"><div><span>Enums</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/extension-methods"><div><span>Extension methods</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/extension-types"><div><span>Extension types</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/callable-objects"><div><span>Callable objects</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-8" role="button" aria-expanded="false" aria-controls="-sidenav-1-8"><span>Class modifiers</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-8"><li class="nav-item"><a class="nav-link" href="/language/class-modifiers"><div><span>Overview & usage</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/class-modifiers-for-apis"><div><span>Class modifiers for API maintainers</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/modifier-reference"><div><span>Reference</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-9" role="button" aria-expanded="false" aria-controls="-sidenav-1-9"><span>Concurrency</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-9"><li class="nav-item"><a class="nav-link" href="/language/concurrency"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/async"><div><span>Asynchronous support</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/isolates"><div><span>Isolates</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-10" role="button" aria-expanded="false" aria-controls="-sidenav-1-10"><span>Null safety</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-10"><li class="nav-item"><a class="nav-link" href="/null-safety"><div><span>Sound null safety</span></div></a></li><li class="nav-item"><a class="nav-link" href="/null-safety/migration-guide"><div><span>Migrating to null safety</span></div></a></li><li class="nav-item"><a class="nav-link" href="/null-safety/understanding-null-safety"><div><span>Understanding null safety</span></div></a></li><li class="nav-item"><a class="nav-link" href="/null-safety/unsound-null-safety"><div><span>Unsound null safety</span></div></a></li><li class="nav-item"><a class="nav-link" href="/null-safety/faq"><div><span>FAQ</span></div></a></li></ul></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#-sidenav-2" role="button" aria-expanded="false" aria-controls="-sidenav-2"><span>Core libraries</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-2"><li class="nav-item"><a class="nav-link" href="/libraries"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/libraries/dart-core"><div><span>dart:core</span></div></a></li><li class="nav-item"><a class="nav-link" href="/libraries/dart-async"><div><span>dart:async</span></div></a></li><li class="nav-item"><a class="nav-link" href="/libraries/dart-math"><div><span>dart:math</span></div></a></li><li class="nav-item"><a class="nav-link" href="/libraries/dart-convert"><div><span>dart:convert</span></div></a></li><li class="nav-item"><a class="nav-link" href="/libraries/dart-io"><div><span>dart:io</span></div></a></li><li class="nav-item"><a class="nav-link" href="/interop/js-interop"><div><span>dart:js_interop</span></div></a></li><div class="sidenav-divider"></div><li class="nav-item"><a class="nav-link" href="/libraries/collections/iterables"><div><span>Iterable collections</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-2-10" role="button" aria-expanded="false" aria-controls="-sidenav-2-10"><span>Asynchronous programming</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-2-10"><li class="nav-item"><a class="nav-link" href="/libraries/async/async-await"><div><span>Tutorial</span></div></a></li><li class="nav-item"><a class="nav-link" href="/libraries/async/futures-error-handling"><div><span>Futures and error handling</span></div></a></li><li class="nav-item"><a class="nav-link" href="/libraries/async/using-streams"><div><span>Using streams</span></div></a></li><li class="nav-item"><a class="nav-link" href="/libraries/async/creating-streams"><div><span>Creating streams</span></div></a></li></ul></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#-sidenav-3" role="button" aria-expanded="false" aria-controls="-sidenav-3"><span>Effective Dart</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-3"><li class="nav-item"><a class="nav-link" href="/effective-dart"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/effective-dart/style"><div><span>Style</span></div></a></li><li class="nav-item"><a class="nav-link" href="/effective-dart/documentation"><div><span>Documentation</span></div></a></li><li class="nav-item"><a class="nav-link" href="/effective-dart/usage"><div><span>Usage</span></div></a></li><li class="nav-item"><a class="nav-link" href="/effective-dart/design"><div><span>Design</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#-sidenav-4" role="button" aria-expanded="false" aria-controls="-sidenav-4"><span>Packages</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-4"><li class="nav-item"><a class="nav-link" href="/tools/pub/packages"><div><span>How to use packages</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/useful-packages"><div><span>Commonly used packages</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/create-packages"><div><span>Creating packages</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/publishing"><div><span>Publishing packages</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/writing-package-pages"><div><span>Writing package pages</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/workspaces"><div><span>Workspaces (monorepo support)</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-4-7" role="button" aria-expanded="false" aria-controls="-sidenav-4-7"><span>Package reference</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-4-7"><li class="nav-item"><a class="nav-link" href="/tools/pub/dependencies"><div><span>Dependencies</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/glossary"><div><span>Glossary</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/package-layout"><div><span>Package layout conventions</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/environment-variables"><div><span>Pub environment variables</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/pubspec"><div><span>Pubspec file</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/troubleshoot"><div><span>Troubleshooting pub</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/verified-publishers"><div><span>Verified publishers</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/security-advisories"><div><span>Security advisories</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/versioning"><div><span>Versioning</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/custom-package-repositories"><div><span>Custom package repositories</span></div></a></li></ul></li><li class="nav-item"><a class="nav-link" href="/tools/pub/private-files"><div><span>What not to commit</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#-sidenav-5" role="button" aria-expanded="false" aria-controls="-sidenav-5"><span>Development</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-5"><li class="nav-item"><a class="nav-link" href="/libraries/serialization/json"><div><span>JSON serialization</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/language/number-representation"><div><span>Number representation</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/google-apis"><div><span>Google APIs</span></div></a></li><li class="nav-item"><a class="nav-link" href="/multiplatform-apps"><div><span>Multi-platform apps</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-5-5" role="button" aria-expanded="false" aria-controls="-sidenav-5-5"><span>Command-line & server apps</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-5-5"><li class="nav-item"><a class="nav-link" href="/server"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tutorials/server/get-started"><div><span>Get started</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tutorials/server/cmdline"><div><span>Write command-line apps</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tutorials/server/fetch-data"><div><span>Fetch data from the internet</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tutorials/server/httpserver"><div><span>Write HTTP servers</span></div></a></li><li class="nav-item"><a class="nav-link" href="/server/libraries"><div><span>Libraries & packages</span></div></a></li><li class="nav-item"><a class="nav-link" href="/server/google-cloud"><div><span>Google Cloud</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-5-6" role="button" aria-expanded="false" aria-controls="-sidenav-5-6"><span>Web apps</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-5-6"><li class="nav-item"><a class="nav-link" href="/web"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/web/get-started"><div><span>Get started</span></div></a></li><li class="nav-item"><a class="nav-link" href="/web/deployment"><div><span>Deployment</span></div></a></li><li class="nav-item"><a class="nav-link" href="/web/libraries"><div><span>Libraries & packages</span></div></a></li><li class="nav-item"><a class="nav-link" href="/web/wasm"><div><span>Wasm compilation</span></div></a></li></ul></li><li class="nav-item"><a class="nav-link" href="/libraries/core/environment-declarations"><div><span>Environment declarations</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#-sidenav-6" role="button" aria-expanded="false" aria-controls="-sidenav-6"><span>Interoperability</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-6"><li class="nav-item"><a class="nav-link" href="/interop/c-interop"><div><span>C interop</span></div></a></li><li class="nav-item"><a class="nav-link" href="/interop/objective-c-interop"><div><span>Objective-C & Swift interop</span></div></a></li><li class="nav-item"><a class="nav-link" href="/interop/java-interop"><div><span>Java & Kotlin interop</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-6-4" role="button" aria-expanded="false" aria-controls="-sidenav-6-4"><span>JavaScript interop</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-6-4"><li class="nav-item"><a class="nav-link" href="/interop/js-interop"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/interop/js-interop/usage"><div><span>Usage</span></div></a></li><li class="nav-item"><a class="nav-link" href="/interop/js-interop/js-types"><div><span>JS types</span></div></a></li><li class="nav-item"><a class="nav-link" href="/interop/js-interop/tutorials"><div><span>Tutorials</span></div></a></li><li class="nav-item"><a class="nav-link" href="/interop/js-interop/past-js-interop"><div><span>Past JS interop</span></div></a></li><div class="sidenav-divider"></div><li class="nav-item"><a class="nav-link" href="/interop/js-interop/package-web"><div><span>Web interop</span></div></a></li></ul></li></ul></li><li class="nav-item"><button class="nav-link active collapsible" data-toggle="collapse" data-target="#-sidenav-7" role="button" aria-expanded="true" aria-controls="-sidenav-7"><span>Tools & techniques</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse show" 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 active collapsible" data-toggle="collapse" data-target="#-sidenav-7-4" role="button" aria-expanded="true" 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 show" 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 active" 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="#troubleshooting">Troubleshooting</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#no-type-errors">No type errors</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#static-errors-and-warnings">Static errors and warnings</a><ul class="nav"><li class="toc-entry nav-item"><a class="nav-link" href="#undefined-member">Undefined member</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#invalid-method-override">Invalid method override</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#missing-type-arguments">Missing type arguments</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#unexpected-collection-element-type">Unexpected collection element type</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#constructor-initialization-list-super-call">Constructor initialization list super() call</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#the-argument-type-cant-be-assigned-to-the-parameter-type">The argument type ... can't be assigned to the parameter type ...</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#incorrect-type-inference">Incorrect type inference</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#conflicting-superinterfaces">Conflicting Superinterfaces</a></li></ul></li><li class="toc-entry nav-item"><a class="nav-link" href="#runtime-errors">Runtime errors</a><ul class="nav"><li class="toc-entry nav-item"><a class="nav-link" href="#invalid-casts">Invalid casts</a></li></ul></li><li class="toc-entry nav-item"><a class="nav-link" href="#appendix">Appendix</a><ul class="nav"><li class="toc-entry nav-item"><a class="nav-link" href="#the-covariant-keyword">The covariant keyword</a></li></ul></li></ul></div><article><div class="content"><div id="site-content-title"><h1>Fixing common type problems</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="#troubleshooting">Troubleshooting</a></li><li class="toc-entry"><a href="#no-type-errors">No type errors</a></li><li class="toc-entry"><a href="#static-errors-and-warnings">Static errors and warnings</a><ul><li class="toc-entry"><a href="#undefined-member">Undefined member</a></li><li class="toc-entry"><a href="#invalid-method-override">Invalid method override</a></li><li class="toc-entry"><a href="#missing-type-arguments">Missing type arguments</a></li><li class="toc-entry"><a href="#unexpected-collection-element-type">Unexpected collection element type</a></li><li class="toc-entry"><a href="#constructor-initialization-list-super-call">Constructor initialization list super() call</a></li><li class="toc-entry"><a href="#the-argument-type-cant-be-assigned-to-the-parameter-type">The argument type ... can't be assigned to the parameter type ...</a></li><li class="toc-entry"><a href="#incorrect-type-inference">Incorrect type inference</a></li><li class="toc-entry"><a href="#conflicting-superinterfaces">Conflicting Superinterfaces</a></li></ul></li><li class="toc-entry"><a href="#runtime-errors">Runtime errors</a><ul><li class="toc-entry"><a href="#invalid-casts">Invalid casts</a></li></ul></li><li class="toc-entry"><a href="#appendix">Appendix</a><ul><li class="toc-entry"><a href="#the-covariant-keyword">The covariant keyword</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 replace="/ *\/\/\s+ignore_for_file:[^\n]+\n//g; /(^|\n) *\/\/\s+ignore:[^\n]+\n/$1/g; /(\n[^\n]+) *\/\/\s+ignore:[^\n]+\n/$1\n/g; /. • (lib|test)\/\w+\.dart:\d+:\d+//g"?> <?code-excerpt plaster="none"?> <?code-excerpt path-base="type_system"?> <p>If you're having problems with type checks, this page can help. To learn more, read about <a href="/language/type-system">Dart's type system</a>, and see <a href="/language/type-system#other-resources">these other resources</a>.</p><aside class="alert alert-info"><div class="alert-header"><span class="material-symbols" aria-hidden="true">info</span> <span>Help us improve this page!</span></div><div class="alert-content"><p>If you encounter a warning or error that isn't listed here, please file an issue by clicking the <strong>bug icon</strong> at the top right. Include the <strong>warning or error message</strong> and, if possible, the code for both a small reproducible case and its correct equivalent.</p></div></aside><div class="header-wrapper"><h2 id="troubleshooting">Troubleshooting</h2><a class="heading-link" href="#troubleshooting" aria-label="Link to 'Troubleshooting' section">#</a></div><p>Dart enforces a sound type system. This means you can't write code where a variable's value differs from its static type. A variable with an <code>int</code> type can't store a number with a decimal place. Dart checks variable values against their types at <a href="#static-errors-and-warnings">compile-time</a> and <a href="#runtime-errors">runtime</a>.</p><p>You can't get into a situation where the value stored in a variable is different from the variable's static type. Like most modern statically typed languages, Dart accomplishes this with a combination of <a href="#static-errors-and-warnings">static (compile-time)</a> and <a href="#runtime-errors">dynamic (runtime)</a> checking.</p><p>For example, the following type error is detected at compile-time:</p><div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-fails-sa"><span class="code-block-tag">✗ static analysis: failure</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">List</span><span style="color:#222222"><</span><span style="color:#0468D7">int</span><span style="color:#222222">> numbers = [</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:#0468D7">List</span><span style="color:#222222"><</span><span style="color:#0468D7">String</span><span style="color:#222222">> </span><mark class="highlight"><span style="color:#222222">string = numbers</span></mark><span style="color:#222222">;</span></span></code></pre></div></div><p>Since neither <code>List<int></code> nor <code>List<String></code> is a subtype of the other, Dart rules this out statically.</p><p>You can see other examples of static analysis errors, as well as other error types, in the following sections.</p><div class="header-wrapper"><h2 id="no-type-errors">No type errors</h2><a class="heading-link" href="#no-type-errors" aria-label="Link to 'No type errors' section">#</a></div><p>If you're not seeing expected errors or warnings, make sure that you're using the latest version of Dart and you have properly configured your <a href="/tools#editors">IDE or editor</a>.</p><p>You can also run analysis on your program using the command line with the <a href="/tools/dart-analyze"><code>dart analyze</code></a> command.</p><p>To verify that analysis is working as expected, try adding the following code to a Dart file.</p> <?code-excerpt "lib/strong_analysis.dart (static-analysis-enabled)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-fails-sa"><span class="code-block-tag">✗ static analysis: failure</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">bool</span><span style="color:#222222"> b = [</span><span style="color:#11796D">0</span><span style="color:#222222">][</span><span style="color:#11796D">0</span><span style="color:#222222">];</span></span></code></pre></div></div><p>If properly configured, the analyzer produces the following error:</p> <?code-excerpt "analyzer-results-stable.txt" retain="/'int' can't be .* 'bool'/" replace="/-(.*?):(.*?):(.*?)-/-/g"?> <div class="code-block-wrapper language-plaintext"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span>error - A value of type 'int' can't be assigned to a variable of type 'bool'. Try changing the type of the variable, or casting the right-hand type to 'bool'. - invalid_assignment</span></span></code></pre></div></div><p><a name="common-errors"></a></p><div class="header-wrapper"><h2 id="static-errors-and-warnings">Static errors and warnings</h2><a class="heading-link" href="#static-errors-and-warnings" aria-label="Link to 'Static errors and warnings' section">#</a></div><p>This section shows how to fix some of the errors and warnings you might see from the analyzer or an IDE.</p><p>Static analysis can't catch all errors. For help fixing errors that appear only at runtime, see <a href="#common-errors-and-warnings">Runtime errors</a>.</p><div class="header-wrapper"><h3 id="undefined-member">Undefined member</h3><a class="heading-link" href="#undefined-member" aria-label="Link to 'Undefined member' section">#</a></div> <?code-excerpt "analyzer-results-stable.txt" retain="/getter.*isn't defined for the type/" replace="/. Try.*.'context2D'. / /g; /getter/<member\x3E/g; /'\w+'/'...'/g; /-(.*?):(.*?):(.*?)-/-/g"?> <div class="code-block-wrapper language-plaintext"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span>error - The <member> '...' isn't defined for the type '...' - undefined_<member></span></span></code></pre></div></div><p>These errors can appear under the following conditions:</p><ul><li>A variable is statically known to be some supertype, but the code assumes a subtype.</li><li>A generic class has a bounded type parameter, but an instance creation expression of the class omits the type argument.</li></ul><div class="header-wrapper"><h4 id="example-1-a-variable-is-statically-known-to-be-some-supertype-but-the-code-assumes-a-subtype">Example 1: A variable is statically known to be some supertype, but the code assumes a subtype</h4><a class="heading-link" href="#example-1-a-variable-is-statically-known-to-be-some-supertype-but-the-code-assumes-a-subtype" aria-label="Link to 'Example 1: A variable is statically known to be some supertype, but the code assumes a subtype' section">#</a></div><p>In the following code, the analyzer complains that <code>context2D</code> is undefined:</p> <?code-excerpt "lib/common_fixes_analysis.dart (canvas-undefined)" replace="/context2D/[!$&!]/g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-fails-sa"><span class="code-block-tag">✗ static analysis: failure</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"> canvas = document.</span><span style="color:#6200EE">querySelector</span><span style="color:#222222">(</span><span style="color:#11796D">'canvas'</span><span style="color:#222222">)!;</span></span> <span class="line"><span style="color:#222222">canvas.</span><mark class="highlight"><span style="color:#222222">context2D</span></mark><span style="color:#222222">.</span><span style="color:#6200EE">lineTo</span><span style="color:#222222">(x, y);</span></span></code></pre></div></div><?code-excerpt "analyzer-results-stable.txt" retain="/context2D.*isn't defined for the type/" replace="/-(.*?):(.*?):(.*?)-/-/g"?> <div class="code-block-wrapper language-plaintext"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span>error - The getter 'context2D' isn't defined for the type 'Element'. Try importing the library that defines 'context2D', correcting the name to the name of an existing getter, or defining a getter or field named 'context2D'. - undefined_getter</span></span></code></pre></div></div><div class="header-wrapper"><h4 id="fix-replace-the-definition-of-the-member-with-an-explicit-type-declaration-or-a-downcast">Fix: Replace the definition of the member with an explicit type declaration or a downcast</h4><a class="heading-link" href="#fix-replace-the-definition-of-the-member-with-an-explicit-type-declaration-or-a-downcast" aria-label="Link to 'Fix: Replace the definition of the member with an explicit type declaration or a downcast' section">#</a></div><p>The return type of <code>querySelector()</code> is <code>Element?</code> (which the <code>!</code> converts to <code>Element</code>), but the code assumes that it's the subtype <code>CanvasElement</code> (which defines <code>context2D</code>). The <code>canvas</code> field is declared as <code>var</code>, which allows Dart to infer <code>canvas</code> to be an <code>Element</code>.</p><p>You can fix this error with an explicit downcast:</p> <?code-excerpt "lib/common_fixes_analysis.dart (canvas-as)" replace="/as \w+/[!$&!]/g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-passes-sa"><span class="code-block-tag">✔ static analysis: success</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"> canvas = document.</span><span style="color:#6200EE">querySelector</span><span style="color:#222222">(</span><span style="color:#11796D">'canvas'</span><span style="color:#222222">) </span><mark class="highlight"><span style="color:#D43324">as</span><span style="color:#0468D7"> HTMLCanvasElement</span></mark><span style="color:#222222">;</span></span> <span class="line"><span style="color:#222222">canvas.context2D.</span><span style="color:#6200EE">lineTo</span><span style="color:#222222">(x, y);</span></span></code></pre></div></div><p>Otherwise, use <code>dynamic</code> in situations where you can't use a single type:</p> <?code-excerpt "lib/common_fixes_analysis.dart (canvas-dynamic)" replace="/dynamic/[!$&!]/g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-passes-sa"><span class="code-block-tag">✔ static analysis: success</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"> canvasOrImg = document.</span><span style="color:#6200EE">querySelector</span><span style="color:#222222">(</span><span style="color:#11796D">'canvas, img'</span><span style="color:#222222">) </span><span style="color:#D43324">as</span><span style="color:#0468D7"> </span><mark class="highlight"><span style="color:#0468D7">dynamic</span></mark><span style="color:#222222">;</span></span> <span class="line"><span style="color:#D43324">var</span><span style="color:#222222"> width = canvasOrImg.width;</span></span></code></pre></div></div><div class="header-wrapper"><h4 id="example-2-omitted-type-parameters-default-to-their-type-bounds">Example 2: Omitted type parameters default to their type bounds</h4><a class="heading-link" href="#example-2-omitted-type-parameters-default-to-their-type-bounds" aria-label="Link to 'Example 2: Omitted type parameters default to their type bounds' section">#</a></div><p>Consider the following <strong>generic class</strong> with a <strong>bounded type parameter</strong> that extends <code>Iterable</code>:</p> <?code-excerpt "lib/bounded/my_collection.dart"?> <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"> C</span><span style="color:#222222"><</span><span style="color:#0468D7">T</span><span style="color:#D43324"> extends</span><span style="color:#0468D7"> Iterable</span><span style="color:#222222">> {</span></span> <span class="line"><span style="color:#D43324"> final</span><span style="color:#0468D7"> T</span><span style="color:#222222"> collection;</span></span> <span class="line"><span style="color:#0468D7"> C</span><span style="color:#222222">(</span><span style="color:#D43324">this</span><span style="color:#222222">.collection);</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p>The following code creates a new instance of this class (omitting the type argument) and accesses its <code>collection</code> member:</p> <?code-excerpt "lib/bounded/instantiate_to_bound.dart (undefined-method)" replace="/c\.add\(2\)/[!$&!]/g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-fails-sa"><span class="code-block-tag">✗ static analysis: failure</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"> c = </span><span style="color:#0468D7">C</span><span style="color:#222222">(</span><span style="color:#0468D7">Iterable</span><span style="color:#222222">.</span><span style="color:#6200EE">empty</span><span style="color:#222222">()).collection;</span></span> <span class="line"><mark class="highlight"><span style="color:#222222">c.</span><span style="color:#6200EE">add</span><span style="color:#222222">(</span><span style="color:#11796D">2</span><span style="color:#222222">)</span></mark><span style="color:#222222">;</span></span></code></pre></div></div><?code-excerpt "analyzer-results-stable.txt" retain="/add.*isn't defined for the type/" replace="/-(.*?):(.*?):(.*?)-/-/g"?> <div class="code-block-wrapper language-plaintext"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span>error - The method 'add' isn't defined for the type 'Iterable'. Try correcting the name to the name of an existing method, or defining a method named 'add'. - undefined_method</span></span></code></pre></div></div><p>While the <a href="https://api.dart.dev/dart-core/List-class.html">List</a> type has an <code>add()</code> method, <a href="https://api.dart.dev/dart-core/Iterable-class.html">Iterable</a> does not.</p><div class="header-wrapper"><h4 id="fix-specify-type-arguments-or-fix-downstream-errors">Fix: Specify type arguments or fix downstream errors</h4><a class="heading-link" href="#fix-specify-type-arguments-or-fix-downstream-errors" aria-label="Link to 'Fix: Specify type arguments or fix downstream errors' section">#</a></div><p>When a generic class is instantiated without explicit type arguments, each type parameter defaults to its type bound (<code>Iterable</code> in this example) if one is explicitly given, or <code>dynamic</code> otherwise.</p><p>You need to approach fixing such errors on a case-by-case basis. It helps to have a good understanding of the original design intent.</p><p>Explicitly passing type arguments is an effective way to help identify type errors. For example, if you change the code to specify <code>List</code> as a type argument, the analyzer can detect the type mismatch in the constructor argument. Fix the error by providing a constructor argument of the appropriate type, such as a list literal:</p> <?code-excerpt "test/strong_test.dart (add-type-arg)" replace="/.List.|\[\]/[!$&!]/g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-passes-sa"><span class="code-block-tag">✔ static analysis: success</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"> c = </span><span style="color:#0468D7">C</span><mark class="highlight"><span style="color:#222222"><</span><span style="color:#0468D7">List</span><span style="color:#222222">></span></mark><span style="color:#222222">(</span><mark class="highlight"><span style="color:#222222">[]</span></mark><span style="color:#222222">).collection;</span></span> <span class="line"><span style="color:#222222">c.</span><span style="color:#6200EE">add</span><span style="color:#222222">(</span><span style="color:#11796D">2</span><span style="color:#222222">);</span></span></code></pre></div></div><hr><div class="header-wrapper"><h3 id="invalid-method-override">Invalid method override</h3><a class="heading-link" href="#invalid-method-override" aria-label="Link to 'Invalid method override' section">#</a></div> <?code-excerpt "analyzer-results-stable.txt" retain="/isn't a valid override of.*add/" replace="/'[\w\.]+'/'...'/g; /\('.*?'\)//g; /-(.*?):(.*?):(.*?)-/-/g; /' . -/' -/g"?> <div class="code-block-wrapper language-plaintext"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span>error - '...' isn't a valid override of '...' - invalid_override</span></span></code></pre></div></div><p>These errors typically occur when a subclass tightens up a method's parameter types by specifying a subclass of the original class.</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>This issue can also occur when a generic subclass neglects to specify a type. For more information, see <a href="#missing-type-arguments">Missing type arguments</a>.</p></div></aside><div class="header-wrapper"><h4 id="example">Example</h4><a class="heading-link" href="#example" aria-label="Link to 'Example' section">#</a></div><p>In the following example, the parameters to the <code>add()</code> method are of type <code>int</code>, a subtype of <code>num</code>, which is the parameter type used in the parent class.</p> <?code-excerpt "lib/common_fixes_analysis.dart (invalid-method-override)" replace="/int(?= \w\b.*=)/[!$&!]/g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-fails-sa"><span class="code-block-tag">✗ static analysis: failure</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">abstract</span><span style="color:#D43324"> class</span><span style="color:#0468D7"> NumberAdder</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#0468D7"> num</span><span style="color:#6200EE"> add</span><span style="color:#222222">(</span><span style="color:#0468D7">num</span><span style="color:#222222"> a, </span><span style="color:#0468D7">num</span><span style="color:#222222"> b);</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"> MyAdder</span><span style="color:#D43324"> extends</span><span style="color:#0468D7"> NumberAdder</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#D43324"> @override</span></span> <span class="line"><span style="color:#0468D7"> num</span><span style="color:#6200EE"> add</span><span style="color:#222222">(</span><mark class="highlight"><span style="color:#0468D7">int</span></mark><span style="color:#222222"> a, </span><mark class="highlight"><span style="color:#0468D7">int</span></mark><span style="color:#222222"> b) => a + b;</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><?code-excerpt "analyzer-results-stable.txt" retain="/isn't a valid override of.*add/" replace="/-(.*?):(.*?):(.*?)-/-/g"?> <div class="code-block-wrapper language-plaintext"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span>error - 'MyAdder.add' ('num Function(int, int)') isn't a valid override of 'NumberAdder.add' ('num Function(num, num)'). - invalid_override</span></span></code></pre></div></div><p>Consider the following scenario where floating point values are passed to an <code>MyAdder</code>:</p> <?code-excerpt "lib/common_fixes_analysis.dart (runtime-failure-if-int)" replace="/1.2/[!1.2!]/g/3.4/[!3.4!]/g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-runtime-fail"><span class="code-block-tag">✗ runtime: failure</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">NumberAdder</span><span style="color:#222222"> adder = </span><span style="color:#0468D7">MyAdder</span><span style="color:#222222">();</span></span> <span class="line"><span style="color:#222222">adder.</span><span style="color:#6200EE">add</span><span style="color:#222222">(</span><mark class="highlight"><span style="color:#11796D">1.2</span></mark><span style="color:#222222">, </span><mark class="highlight"><span style="color:#11796D">3.4</span></mark><span style="color:#222222">);</span></span></code></pre></div></div><p>If the override were allowed, the code would raise an error at runtime.</p><div class="header-wrapper"><h4 id="fix-widen-the-methods-parameter-types">Fix: Widen the method's parameter types</h4><a class="heading-link" href="#fix-widen-the-methods-parameter-types" aria-label="Link to 'Fix: Widen the method's parameter types' section">#</a></div><p>The subclass's method should accept every object that the superclass's method takes.</p><p>Fix the example by widening the types in the subclass:</p> <?code-excerpt "lib/common_fixes_analysis.dart (invalid-method-override)" replace="/int(?= \w\b.*=)/[!num!]/g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-passes-sa"><span class="code-block-tag">✔ static analysis: success</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">abstract</span><span style="color:#D43324"> class</span><span style="color:#0468D7"> NumberAdder</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#0468D7"> num</span><span style="color:#6200EE"> add</span><span style="color:#222222">(</span><span style="color:#0468D7">num</span><span style="color:#222222"> a, </span><span style="color:#0468D7">num</span><span style="color:#222222"> b);</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"> MyAdder</span><span style="color:#D43324"> extends</span><span style="color:#0468D7"> NumberAdder</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#D43324"> @override</span></span> <span class="line"><span style="color:#0468D7"> num</span><span style="color:#6200EE"> add</span><span style="color:#222222">(</span><mark class="highlight"><span style="color:#0468D7">num</span></mark><span style="color:#222222"> a, </span><mark class="highlight"><span style="color:#0468D7">num</span></mark><span style="color:#222222"> b) => a + b;</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p>For more information, see <a href="/language/type-system#use-proper-param-types">Use proper input parameter types when overriding methods</a>.</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>If you have a valid reason to use a subtype, you can use the <a href="/language/type-system#covariant-keyword">covariant keyword</a>.</p></div></aside><hr><div class="header-wrapper"><h3 id="missing-type-arguments">Missing type arguments</h3><a class="heading-link" href="#missing-type-arguments" aria-label="Link to 'Missing type arguments' section">#</a></div> <?code-excerpt "analyzer-results-stable.txt" retain="/isn't a valid override of.*method/" replace="/'\S+'/'...'/g; /\('.*?'\)//g; /-(.*?):(.*?):(.*?)-/-/g; /' . -/' -/g"?> <div class="code-block-wrapper language-plaintext"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span>error - '...' isn't a valid override of '...' - invalid_override</span></span></code></pre></div></div><div class="header-wrapper"><h4 id="example-1">Example</h4><a class="heading-link" href="#example-1" aria-label="Link to 'Example' section">#</a></div><p>In the following example, <code>Subclass</code> extends <code>Superclass<T></code> but doesn't specify a type argument. The analyzer infers <code>Subclass<dynamic></code>, which results in an invalid override error on <code>method(int)</code>.</p> <?code-excerpt "lib/common_fixes_analysis.dart (type-arguments)" replace="/int/[!$&!]/g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-fails-sa"><span class="code-block-tag">✗ static analysis: failure</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"> Superclass</span><span style="color:#222222"><</span><span style="color:#0468D7">T</span><span style="color:#222222">> {</span></span> <span class="line"><span style="color:#D43324"> void</span><span style="color:#6200EE"> method</span><span style="color:#222222">(</span><span style="color:#0468D7">T</span><span style="color:#222222"> param) {</span></span> <span class="line"><span style="color:#222222"> ...</span></span> <span class="line"><span style="color:#222222"> }</span></span> <span class="line"><span style="color:#222222">}</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324">class</span><span style="color:#0468D7"> Subclass</span><span style="color:#D43324"> extends</span><span style="color:#0468D7"> Superclass</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#D43324"> @override</span></span> <span class="line"><span style="color:#D43324"> void</span><span style="color:#6200EE"> method</span><span style="color:#222222">(</span><mark class="highlight"><span style="color:#0468D7">int</span></mark><span style="color:#222222"> param) {</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><?code-excerpt "analyzer-results-stable.txt" retain="/isn't a valid override of.*method/" replace="/-(.*?):(.*?):(.*?)-/-/g"?> <div class="code-block-wrapper language-plaintext"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span>error - 'Subclass.method' ('void Function(int)') isn't a valid override of 'Superclass.method' ('void Function(dynamic)'). - invalid_override</span></span></code></pre></div></div><div class="header-wrapper"><h4 id="fix-specify-type-arguments-for-the-generic-subclass">Fix: Specify type arguments for the generic subclass</h4><a class="heading-link" href="#fix-specify-type-arguments-for-the-generic-subclass" aria-label="Link to 'Fix: Specify type arguments for the generic subclass' section">#</a></div><p>When a generic subclass neglects to specify a type argument, the analyzer infers the <code>dynamic</code> type. This is likely to cause errors.</p><p>You can fix the example by specifying the type on the subclass:</p> <?code-excerpt "lib/common_fixes_analysis.dart (type-arguments)" replace="/Superclass /Superclass[!<int\x3E!] /g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-passes-sa"><span class="code-block-tag">✔ static analysis: success</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"> Superclass</span><span style="color:#222222"><</span><span style="color:#0468D7">T</span><span style="color:#222222">> {</span></span> <span class="line"><span style="color:#D43324"> void</span><span style="color:#6200EE"> method</span><span style="color:#222222">(</span><span style="color:#0468D7">T</span><span style="color:#222222"> param) {</span></span> <span class="line"><span style="color:#222222"> ...</span></span> <span class="line"><span style="color:#222222"> }</span></span> <span class="line"><span style="color:#222222">}</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324">class</span><span style="color:#0468D7"> Subclass</span><span style="color:#D43324"> extends</span><span style="color:#0468D7"> Superclass</span><mark class="highlight"><span style="color:#222222"><</span><span style="color:#0468D7">int</span><span style="color:#222222">></span></mark><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#D43324"> @override</span></span> <span class="line"><span style="color:#D43324"> void</span><span style="color:#6200EE"> method</span><span style="color:#222222">(</span><span style="color:#0468D7">int</span><span style="color:#222222"> param) {</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>Consider using the analyzer in <em>strict raw types</em> mode, which ensures that your code specifies generic type arguments. Here's an example of enabling strict raw types in your project's <code>analysis_options.yaml</code> file:</p><div class="code-block-wrapper language-yaml"><div class="code-block-body"><span class="code-block-language" title="Language yaml">yaml</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#0468D7">analyzer</span><span style="color:#222222">:</span></span> <span class="line"><span style="color:#0468D7"> language</span><span style="color:#222222">:</span></span> <span class="line"><span style="color:#0468D7"> strict-raw-types</span><span style="color:#222222">: </span><span style="color:#11796D">true</span></span></code></pre></div></div><p>To learn more about customizing the analyzer's behavior, see <a href="/tools/analysis">Customizing static analysis</a>.</p><hr><p><a id="assigning-mismatched-types"></a></p><div class="header-wrapper"><h3 id="unexpected-collection-element-type">Unexpected collection element type</h3><a class="heading-link" href="#unexpected-collection-element-type" aria-label="Link to 'Unexpected collection element type' section">#</a></div> <?code-excerpt "analyzer-results-stable.txt" retain="/common_fixes_analysis.*'double' can't be assigned to a variable of type 'int'./" replace="/. Try.*'int'. / /g; /'\S+'/'...'/g; /-(.*?):(.*?):(.*?)-/-/g"?> <div class="code-block-wrapper language-plaintext"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span>error - A value of type '...' can't be assigned to a variable of type '...' - invalid_assignment</span></span></code></pre></div></div><p>This sometimes happens when you create a simple dynamic collection and the analyzer infers the type in a way you didn't expect. When you later add values of a different type, the analyzer reports an issue.</p><div class="header-wrapper"><h4 id="example-2">Example</h4><a class="heading-link" href="#example-2" aria-label="Link to 'Example' section">#</a></div><p>The following code initializes a map with several (<code>String</code>, <code>int</code>) pairs. The analyzer infers that map to be of type <code><String, int></code> but the code seems to assume either <code><String, dynamic></code> or <code><String, num></code>. When the code adds a (<code>String</code>, <code>double</code>) pair, the analyzer complains:</p> <?code-excerpt "lib/common_fixes_analysis.dart (inferred-collection-types)" replace="/1.5/[!1.5!]/g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-fails-sa"><span class="code-block-tag">✗ static analysis: failure</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">// Inferred as Map<String, int></span></span> <span class="line"><span style="color:#D43324">var</span><span style="color:#222222"> map = {</span><span style="color:#11796D">'a'</span><span style="color:#222222">: </span><span style="color:#11796D">1</span><span style="color:#222222">, </span><span style="color:#11796D">'b'</span><span style="color:#222222">: </span><span style="color:#11796D">2</span><span style="color:#222222">, </span><span style="color:#11796D">'c'</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">map[</span><span style="color:#11796D">'d'</span><span style="color:#222222">] = </span><mark class="highlight"><span style="color:#11796D">1.5</span></mark><span style="color:#222222">;</span></span></code></pre></div></div><?code-excerpt "analyzer-results-stable.txt" retain="/common_fixes_analysis.*'double' can't be assigned to a variable of type 'int'/" replace="/-(.*?):(.*?):(.*?)-/-/g"?> <div class="code-block-wrapper language-plaintext"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span>error - A value of type 'double' can't be assigned to a variable of type 'int'. Try changing the type of the variable, or casting the right-hand type to 'int'. - invalid_assignment</span></span></code></pre></div></div><div class="header-wrapper"><h4 id="fix-specify-the-type-explicitly">Fix: Specify the type explicitly</h4><a class="heading-link" href="#fix-specify-the-type-explicitly" aria-label="Link to 'Fix: Specify the type explicitly' section">#</a></div><p>The example can be fixed by explicitly defining the map's type to be <code><String, num></code>.</p> <?code-excerpt "lib/common_fixes_analysis.dart (inferred-collection-types-ok)" replace="/<.*?\x3E/[!$&!]/g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-passes-sa"><span class="code-block-tag">✔ static analysis: success</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"> map = </span><mark class="highlight"><span style="color:#222222"><</span><span style="color:#0468D7">String</span><span style="color:#222222">, </span><span style="color:#0468D7">num</span><span style="color:#222222">></span></mark><span style="color:#222222">{</span><span style="color:#11796D">'a'</span><span style="color:#222222">: </span><span style="color:#11796D">1</span><span style="color:#222222">, </span><span style="color:#11796D">'b'</span><span style="color:#222222">: </span><span style="color:#11796D">2</span><span style="color:#222222">, </span><span style="color:#11796D">'c'</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">map[</span><span style="color:#11796D">'d'</span><span style="color:#222222">] = </span><span style="color:#11796D">1.5</span><span style="color:#222222">;</span></span></code></pre></div></div><p>Alternatively, if you want this map to accept any value, specify the type as <code><String, dynamic></code>.</p><hr><p><a id="constructor-initialization-list"></a></p><div class="header-wrapper"><h3 id="constructor-initialization-list-super-call">Constructor initialization list super() call</h3><a class="heading-link" href="#constructor-initialization-list-super-call" aria-label="Link to 'Constructor initialization list super() call' section">#</a></div> <?code-excerpt "analyzer-results-stable.txt" retain="/The superconstructor call must be last in an initializer list.*/" replace="/Animal/.../g; /-(.*?):(.*?):(.*?)-/-/g"?> <div class="code-block-wrapper language-plaintext"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span>error - The superconstructor call must be last in an initializer list: '...'. - super_invocation_not_last</span></span></code></pre></div></div><p>This error occurs when the <code>super()</code> call is not last in a constructor's initialization list.</p><div class="header-wrapper"><h4 id="example-3">Example</h4><a class="heading-link" href="#example-3" aria-label="Link to 'Example' section">#</a></div> <?code-excerpt "lib/common_fixes_analysis.dart (super-goes-last)" replace="/super/[!$&!]/g; /_HoneyBadger/HoneyBadger/g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-fails-sa"><span class="code-block-tag">✗ static analysis: failure</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">HoneyBadger</span><span style="color:#222222">(</span><span style="color:#0468D7">Eats</span><span style="color:#222222"> food, </span><span style="color:#0468D7">String</span><span style="color:#222222"> name)</span></span> <span class="line"><span style="color:#222222"> : </span><mark class="highlight"><span style="color:#D43324">super</span></mark><span style="color:#222222">(food),</span></span> <span class="line"><span style="color:#222222"> _name = name {</span></span> <span class="line"><span style="color:#222222"> ...</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><?code-excerpt "analyzer-results-stable.txt" retain="/The superconstructor call must be last in an initializer list.*/" replace="/-(.*?):(.*?):(.*?)-/-/g"?> <div class="code-block-wrapper language-plaintext"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span>error - The superconstructor call must be last in an initializer list: 'Animal'. - super_invocation_not_last</span></span></code></pre></div></div><div class="header-wrapper"><h4 id="fix-put-the-super-call-last">Fix: Put the <code>super()</code> call last</h4><a class="heading-link" href="#fix-put-the-super-call-last" aria-label="Link to 'Fix: Put the super() call last' section">#</a></div><p>The compiler can generate simpler code if it relies on the <code>super()</code> call appearing last.</p><p>Fix this error by moving the <code>super()</code> call:</p> <?code-excerpt "lib/common_fixes_analysis.dart (super-goes-last-ok)" replace="/super/[!$&!]/g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-passes-sa"><span class="code-block-tag">✔ static analysis: success</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">HoneyBadger</span><span style="color:#222222">(</span><span style="color:#0468D7">Eats</span><span style="color:#222222"> food, </span><span style="color:#0468D7">String</span><span style="color:#222222"> name) : _name = name, </span><mark class="highlight"><span style="color:#D43324">super</span></mark><span style="color:#222222">(food) {</span></span> <span class="line"><span style="color:#222222"> ...</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><hr><p><a name="uses-dynamic-as-bottom"></a></p><div class="header-wrapper"><h3 id="the-argument-type-cant-be-assigned-to-the-parameter-type">The argument type ... can't be assigned to the parameter type ...</h3><a class="heading-link" href="#the-argument-type-cant-be-assigned-to-the-parameter-type" aria-label="Link to 'The argument type ... can't be assigned to the parameter type ...' section">#</a></div> <?code-excerpt "analyzer-results-stable.txt" retain="/The argument type.*bool Function/" replace="/'bool.*?\)'/'...'/g; /-(.*?):(.*?):(.*?)-/-/g"?> <div class="code-block-wrapper language-plaintext"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span>error - The argument type '...' can't be assigned to the parameter type '...'. - argument_type_not_assignable</span></span></code></pre></div></div><p>In Dart 1.x <code>dynamic</code> was both a <a href="https://en.wikipedia.org/wiki/Top_type">top type</a> (supertype of all types) and a <a href="https://en.wikipedia.org/wiki/Bottom_type">bottom type</a> (subtype of all types) depending on the context. This meant it was valid to assign, for example, a function with a parameter of type <code>String</code> to a place that expected a function type with a parameter of <code>dynamic</code>.</p><p>However, in Dart 2 using a parameter type other than <code>dynamic</code> (or another <em>top</em> type, such as <code>Object?</code>) results in a compile-time error.</p><div class="header-wrapper"><h4 id="example-4">Example</h4><a class="heading-link" href="#example-4" aria-label="Link to 'Example' section">#</a></div> <?code-excerpt "lib/common_fixes_analysis.dart (func-fail)" replace="/String/[!$&!]/g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-fails-sa"><span class="code-block-tag">✗ static analysis: failure</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">void</span><span style="color:#6200EE"> filterValues</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">dynamic</span><span style="color:#222222">) filter) {}</span></span> <span class="line"><span style="color:#6200EE">filterValues</span><span style="color:#222222">((</span><mark class="highlight"><span style="color:#0468D7">String</span></mark><span style="color:#222222"> x) => x.</span><span style="color:#6200EE">contains</span><span style="color:#222222">(</span><span style="color:#11796D">'Hello'</span><span style="color:#222222">));</span></span></code></pre></div></div><?code-excerpt "analyzer-results-stable.txt" retain="/The argument type.*bool Function/" replace="/-(.*?)-/-/g"?> <div class="code-block-wrapper language-plaintext"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span>error - The argument type 'bool Function(String)' can't be assigned to the parameter type 'bool Function(dynamic)'. - argument_type_not_assignable</span></span></code></pre></div></div><div class="header-wrapper"><h4 id="fix-add-type-parameters-or-cast-from-dynamic-explicitly">Fix: Add type parameters <em>or</em> cast from dynamic explicitly</h4><a class="heading-link" href="#fix-add-type-parameters-or-cast-from-dynamic-explicitly" aria-label="Link to 'Fix: Add type parameters or cast from dynamic explicitly' section">#</a></div><p>When possible, avoid this error by adding type parameters:</p> <?code-excerpt "lib/common_fixes_analysis.dart (func-T)" replace="/<\w+\x3E/[!$&!]/g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-passes-sa"><span class="code-block-tag">✔ static analysis: success</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">void</span><span style="color:#6200EE"> filterValues</span><mark class="highlight"><span style="color:#222222"><</span><span style="color:#0468D7">T</span><span style="color:#222222">></span></mark><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">) filter) {}</span></span> <span class="line"><span style="color:#6200EE">filterValues</span><mark class="highlight"><span style="color:#222222"><</span><span style="color:#0468D7">String</span><span style="color:#222222">></span></mark><span style="color:#222222">((x) => x.</span><span style="color:#6200EE">contains</span><span style="color:#222222">(</span><span style="color:#11796D">'Hello'</span><span style="color:#222222">));</span></span></code></pre></div></div><p>Otherwise use casting:</p> <?code-excerpt "lib/common_fixes_analysis.dart (func-cast)" replace="/([Ff]ilter)1/$1/g; /as \w+/[!$&!]/g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-passes-sa"><span class="code-block-tag">✔ static analysis: success</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">void</span><span style="color:#6200EE"> filterValues</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">dynamic</span><span style="color:#222222">) filter) {}</span></span> <span class="line"><span style="color:#6200EE">filterValues</span><span style="color:#222222">((x) => (x </span><mark class="highlight"><span style="color:#D43324">as</span><span style="color:#0468D7"> String</span></mark><span style="color:#222222">).</span><span style="color:#6200EE">contains</span><span style="color:#222222">(</span><span style="color:#11796D">'Hello'</span><span style="color:#222222">));</span></span></code></pre></div></div><hr><div class="header-wrapper"><h3 id="incorrect-type-inference">Incorrect type inference</h3><a class="heading-link" href="#incorrect-type-inference" aria-label="Link to 'Incorrect type inference' section">#</a></div><p>On rare occasions, Dart's type inference might infer the wrong type for function literal arguments in a generic constructor invocation. This primarily affects <code>Iterable.fold</code>.</p><div class="header-wrapper"><h4 id="example-5">Example</h4><a class="heading-link" href="#example-5" aria-label="Link to 'Example' section">#</a></div><p>In the following code, type inference will infer that <code>a</code> has a type of <code>Null</code>:</p> <?code-excerpt "lib/common_fixes_analysis.dart (type-inf-null)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-fails-sa"><span class="code-block-tag">✗ static analysis: failure</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"> ints = [</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:#D43324">var</span><span style="color:#222222"> maximumOrNull = ints.</span><span style="color:#6200EE">fold</span><span style="color:#222222">(</span><span style="color:#11796D">null</span><span style="color:#222222">, (a, b) => a == </span><span style="color:#11796D">null</span><span style="color:#222222"> || a < b ? b : a);</span></span></code></pre></div></div><div class="header-wrapper"><h4 id="fix-supply-appropriate-type-as-explicit-type-argument">Fix: Supply appropriate type as explicit type argument</h4><a class="heading-link" href="#fix-supply-appropriate-type-as-explicit-type-argument" aria-label="Link to 'Fix: Supply appropriate type as explicit type argument' section">#</a></div> <?code-excerpt "lib/common_fixes_analysis.dart (type-inf-fix)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-passes-sa"><span class="code-block-tag">✔ static analysis: success</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"> ints = [</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:#D43324">var</span><span style="color:#222222"> maximumOrNull = ints.</span><span style="color:#6200EE">fold</span><span style="color:#222222"><</span><span style="color:#0468D7">int</span><span style="color:#222222">?>(</span></span> <span class="line"><span style="color:#11796D"> null</span><span style="color:#222222">,</span></span> <span class="line"><span style="color:#222222"> (a, b) => a == </span><span style="color:#11796D">null</span><span style="color:#222222"> || a < b ? b : a,</span></span> <span class="line"><span style="color:#222222">);</span></span></code></pre></div></div><hr><div class="header-wrapper"><h3 id="conflicting-superinterfaces">Conflicting Superinterfaces</h3><a class="heading-link" href="#conflicting-superinterfaces" aria-label="Link to 'Conflicting Superinterfaces' section">#</a></div><p>A class which <code>implements</code> more than one superinterface must be able to implement valid overrides for every member of every superinterface. Each member with a given name requires compatible signatures across the superinterfaces.</p><p>Superinterfaces must not include conflicting generics. A class can't implement both <code>C<A></code> and <code>C<B></code>, including indirect superinterfaces.</p><div class="header-wrapper"><h4 id="example-6">Example</h4><a class="heading-link" href="#example-6" aria-label="Link to 'Example' section">#</a></div><p>In the following code, class <code>C</code> has conflicting generic interfaces. Definitions of valid overrides for some members would be impossible.</p> <?code-excerpt "lib/common_fixes_analysis.dart (conflicting-generics)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-fails-sa"><span class="code-block-tag">✗ static analysis: failure</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">abstract</span><span style="color:#D43324"> class</span><span style="color:#0468D7"> C</span><span style="color:#D43324"> implements</span><span style="color:#0468D7"> List</span><span style="color:#222222"><</span><span style="color:#0468D7">int</span><span style="color:#222222">>, </span><span style="color:#0468D7">Iterable</span><span style="color:#222222"><</span><span style="color:#0468D7">num</span><span style="color:#222222">> {}</span></span></code></pre></div></div><div class="header-wrapper"><h4 id="fix-use-consistent-generics-or-avoid-repeating-transitive-interfaces">Fix: Use consistent generics or avoid repeating transitive interfaces</h4><a class="heading-link" href="#fix-use-consistent-generics-or-avoid-repeating-transitive-interfaces" aria-label="Link to 'Fix: Use consistent generics or avoid repeating transitive interfaces' section">#</a></div> <?code-excerpt "lib/common_fixes_analysis.dart (compatible-generics)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-passes-sa"><span class="code-block-tag">✔ static analysis: success</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">abstract</span><span style="color:#D43324"> class</span><span style="color:#0468D7"> C</span><span style="color:#D43324"> implements</span><span style="color:#0468D7"> List</span><span style="color:#222222"><</span><span style="color:#0468D7">int</span><span style="color:#222222">> {}</span></span></code></pre></div></div><p><a id="common-errors-and-warnings"></a></p><div class="header-wrapper"><h2 id="runtime-errors">Runtime errors</h2><a class="heading-link" href="#runtime-errors" aria-label="Link to 'Runtime errors' section">#</a></div><p>The errors discussed in this section are reported at <a href="/language/type-system#runtime-checks">runtime</a>.</p><div class="header-wrapper"><h3 id="invalid-casts">Invalid casts</h3><a class="heading-link" href="#invalid-casts" aria-label="Link to 'Invalid casts' section">#</a></div><p>To ensure type safety, Dart needs to insert <em>runtime</em> checks in some cases. Consider the following <code>assumeStrings</code> method:</p> <?code-excerpt "test/strong_test.dart (downcast-check)" replace="/string = objects/[!$&!]/g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-passes-sa"><span class="code-block-tag">✔ static analysis: success</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">void</span><span style="color:#6200EE"> assumeStrings</span><span style="color:#222222">(</span><span style="color:#0468D7">dynamic</span><span style="color:#222222"> objects) {</span></span> <span class="line"><span style="color:#0468D7"> List</span><span style="color:#222222"><</span><span style="color:#0468D7">String</span><span style="color:#222222">> strings = objects; </span><span style="color:#6E6E70">// Runtime downcast check</span></span> <span class="line"><span style="color:#0468D7"> String</span><span style="color:#222222"> string = strings[</span><span style="color:#11796D">0</span><span style="color:#222222">]; </span><span style="color:#6E6E70">// Expect a String value</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p>The assignment to <code>strings</code> is <em>downcasting</em> the <code>dynamic</code> to <code>List<String></code> implicitly (as if you wrote <code>as List<String></code>), so if the value you pass in <code>objects</code> at runtime is a <code>List<String></code>, then the cast succeeds.</p><p>Otherwise, the cast will fail at runtime:</p> <?code-excerpt "test/strong_test.dart (fail-downcast-check)" replace="/\[.*\]/[!$&!]/g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-runtime-fail"><span class="code-block-tag">✗ runtime: failure</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:#6200EE">assumeStrings</span><span style="color:#222222">(<</span><span style="color:#0468D7">int</span><span style="color:#222222">></span><mark class="highlight"><span style="color:#222222">[</span><span style="color:#11796D">1</span><span style="color:#222222">, </span><span style="color:#11796D">2</span><span style="color:#222222">, </span><span style="color:#11796D">3</span><span style="color:#222222">]</span></mark><span style="color:#222222">);</span></span></code></pre></div></div><?code-excerpt "test/strong_test.dart (downcast-check-msg)" replace="/const msg = ./Exception: /g; /.;//g"?> <div class="code-block-wrapper language-plaintext"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span>Exception: type 'List<int>' is not a subtype of type 'List<String>'</span></span></code></pre></div></div><div class="header-wrapper"><h4 id="fix-tighten-or-correct-types">Fix: Tighten or correct types</h4><a class="heading-link" href="#fix-tighten-or-correct-types" aria-label="Link to 'Fix: Tighten or correct types' section">#</a></div><p>Sometimes, lack of a type, especially with empty collections, means that a <code><dynamic></code> collection is created, instead of the typed one you intended. Adding an explicit type argument can help:</p> <?code-excerpt "test/strong_test.dart (typed-list-lit)" replace="/<String\x3E/[!$&!]/g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-runtime-success"><span class="code-block-tag">runtime-success</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"> list = </span><mark class="highlight"><span style="color:#222222"><</span><span style="color:#0468D7">String</span><span style="color:#222222">></span></mark><span style="color:#222222">[];</span></span> <span class="line"><span style="color:#222222">list.</span><span style="color:#6200EE">add</span><span style="color:#222222">(</span><span style="color:#11796D">'a string'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222">list.</span><span style="color:#6200EE">add</span><span style="color:#222222">(</span><span style="color:#11796D">'another'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#6200EE">assumeStrings</span><span style="color:#222222">(list);</span></span></code></pre></div></div><p>You can also more precisely type the local variable, and let inference help:</p> <?code-excerpt "test/strong_test.dart (typed-list)" replace="/<String\x3E/[!$&!]/g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-runtime-success"><span class="code-block-tag">runtime-success</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">List</span><mark class="highlight"><span style="color:#222222"><</span><span style="color:#0468D7">String</span><span style="color:#222222">></span></mark><span style="color:#222222"> list = [];</span></span> <span class="line"><span style="color:#222222">list.</span><span style="color:#6200EE">add</span><span style="color:#222222">(</span><span style="color:#11796D">'a string'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222">list.</span><span style="color:#6200EE">add</span><span style="color:#222222">(</span><span style="color:#11796D">'another'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#6200EE">assumeStrings</span><span style="color:#222222">(list);</span></span></code></pre></div></div><p>In cases where you are working with a collection that you don't create, such as from JSON or an external data source, you can use the <a href="https://api.dart.dev/dart-core/Iterable/cast.html">cast()</a> method provided by <code>Iterable</code> implementations, such as <code>List</code>.</p><p>Here's an example of the preferred solution: tightening the object's type.</p> <?code-excerpt "test/strong_test.dart (cast)" replace="/cast/[!$&!]/g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body has-tag tag-runtime-success"><span class="code-block-tag">runtime-success</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">Map</span><span style="color:#222222"><</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 style="color:#6200EE">fetchFromExternalSource</span><span style="color:#222222">();</span></span> <span class="line"><span style="color:#D43324">var</span><span style="color:#222222"> names = json[</span><span style="color:#11796D">'names'</span><span style="color:#222222">] </span><span style="color:#D43324">as</span><span style="color:#0468D7"> List</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#6200EE">assumeStrings</span><span style="color:#222222">(names.</span><mark class="highlight"><span style="color:#6200EE">cast</span></mark><span style="color:#222222"><</span><span style="color:#0468D7">String</span><span style="color:#222222">>());</span></span></code></pre></div></div><div class="header-wrapper"><h2 id="appendix">Appendix</h2><a class="heading-link" href="#appendix" aria-label="Link to 'Appendix' section">#</a></div><div class="header-wrapper"><h3 id="the-covariant-keyword">The covariant keyword</h3><a class="heading-link" href="#the-covariant-keyword" aria-label="Link to 'The covariant keyword' section">#</a></div><p>The documentation on the <code>covariant</code> keyword has been moved to <a href="/language/type-system#covariant-keyword">The Dart Type system</a>.</p><p id="page-github-links"><span>Unless stated otherwise, the documentation on this site reflects Dart 3.7.0. Page last updated on 2025-02-12.</span> <a href="https://github.com/dart-lang/site-www/tree/main/src/content/deprecated/sound-problems.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/deprecated/sound-problems/&page-source=https://github.com/dart-lang/site-www/tree/main/src/content/deprecated/sound-problems.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>