<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://dcm.dev/blog/</id>
    <title>DCM - Code Quality Tool for Flutter Developers Blog</title>
    <updated>2026-08-24T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://dcm.dev/blog/"/>
    <subtitle>DCM - Code Quality Tool for Flutter Developers Blog</subtitle>
    <icon>https://dcm.dev/img/favicons/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[What’s new in DCM 1.39.0]]></title>
        <id>https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/</id>
        <link href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/"/>
        <updated>2026-08-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release includes 22 new rules; full Primary constructors support for all rules, metrics and commands; new command to find mutable fields and top-level variables that are never reassigned and can be declared final (also, with a CLI fix!); unused code detection improvements; several improved metrics; new "@mutated" annotation; and other improvements!]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="Cover" src="https://dcm.dev/assets/images/2026-08-24-cover-79aec3309b482081dad614c509444eae.jpg" width="1400" height="736" class="img_ev3q"></p>
<p>Today we’re excited to announce the release of DCM 1.39.0!</p>
<p>This release includes 22 new rules; full Primary constructors support for all rules, metrics and commands; new command to find mutable fields and top-level variables that are never reassigned and can be declared final (also, with a CLI fix!); unused code detection improvements; several improved metrics; new <code>@mutated</code> annotation; and other improvements! 🚀</p>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>❗️ With the next release we plan to discontinue all DCM versions <strong>prior to 1.30.0</strong>. If you're still using one of those, consider upgrading to a newer version.</p></div></div>
<p>Let’s go through the highlights of this release (and the full list of changes is <a class="" href="https://dcm.dev/changelog/#1.39.0">in our changelog</a>)!</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-command-for-unnecessarily-mutable-fields-and-top-level-variables">New Command for Unnecessarily Mutable Fields and Top-level Variables<a href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/#new-command-for-unnecessarily-mutable-fields-and-top-level-variables" class="hash-link" aria-label="Direct link to New Command for Unnecessarily Mutable Fields and Top-level Variables" title="Direct link to New Command for Unnecessarily Mutable Fields and Top-level Variables" translate="no">​</a></h2>
<p>With this release, we are excited to present yet another <a class="" href="https://dcm.dev/docs/cli/code-quality-checks/unnecessarily-mutable-fields/">command</a> to help you with maintaining your codebase! This one is for detecting fields and top-level variables that declared as mutable (with <code>var</code> or type, e.g. <code>String</code>), but are actually never reassigned and can be instead declared as <code>final</code>.</p>
<p>This commands aims to help with 2 different issues: quickly identify mutable fields and variables that <strong>were supposed</strong> to be reassigned, but are actually not, and find fields and variables that can be made <code>final</code> so future readers of the code can safely assume that those fields and variables <strong>are not</strong> changed from any other place.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> anotherValue</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">anotherValue</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">int</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> globalVariable </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> instance </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'value'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>here, both <code>anotherValue</code> and <code>globalVariable</code> are never reassigned and can be declared as <code>final</code>.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The example above is a simplified example where all code usages are within one file. The command analyzes cross-file usage before highlighting any issues. That applies to both public and private declarations.</p></div></div>
<p>To execute the command, run:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">$ </span><span class="token builtin class-name" style="color:#7fdbca">dcm</span><span class="token plain"> check-unnecessarily-mutable-fields </span><span class="token function" style="color:#87aff4">lib</span><span class="token plain"> </span><span class="token comment" style="color:#999999"># or dcm umf lib</span><br></span></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="Console" src="https://dcm.dev/assets/images/unnecessarily-mutable-fields-console-report-bafe8a6933d3161c21339143a26577cf.webp" width="4200" height="1640" class="img_ev3q"></p>
<p>Furthermore, you can automatically fix issues reported by this command via <code>dcm fix</code> reducing time to addresses them to just few minutes.</p>
<p>To do so, set the <code>--type</code> option to unnecessarily-mutable-fields <code>--type=unnecessarily-mutable-fields</code>:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">$ </span><span class="token builtin class-name" style="color:#7fdbca">dcm</span><span class="token plain"> fix --type=unnecessarily-mutable-fields </span><span class="token function" style="color:#87aff4">lib</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>By the way, this release includes aliases for all fix types, so no more <code>unnecessarily-public-code</code> or <code>unnecessarily-mutable-fields</code>, you can just pass <code>--type=upc</code> or <code>--type=umf</code>!</p><p>Check <code>dcm fix -h</code> for the full list of aliases.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="metric-updates">Metric Updates<a href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/#metric-updates" class="hash-link" aria-label="Direct link to Metric Updates" title="Direct link to Metric Updates" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="maximum-nesting-level">maximum-nesting-level<a href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/#maximum-nesting-level" class="hash-link" aria-label="Direct link to maximum-nesting-level" title="Direct link to maximum-nesting-level" translate="no">​</a></h3>
<p>With this release, no longer triggers for functions and methods with empty body (or with pseudo-empty body).</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">first</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">second</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">throw</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Exception</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">third</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">throw</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Exception</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>all the above are now skipped to reduce noise.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cyclomatic-complexity-and-maintainability-index">cyclomatic-complexity and maintainability-index<a href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/#cyclomatic-complexity-and-maintainability-index" class="hash-link" aria-label="Direct link to cyclomatic-complexity and maintainability-index" title="Direct link to cyclomatic-complexity and maintainability-index" translate="no">​</a></h3>
<p>Were previously only skipping function and methods with empty body, but now exclude more cases for pseudo-empty body as well (similar to <code>maximum-nesting-level</code>).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="rule-updates">Rule Updates<a href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/#rule-updates" class="hash-link" aria-label="Direct link to Rule Updates" title="Direct link to Rule Updates" translate="no">​</a></h2>
<p>While this release includes Primary constructors support for all rules, metrics and commands, we didn't not include any new rules for primary constructors and want to take more time for proper implementation.</p>
<p>Meanwhile, there are several rules in the Dart analyzer (<a href="https://dart.dev/tools/linter-rules/use_declaring_parameters" target="_blank" rel="noopener noreferrer" class=""><code>use_declaring_parameters</code></a>, <a href="https://dart.dev/tools/linter-rules/initialize_in_field_declaration" target="_blank" rel="noopener noreferrer" class=""><code>initialize_in_field_declaration</code></a>, <a href="https://dart.dev/tools/linter-rules/empty_container_bodies" target="_blank" rel="noopener noreferrer" class=""><code>empty_container_bodies</code></a> and for some reason undocumented <code>use_primary_constructors</code>) that cover basic cases and all have auto-fixes for fast migration.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-avoid-missing-image-alt">❗️ avoid-missing-image-alt<a href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/#%EF%B8%8F-avoid-missing-image-alt" class="hash-link" aria-label="Direct link to ❗️ avoid-missing-image-alt" title="Direct link to ❗️ avoid-missing-image-alt" translate="no">​</a></h3>
<p>This rule was renamed to <code>provide-image-semantic-label</code> to maintain consistency with newly introduced accessibility rules.</p>
<p>If you have <code>avoid-missing-image-alt</code> in your configuration, you need to manually rename it to <code>provide-image-semantic-label</code> when upgrading to 1.39.0+.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="parameters-ordering">parameters-ordering<a href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/#parameters-ordering" class="hash-link" aria-label="Direct link to parameters-ordering" title="Direct link to parameters-ordering" translate="no">​</a></h3>
<p>This release includes a new config option called <code>discard-underscores</code> to exclude underscores (<code>_</code>) from parameter names when doing the comparison.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">WithPrivate</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> _value</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> _age</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> surname</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">WithPrivate</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">correct</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">._</span><span class="token plain">age</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">surname</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">._</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>without the config option, the rule highlights <code>WithPrivate.correct</code> and expects the order of the parameters to be <code>surname</code> -&gt; <code>_age</code> -&gt; <code>_value</code> (which is the correct alphabetical order, given some of the have the <code>_</code>).</p>
<p>However, if you want to sort parameters regardless of them being public or private, setting <code>discard-underscores: true</code> will give you that.</p>
<p>With that option enabled, the expected order matches what the constructor already has (<code>_age</code> -&gt; <code>surname</code> -&gt; <code>_value</code>) and the rule <strong>will not</strong> show an issue.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="mutated-annotation"><code>@mutated</code> annotation<a href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/#mutated-annotation" class="hash-link" aria-label="Direct link to mutated-annotation" title="Direct link to mutated-annotation" translate="no">​</a></h3>
<p>With this release we are adding a new <code>@mutated</code> annotation to the <a href="https://github.com/CQLabs/dart-code-metrics-annotations.git" target="_blank" rel="noopener noreferrer" class="">dart-code-metrics-annotations</a> package.</p>
<p>The idea behind this annotation is to clearly indicate which parameters are being mutated within the function/method body for both future readers and some of our lint rules that check for mutable parameters.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">first</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token metadata function" style="color:#87aff4">@mutated</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Set</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> targets</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  targets</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">add</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">second</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Set</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> targets</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">targets</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>here, adding <code>@mutated</code> to the <code>targets</code> parameter clearly indicates that the number of elements in that set changes somewhere within the function body removing the need to read through that body (regardless of its size) to understand that.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>We've also added a new rule <code>prefer-correct-mutated</code> that highlights all cases where adding <code>@mutated</code> is necessary (and all cases where it is redundant and can be removed) so no manual work is required. That rule also has an auto-fix.</p></div></div>
<p>Additionally, <code>avoid-collection-mutating-methods</code>, <code>avoid-mutating-parameters</code> and <code>avoid-not-assignable-collection-types</code> pick up that annotation to show (or in some cases, hide) their issues. For more details, please refer to the docs for each of those rules.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-rules">New Rules<a href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/#new-rules" class="hash-link" aria-label="Direct link to New Rules" title="Direct link to New Rules" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p><strong>Discovering and Adding Rules from New Releases</strong></p><p>Each DCM release introduces new rules. To explore all available rules and filter by version, use the <a class="" href="https://dcm.dev/docs/cli/init/#lints-preview"><code>dcm init lints-preview</code></a> command:</p><div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token builtin class-name" style="color:#7fdbca">dcm</span><span class="token plain"> init lints-preview </span><span class="token function" style="color:#87aff4">lib</span><span class="token plain"> --rule-version=1.39.0  </span><span class="token comment" style="color:#999999"># Show rules added in 1.39.0</span><br></span></code></pre></div></div><p>This command displays:</p><ul>
<li class="">Rule names and their violations in your codebase</li>
<li class="">Estimated effort to fix all violations of each rule</li>
<li class="">Whether a rule supports automatic fixes</li>
</ul><p>You can also generate the output in different formats.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="add-static-field"><a class="" href="https://dcm.dev/docs/rules/common/add-static-field/"><code>add-static-field</code></a><a href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/#add-static-field" class="hash-link" aria-label="Direct link to add-static-field" title="Direct link to add-static-field" translate="no">​</a></h3>
<p>Warns when a class that mixes in, extends or implements a configured other class is missing a required static field.</p>
<blockquote>
<p>This rule requires configuration in order to highlight any issues.</p>
</blockquote>
<p>For example,</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">analysis_options.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">rules</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">add-static-field</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">entries</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">type</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> with</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">            </span><span class="token key atrule" style="color:#6dbdfa">name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> MyMixin</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">            </span><span class="token key atrule" style="color:#6dbdfa">fields</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token string" style="color:#e1ffe4">'id'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">'value'</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">type</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> implements</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">            </span><span class="token key atrule" style="color:#6dbdfa">name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> MyInterface</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">            </span><span class="token key atrule" style="color:#6dbdfa">fields</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token string" style="color:#e1ffe4">'anotherField'</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">type</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> extends</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">            </span><span class="token key atrule" style="color:#6dbdfa">name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> MySuperclass</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">            </span><span class="token key atrule" style="color:#6dbdfa">fields</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token string" style="color:#e1ffe4">'someField'</span><span class="token punctuation" style="color:#a7dbf7">]</span></span><br></span></code></pre></div></div>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// LINT: This class mixes in MyMixin and is expected to have static fields: id, value.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">//  Try adding these fields.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">MixinTarget</span></mark><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">with</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyMixin</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// LINT: This class implements MyInterface and is expected to have static fields: anotherField.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">//  Try adding these fields.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">InterfaceTarget</span></mark><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">implements</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyInterface</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// LINT: This class extends MySuperclass and is expected to have static fields: someField.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">//  Try adding these fields.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">ParentTarget</span></mark><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MySuperclass</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>with the configuration above, the rule will highlight all three class declarations as missing static fields.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MixinTarget</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">with</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyMixin</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> id </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> value </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">InterfaceTarget</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">implements</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyInterface</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> anotherField </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ParentTarget</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MySuperclass</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> someField </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">3</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-not-assignable-collection-types"><a class="" href="https://dcm.dev/docs/rules/common/avoid-not-assignable-collection-types/"><code>avoid-not-assignable-collection-types</code></a><a href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/#avoid-not-assignable-collection-types" class="hash-link" aria-label="Direct link to avoid-not-assignable-collection-types" title="Direct link to avoid-not-assignable-collection-types" translate="no">​</a></h3>
<p>Warns when a collection with non-nullable elements is passed to a parameter that accepts a collection with nullable elements and which is mutated within the function/method body.</p>
<p>Adding an element to such a parameter will throw a runtime exception if the element is equal <code>null</code>.</p>
<p>To address this issue, try changing the collection to accept nullable values or make the parameter type to accept only non-nullable elements.</p>
<p>By default triggers on the following methods: <code>add</code>, <code>addAll</code>, <code>addEntries</code>, <code>insert</code>, <code>insertAll</code>, <code>fillRange</code>, <code>putIfAbsent</code>, <code>replaceRange</code>, <code>setAll</code>, <code>setRange</code>, <code>update</code>, <code>updateAll</code>.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>This rule also supports the <code>@mutated</code> annotation and triggers for any annotated parameter of public functions/methods that has a type mismatch.</p><p>To use the <code>@mutated</code> annotation, install the <a href="https://github.com/CQLabs/dart-code-metrics-annotations.git" target="_blank" rel="noopener noreferrer" class="">dart-code-metrics-annotations</a> package.</p></div></div>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> conditionTargets </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: Passing a collection with non-nullable elements can lead to a runtime exception if the collection is updated with a null value inside the invocation.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Try changing the collection to accept nullable values or make the parameter type to accept only non-nullable elements.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token function" style="color:#87aff4">_extractConditionTargetsMap</span><span class="token punctuation" style="color:#a7dbf7">(</span><mark class="code-warning"><span class="token plain">conditionTargets</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> conditionTargets </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: Passing a collection with non-nullable elements can lead to a runtime exception if the collection is updated with a null value inside the invocation.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Try changing the collection to accept nullable values or make the parameter type to accept only non-nullable elements.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token function" style="color:#87aff4">_extractConditionTargets</span><span class="token punctuation" style="color:#a7dbf7">(</span><mark class="code-warning"><span class="token plain">conditionTargets</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_extractConditionTargetsMap</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Map</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> targets</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  targets</span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token string-literal string" style="color:#e1ffe4">'hello'</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_extractConditionTargets</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Set</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> targets</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  targets</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">add</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> conditionTargets </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token function" style="color:#87aff4">_extractConditionTargetsMap</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">conditionTargets</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> conditionTargets </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// Now nullable</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token function" style="color:#87aff4">_extractConditionTargets</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">conditionTargets</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> conditionTargets </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token function" style="color:#87aff4">_notMutated</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">conditionTargets</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// Not mutated within the body of the function</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// Now accepts only non-nullable values</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_extractConditionTargetsMap</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Map</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> targets</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  targets</span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token string-literal string" style="color:#e1ffe4">'hello'</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'there'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_extractConditionTargets</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Set</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> targets</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  targets</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">add</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_notMutated</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Set</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> target</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">targets</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">contains</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'value'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-mutating-constant-collections"><a class="" href="https://dcm.dev/docs/rules/common/avoid-mutating-constant-collections/"><code>avoid-mutating-constant-collections</code></a><a href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/#avoid-mutating-constant-collections" class="hash-link" aria-label="Direct link to avoid-mutating-constant-collections" title="Direct link to avoid-mutating-constant-collections" translate="no">​</a></h3>
<p>Warns when a constant collection is being mutated.</p>
<p>Trying to add/remove elements to a constant collection will throw a runtime exception.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> global </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">3</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">set</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">3</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> list </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">3</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// LINT: Avoid mutating constant collections.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">//  This invocation will throw a runtime exception.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    list</span><span class="token punctuation" style="color:#a7dbf7">.</span><mark class="code-warning"><span class="token function" style="color:#87aff4">add</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// LINT: Avoid mutating constant collections.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">//  This invocation will throw a runtime exception.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    global</span><span class="token punctuation" style="color:#a7dbf7">.</span><mark class="code-warning"><span class="token function" style="color:#87aff4">add</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// LINT: Avoid mutating constant collections.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">//  This invocation will throw a runtime exception.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">set</span><span class="token number" style="color:#8dec95">.</span><mark class="code-warning"><span class="token function" style="color:#87aff4">add</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">3</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">set</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">3</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// now mutable</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> list </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">3</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// now mutable</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    list</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">add</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">set</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">add</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">3</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-always-null-variables"><a class="" href="https://dcm.dev/docs/rules/common/avoid-always-null-variables/"><code>avoid-always-null-variables</code></a><a href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/#avoid-always-null-variables" class="hash-link" aria-label="Direct link to avoid-always-null-variables" title="Direct link to avoid-always-null-variables" translate="no">​</a></h3>
<p>Warns when a variable is always <code>null</code> in the current code branch.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">String</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> value</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> another</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">value </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// LINT: This variable is always null in the current code branch.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">//  Try replacing it with a different variable or a null literal.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><mark class="code-warning"><span class="token plain">value</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">value </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// LINT: This variable is always null in the current code branch.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">//  Try replacing it with a different variable or a null literal.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><mark class="code-warning"><span class="token plain">value</span></mark><span class="token plain"> </span><span class="token operator" style="color:#00bff9">?</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> another</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">value </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// LINT: This variable is always null in the current code branch.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">//  Try replacing it with a different variable or a null literal.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><mark class="code-warning"><span class="token plain">value</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">String</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> value</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> another</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">value </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">value </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">another</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">value </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-duplicate-field-initializers"><a class="" href="https://dcm.dev/docs/rules/common/avoid-duplicate-field-initializers/"><code>avoid-duplicate-field-initializers</code></a><a href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/#avoid-duplicate-field-initializers" class="hash-link" aria-label="Direct link to avoid-duplicate-field-initializers" title="Direct link to avoid-duplicate-field-initializers" translate="no">​</a></h3>
<p>Warns when a final field has the same initializer as another field in scope.</p>
<p>Fields with duplicate initializers are either the result of a typo or are redundant and can be simply removed.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Some</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> value </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'hello'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: This field has the same initializer as 'value'.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Try changing the initializer or reusing the existing field.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><mark class="code-warning"><span class="token plain">another</span></mark><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'hello'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Primary</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> val</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> another </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> val</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: This field has the same initializer as 'another'.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Try changing the initializer or reusing the existing field.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><mark class="code-warning"><span class="token plain">third</span></mark><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> val</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> computed </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> val </span><span class="token operator" style="color:#00bff9">+</span><span class="token plain"> val</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: This field has the same initializer as 'computed'.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Try changing the initializer or reusing the existing field.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><mark class="code-warning"><span class="token plain">anotherComputed</span></mark><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> val </span><span class="token operator" style="color:#00bff9">+</span><span class="token plain"> val</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Some</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> value </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'hello'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> another </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'world'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Primary</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> val</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> another </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> val</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> computed </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> val </span><span class="token operator" style="color:#00bff9">+</span><span class="token plain"> val</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prefer-unmodifiable-of"><a class="" href="https://dcm.dev/docs/rules/common/prefer-unmodifiable-of/"><code>prefer-unmodifiable-of</code></a><a href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/#prefer-unmodifiable-of" class="hash-link" aria-label="Direct link to prefer-unmodifiable-of" title="Direct link to prefer-unmodifiable-of" translate="no">​</a></h3>
<p>Suggests using <code>.unmodifiableOf()</code> instead of <code>.unmodifiable()</code>.</p>
<p><code>.unmodifiableOf()</code> constructors have slightly better typings and accept a generic type instead of <code>dynamic</code>.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> array </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">3</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">4</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">5</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">6</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">7</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">8</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">9</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// LINT: Prefer '.unmodifiableOf' instead of 'unmodifiable'.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> copy </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token number" style="color:#8dec95">.</span><mark class="code-warning"><span class="token function" style="color:#87aff4">unmodifiable</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">array</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// LINT: Prefer '.unmodifiableOf' instead of 'unmodifiable'.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> numList </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">num</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token number" style="color:#8dec95">.</span><mark class="code-warning"><span class="token function" style="color:#87aff4">unmodifiable</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">array</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> map </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token string-literal string" style="color:#e1ffe4">"hi"</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// LINT: Prefer '.unmodifiableOf' instead of 'unmodifiable'.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> copy </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Map</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token number" style="color:#8dec95">.</span><mark class="code-warning"><span class="token function" style="color:#87aff4">unmodifiable</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">map</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// LINT: Prefer '.unmodifiableOf' instead of 'unmodifiable'.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> numMap </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Map</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">num</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token number" style="color:#8dec95">.</span><mark class="code-warning"><span class="token function" style="color:#87aff4">unmodifiable</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">map</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> array </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">3</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">4</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">5</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">6</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">7</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">8</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">9</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> copy </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">unmodifiableOf</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">array</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> numList </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">num</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">unmodifiableOf</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">array</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> map </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token string-literal string" style="color:#e1ffe4">"hi"</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> copy </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Map</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">unmodifiableOf</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">map</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> numMap </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Map</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">num</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">unmodifiableOf</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">map</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>This rule also comes with <strong>auto-fix</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prefer-correct-mutated"><a class="" href="https://dcm.dev/docs/rules/common/prefer-correct-mutated/"><code>prefer-correct-mutated</code></a><a href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/#prefer-correct-mutated" class="hash-link" aria-label="Direct link to prefer-correct-mutated" title="Direct link to prefer-correct-mutated" translate="no">​</a></h3>
<p>Warns when a parameter of the collection type (e.g. <code>List</code> or <code>Set</code>) is missing or has an unnecessary <code>@mutated</code> annotation.</p>
<p><code>@mutated</code> is used to indicated parameters that are being mutated within the function/method body (e.g. <code>.add(element)</code>).</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>To use the <code>@mutated</code> annotation, install the <a href="https://github.com/CQLabs/dart-code-metrics-annotations.git" target="_blank" rel="noopener noreferrer" class="">dart-code-metrics-annotations</a> package.</p><p>This annotation is used by <code>avoid-mutating-parameters</code>, <code>avoid-collection-mutating-methods</code> and <code>avoid-not-assignable-collection-types</code> rules.</p></div></div>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// LINT: This parameter is mutated, but is not annotated with @mutated.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">//  Try adding the annotation.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_extractConditionTargetsMap</span><span class="token punctuation" style="color:#a7dbf7">(</span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">Map</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> targets</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  targets</span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token string-literal string" style="color:#e1ffe4">'23'</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// LINT: This parameter is mutated, but is not annotated with @mutated.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">//  Try adding the annotation.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_extractConditionTargets</span><span class="token punctuation" style="color:#a7dbf7">(</span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">Set</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> targets</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  targets</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">add</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// LINT: This parameter is annotated with @mutated, but is not mutated or passed to a @mutated argument.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">//  Try removing the annotation.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_withAnnotation</span><span class="token punctuation" style="color:#a7dbf7">(</span><mark class="code-warning"><span class="token metadata function" style="color:#87aff4">@mutated</span></mark><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Set</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> targets</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">targets</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_extractConditionTargetsMap</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token metadata function" style="color:#87aff4">@mutated</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Map</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> targets</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  targets</span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token string-literal string" style="color:#e1ffe4">'23'</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_extractConditionTargets</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token metadata function" style="color:#87aff4">@mutated</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Set</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> targets</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  targets</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">add</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_withAnnotation</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Set</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> targets</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">targets</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>This rule also comes with <strong>auto-fix</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="use-existing-widget"><a class="" href="https://dcm.dev/docs/rules/flutter/use-existing-widget/"><code>use-existing-widget</code></a><a href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/#use-existing-widget" class="hash-link" aria-label="Direct link to use-existing-widget" title="Direct link to use-existing-widget" translate="no">​</a></h3>
<p>Warns when the sequence of widgets matches one of the configured sequences and should be replaced with another existing widget.</p>
<blockquote>
<p>This rule requires configuration in order to highlight any issues.</p>
</blockquote>
<p>For example,</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">analysis_options.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">rules</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">use-existing-widget</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">entries</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">sequence</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">'MyWidget &gt; AnotherWidget &gt; title: ThirdWidget'</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">            </span><span class="token key atrule" style="color:#6dbdfa">replacement</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">'SomeOtherWidget'</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">sequence</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">'MyWidget &gt; any: AnotherWidget'</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">            </span><span class="token key atrule" style="color:#6dbdfa">replacement</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">'SomeWidget'</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">sequence</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">'MyWidget &gt; OtherWidget'</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">            </span><span class="token key atrule" style="color:#6dbdfa">replacement</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">'SomeWidget'</span></span><br></span></code></pre></div></div>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// LINT: This sequence of widgets (MyWidget &gt; child: AnotherWidget &gt; title: ThirdWidget) can be replaced with a single 'SomeOtherWidget' widget.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">MyWidget</span></mark><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AnotherWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">title</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ThirdWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">another</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token class-name" style="color:#7fdbca">SomeOtherWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prefer-icon-button-tooltip"><a class="" href="https://dcm.dev/docs/rules/flutter/prefer-icon-button-tooltip/"><code>prefer-icon-button-tooltip</code></a><a href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/#prefer-icon-button-tooltip" class="hash-link" aria-label="Direct link to prefer-icon-button-tooltip" title="Direct link to prefer-icon-button-tooltip" translate="no">​</a></h3>
<p>Warns when <code>IconButton</code> does not pass the <code>tooltip</code> argument.</p>
<p>Without a <code>tooltip</code>, screen readers like VoiceOver or TalkBack announce only <em>"Button"</em> or read out an unhelpful internal icon glyph code (e.g. <em>"e14c, button"</em>).</p>
<p>This violates WCAG SC 4.1.2 because the control lacks an accessible name, rendering the button unusable for blind or low-vision users.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// LINT: Tooltip is not specified.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">//  Try adding it or wrapping this widget into 'ExcludeSemantics'.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">IconButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// LINT: Tooltip is not specified.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">//  Try adding it or wrapping this widget into 'ExcludeSemantics'.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">IconButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">tooltip</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">''</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token class-name" style="color:#7fdbca">IconButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">tooltip</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'some tooltip'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">ExcludeSemantics</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">IconButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>This rule also comes with <strong>auto-fix</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-redundant-semantics-wrapper"><a class="" href="https://dcm.dev/docs/rules/flutter/avoid-redundant-semantics-wrapper/"><code>avoid-redundant-semantics-wrapper</code></a><a href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/#avoid-redundant-semantics-wrapper" class="hash-link" aria-label="Direct link to avoid-redundant-semantics-wrapper" title="Direct link to avoid-redundant-semantics-wrapper" translate="no">​</a></h3>
<p>Warns when the child widget of <code>Semantics</code> already registers its own semantic node.</p>
<p>Standard Material widgets (<code>ElevatedButton</code>, <code>TextButton</code>, <code>OutlinedButton</code>, <code>IconButton</code>) natively register their own semantics nodes and button role flags.</p>
<p>Wrapping them in an outer <code>Semantics(button: true, label: ...)</code> duplicates accessibility metadata, generating double announcements or conflicting focus nodes.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// LINT: The child widget already registers its own semantic node, adding 'Semantics' will cause duplicate announcements.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">//  Try removing this widget.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">Semantics</span></mark><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ElevatedButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// LINT: The child widget already registers its own semantic node, adding 'Semantics' will cause duplicate announcements.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">//  Try removing this widget.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">Semantics</span></mark><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> flag </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ElevatedButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ElevatedButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// LINT: The child widget already registers its own semantic node, adding 'Semantics' will cause duplicate announcements.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">//  Try removing this widget.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">Semantics</span></mark><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> nullable </span><span class="token operator" style="color:#00bff9">?</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ElevatedButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token class-name" style="color:#7fdbca">ElevatedButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Semantics</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">WidgetWithoutItsSemantics</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>This rule also comes with <strong>auto-fix</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prefer-localized-semantic-labels"><a class="" href="https://dcm.dev/docs/rules/flutter/prefer-localized-semantic-labels/"><code>prefer-localized-semantic-labels</code></a><a href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/#prefer-localized-semantic-labels" class="hash-link" aria-label="Direct link to prefer-localized-semantic-labels" title="Direct link to prefer-localized-semantic-labels" translate="no">​</a></h3>
<p>Warns when a string literal is passed to accessibility-related parameters (<code>label:</code>, <code>tooltip:</code>, <code>semanticLabel:</code>, etc.).</p>
<p>By default checks only standard Flutter widgets (icons, images, buttons, progress indicators and <code>Semantics</code>).</p>
<p>Modern mobile apps support multiple locales and languages. When developers hardcode string literals for accessibility properties (e.g., <code>Semantics(label: 'Close dialog')</code> or <code>IconButton(tooltip: 'Delete')</code>), non-English users using localized interfaces will hear accessibility labels read out in English.</p>
<p>Furthermore, screen reader text-to-speech engines assigned to foreign languages (e.g. Polish or Spanish) will attempt to pronounce English words phonetically, producing unintelligible, distorted voice output for blind users.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// LINT: Provide a localized semantic label.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Semantics</span><span class="token punctuation" style="color:#a7dbf7">(</span><mark class="code-warning"><span class="token plain">label</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">''</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// LINT: Provide a localized semantic label.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Semantics</span><span class="token punctuation" style="color:#a7dbf7">(</span><mark class="code-warning"><span class="token plain">label</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Cancel'</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token class-name" style="color:#7fdbca">Semantics</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">label</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> someString</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// will be highlighted if `ignore-identifiers` is `false`</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Semantics</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">label</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">l10n</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Semantics</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">label</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AppLocalizations</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">of</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">label</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="provide-progress-indicator-semantics"><a class="" href="https://dcm.dev/docs/rules/flutter/provide-progress-indicator-semantics/"><code>provide-progress-indicator-semantics</code></a><a href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/#provide-progress-indicator-semantics" class="hash-link" aria-label="Direct link to provide-progress-indicator-semantics" title="Direct link to provide-progress-indicator-semantics" translate="no">​</a></h3>
<p>Warns when a progress indicator does not have a semantics label.</p>
<p>Standard Flutter loading indicators (<code>CircularProgressIndicator</code>, <code>LinearProgressIndicator</code>, <code>RefreshIndicator</code>) communicate progress or active background processing visually.</p>
<p>Without a <code>semanticsLabel</code>, the indicator is completely excluded from the semantics tree on iOS, rendering the loading state completely invisible to VoiceOver.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// LINT: Provide a non-empty semantics label to progress indicators.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">CircularProgressIndicator</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// LINT: Provide a non-empty semantics label to progress indicators.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">LinearProgressIndicator</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token class-name" style="color:#7fdbca">CircularProgressIndicator</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">semanticsLabel</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'some label'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">LinearProgressIndicator</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">semanticsLabel</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'some label'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>This rule also comes with <strong>auto-fix</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-focusable-offstage"><a class="" href="https://dcm.dev/docs/rules/flutter/avoid-focusable-offstage/"><code>avoid-focusable-offstage</code></a><a href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/#avoid-focusable-offstage" class="hash-link" aria-label="Direct link to avoid-focusable-offstage" title="Direct link to avoid-focusable-offstage" translate="no">​</a></h3>
<p>Warns when the child of <code>Offstage</code> widget is focusable.</p>
<p><code>Offstage</code> is a widget that lays the child out as if it was in the tree, but without painting anything, without making the child available for hit testing, and without taking any room in the parent.</p>
<p>However, <code>Offstage</code> children are still active: <strong>they can receive focus and have keyboard input directed to them</strong>.</p>
<p>To avoid the child to be focusable, wrap it with the <code>ExcludeFocus</code> widget.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// LINT: The child widget can still receive focus even if it is not visible.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">//  Try wrapping the child widget with 'ExcludeFocus'.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">Offstage</span></mark><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextFormField</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token class-name" style="color:#7fdbca">Offstage</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ExcludeFocus</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextFormField</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="provide-input-field-label"><a class="" href="https://dcm.dev/docs/rules/flutter/provide-input-field-label/"><code>provide-input-field-label</code></a><a href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/#provide-input-field-label" class="hash-link" aria-label="Direct link to provide-input-field-label" title="Direct link to provide-input-field-label" translate="no">​</a></h3>
<p>Warns when <code>TextField</code>, <code>TextFormField</code>, or <code>CupertinoTextField</code> do not provide a <code>decoration: InputDecoration(labelText: ...)</code>, a <code>label</code> widget, or have a <code>Semantics</code> wrapper with the label.</p>
<p>Text input fields in Flutter frequently use <code>hintText</code> or inline placeholder text without specifying a permanent <code>labelText</code> or wrapping in a <code>Semantics(label: ...)</code> widget.</p>
<p>When input fields lose focus or contain user-entered text, VoiceOver and TalkBack may read only the entered text without announcing the field's purpose.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// LINT: Provide a label to input fields.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">//  Try passing 'labelText' or 'label' or wrapping this widget with 'Semantics'.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">TextField</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// LINT: Provide a label to input fields.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">//  Try passing 'labelText' or 'label' or wrapping this widget with 'Semantics'.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">TextField</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">decoration</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">InputDecoration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// LINT: Provide a label to input fields.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">//  Try passing 'labelText' or 'label' or wrapping this widget with 'Semantics'.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">TextFormField</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token class-name" style="color:#7fdbca">TextField</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">decoration</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">InputDecoration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">label</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'some label'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">TextField</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">decoration</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">InputDecoration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">labelText</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'some label'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Semantics</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">label</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'some label'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextField</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-merge-semantics-list-tile"><a class="" href="https://dcm.dev/docs/rules/flutter/avoid-merge-semantics-list-tile/"><code>avoid-merge-semantics-list-tile</code></a><a href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/#avoid-merge-semantics-list-tile" class="hash-link" aria-label="Direct link to avoid-merge-semantics-list-tile" title="Direct link to avoid-merge-semantics-list-tile" translate="no">​</a></h3>
<p>Warns when <code>MergeSemantics</code> has a <code>ListTile</code> or <code>CheckboxListTile</code> that defines a non-null <code>trailing</code> or <code>leading</code> argument.</p>
<p>Wrapping a <code>ListTile</code> inside <code>MergeSemantics</code> when the tile contains independent trailing/leading action buttons (e.g. a favorite button or delete icon button) collapses the entire tile into a single static text block.</p>
<p>This renders the secondary action buttons completely unclickable for screen reader users.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// LINT: Wrapping 'ListTile' inside 'MergeSemantics' makes action buttons completely unaccessible for screen reader users.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">//  Try removing this widget.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">MergeSemantics</span></mark><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ListTile</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">leading</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">IconButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// LINT: Wrapping 'ListTile' inside 'MergeSemantics' makes action buttons completely unaccessible for screen reader users.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">//  Try removing this widget.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">MergeSemantics</span></mark><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ListTile</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">trailing</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">IconButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token class-name" style="color:#7fdbca">ListTile</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">leading</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">IconButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">ListTile</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">trailing</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">IconButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>This rule also comes with <strong>auto-fix</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="provide-slider-semantic-formatter"><a class="" href="https://dcm.dev/docs/rules/flutter/provide-slider-semantic-formatter/"><code>provide-slider-semantic-formatter</code></a><a href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/#provide-slider-semantic-formatter" class="hash-link" aria-label="Direct link to provide-slider-semantic-formatter" title="Direct link to provide-slider-semantic-formatter" translate="no">​</a></h3>
<p>Warns when a slider widget does not pass the <code>semanticFormatterCallback</code> argument.</p>
<p>Standard Flutter <code>Slider</code> controls operate on numeric double values. When a slider represents a non-percentage value (like a dollar amount), Flutter’s default semantic formatter announces it as a percentage (e.g. "50%").</p>
<p>This default percentage announcement is highly misleading for screen reader users when adjusting values meant to represent prices, volume, or specific counts.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// LINT: Prefer providing a semantic formatter callback to ensure correct announcement.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">Slider</span></mark><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1000.0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// LINT: Prefer providing a semantic formatter callback to ensure correct announcement.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">RangeSlider</span></mark><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1000.0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token class-name" style="color:#7fdbca">Slider</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  value</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1000.0</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  semanticFormatterCallback</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">val</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'$</span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">${</span><span class="token string-literal interpolation expression">val</span><span class="token string-literal interpolation expression punctuation" style="color:#a7dbf7">.</span><span class="token string-literal interpolation expression function" style="color:#87aff4">round</span><span class="token string-literal interpolation expression punctuation" style="color:#a7dbf7">(</span><span class="token string-literal interpolation expression punctuation" style="color:#a7dbf7">)</span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">}</span><span class="token string-literal string" style="color:#e1ffe4"> dollars'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>This rule also comes with <strong>auto-fix</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="provide-icon-semantic-label"><a class="" href="https://dcm.dev/docs/rules/flutter/provide-icon-semantic-label/"><code>provide-icon-semantic-label</code></a><a href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/#provide-icon-semantic-label" class="hash-link" aria-label="Direct link to provide-icon-semantic-label" title="Direct link to provide-icon-semantic-label" translate="no">​</a></h3>
<p>Warns when <code>Icon</code> does not have a <code>semanticLabel</code>.</p>
<p>When developers use standalone <code>Icon</code> widgets (e.g. <code>Icon(Icons.star)</code>) as visual indicators without text, omitting the <code>semanticLabel</code> causes Flutter to exclude the icon from the semantics tree entirely.</p>
<p>This renders meaningful visual icons completely invisible to screen readers like VoiceOver.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// LINT: Provide a semantic label to icons.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">Icon</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// LINT: Provide a semantic label to icons.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">ImageIcon</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token class-name" style="color:#7fdbca">Icon</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">semanticLabel</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'some label'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">ExcludeSemantics</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Icon</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>This rule also comes with <strong>auto-fix</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="provide-autofill-hints"><a class="" href="https://dcm.dev/docs/rules/flutter/provide-autofill-hints/"><code>provide-autofill-hints</code></a><a href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/#provide-autofill-hints" class="hash-link" aria-label="Direct link to provide-autofill-hints" title="Direct link to provide-autofill-hints" translate="no">​</a></h3>
<p>Warns when <code>TextField</code>, <code>TextFormField</code> or <code>CupertinoTextField</code> does not pass the <code>autofillHints</code> argument.</p>
<p>Omitting <code>autofillHints</code> in Flutter prevents password managers and assistive system autofill tools from assisting users with motor or cognitive disabilities.</p>
<p>WCAG 2.1 Criterion 1.3.5 requires identifying input purpose programmatically for personal data inputs (email, password, phone, postal address).</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// LINT: Autofill hints are not specified. Try passing them.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">TextField</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// LINT: Autofill hints are not specified. Try passing them.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">TextFormField</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token class-name" style="color:#7fdbca">TextField</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">autofillHints</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// correct, does not need a hint</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">TextField</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">autofillHints</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token class-name" style="color:#7fdbca">AutofillHints</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">email</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>This rule also comes with <strong>auto-fix</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prefer-semantics-header"><a class="" href="https://dcm.dev/docs/rules/flutter/prefer-semantics-header/"><code>prefer-semantics-header</code></a><a href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/#prefer-semantics-header" class="hash-link" aria-label="Direct link to prefer-semantics-header" title="Direct link to prefer-semantics-header" translate="no">​</a></h3>
<p>Warns when the <code>AppBar</code> title is not wrapped into <code>Semantics</code> widget.</p>
<p>Screen reader users frequently navigate mobile applications by heading landmarks (swiping up/down with rotor/heading gesture).</p>
<p>In Flutter, standard <code>Text</code> widgets—even when styled as large titles (<code>Theme.of(context).textTheme.headlineLarge</code>)—are not marked as headings in the Accessibility Tree unless explicitly wrapped in <code>Semantics(header: true)</code>.</p>
<p>Without header metadata, users cannot skip past navigation elements to jump directly to page content.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// LINT: Prefer adding header semantics to top-level screen titles.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">//  Try wrapping this widget with 'Semantics'.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">AppBar</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">title</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><mark class="code-warning"><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Account Settings'</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// LINT: Prefer adding header semantics to top-level screen titles.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">//  Try wrapping this widget with 'Semantics'.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">AppBar</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">title</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><mark class="code-warning"><span class="token plain">nullable </span><span class="token operator" style="color:#00bff9">?</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Account Settings'</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// LINT: Prefer adding header semantics to top-level screen titles.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">//  Try wrapping this widget with 'Semantics'.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">AppBar</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">title</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><mark class="code-warning"><span class="token plain">title</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token class-name" style="color:#7fdbca">AppBar</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">title</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Semantics</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">header</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Account Settings'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">AppBar</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">title</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Semantics</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">header</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> title</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>This rule also comes with <strong>auto-fix</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-nested-interactive-semantics"><a class="" href="https://dcm.dev/docs/rules/flutter/avoid-nested-interactive-semantics/"><code>avoid-nested-interactive-semantics</code></a><a href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/#avoid-nested-interactive-semantics" class="hash-link" aria-label="Direct link to avoid-nested-interactive-semantics" title="Direct link to avoid-nested-interactive-semantics" translate="no">​</a></h3>
<p>Warns when an interactive widget is a descendant of another interactive widget. By default checks only standard Flutter widgets.</p>
<p>Nesting interactive controls inside each other (e.g. an <code>IconButton</code> inside an <code>InkWell</code> card) produces conflicting accessibility nodes in VoiceOver and TalkBack.</p>
<p>Screen readers cannot determine which tap action target should take priority, causing screen readers to skip secondary buttons or trigger unexpected taps.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// LINT: Avoid nesting interactive widgets inside each other.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">//  Try moving this widget out.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">IconButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">Checkbox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// LINT: Avoid nesting interactive widgets inside each other.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">//  Try moving this widget out.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Checkbox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">IconButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token class-name" style="color:#7fdbca">Checkbox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">IconButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prefer-haptic-feedback-on-interaction"><a class="" href="https://dcm.dev/docs/rules/flutter/prefer-haptic-feedback-on-interaction/"><code>prefer-haptic-feedback-on-interaction</code></a><a href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/#prefer-haptic-feedback-on-interaction" class="hash-link" aria-label="Direct link to prefer-haptic-feedback-on-interaction" title="Direct link to prefer-haptic-feedback-on-interaction" translate="no">​</a></h3>
<p>Warns when a <code>GestureDetector</code> or <code>InkWell</code> <code>onTap</code> callback does not invoke <code>HapticFeedback</code>.</p>
<p>For blind, low-vision, or neurodivergent users, physical tactile response (vibration/haptics) provides essential non-visual confirmation that a touch gesture or button press was successfully registered by the OS.</p>
<p>Custom gesture targets (<code>GestureDetector</code>, <code>InkWell</code>) often omit <code>HapticFeedback.vibrate()</code> or <code>HapticFeedback.selectionClick()</code> calls in their callback blocks.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyWidget</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Function</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> callback</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">callback</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// LINT: Prefer calling one of HapticFeedback methods to provide non-visual confirmation that a tap was successfully registered by the OS.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">GestureDetector</span><span class="token punctuation" style="color:#a7dbf7">(</span><mark class="code-warning"><span class="token plain">onTap</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> callback</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">GestureDetector</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token comment" style="color:#999999">// LINT: Prefer calling one of HapticFeedback methods to provide non-visual confirmation that a tap was successfully registered by the OS.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><mark class="code-warning"><span class="token plain">onTap</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span></mark><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><mark class="code-warning"><span class="token function" style="color:#87aff4">callback</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></mark><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><mark class="code-warning"><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span></mark><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyWidget</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Function</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> callback</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">callback</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">GestureDetector</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      onTap</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token class-name" style="color:#7fdbca">HapticFeedback</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">vibrate</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token function" style="color:#87aff4">callback</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">GestureDetector</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">onTap</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_withHaptic</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_withHaptic</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">HapticFeedback</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">vibrate</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="specify-unknown-enum-value"><a class="" href="https://dcm.dev/docs/rules/json-serializable/specify-unknown-enum-value/"><code>specify-unknown-enum-value</code></a><a href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/#specify-unknown-enum-value" class="hash-link" aria-label="Direct link to specify-unknown-enum-value" title="Direct link to specify-unknown-enum-value" translate="no">​</a></h3>
<p>Warns when a field of the <code>Enum</code> type does not specify <code>unknownEnumValue</code>.</p>
<p>Specifying <code>unknownEnumValue</code> ensures backward compatibility if the enum values change. Not providing it can lead to runtime exceptions for older app versions if it relies on the same API.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token metadata function" style="color:#87aff4">@JsonSerializable</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyEntity</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: Fields of the Enum type must specify 'unknownEnumValue' to simplify backward compatibility.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Try adding '@JsonKey' with 'unknownEnumValue'.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><mark class="code-warning"><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyEnum</span><span class="token plain"> myEnum</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@JsonSerializable</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyEntity</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: Fields of the Enum type must specify 'unknownEnumValue' to simplify backward compatibility.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Try adding '@JsonKey' with 'unknownEnumValue'.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><mark class="code-warning"><span class="token metadata function" style="color:#87aff4">@JsonKey</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyEnum</span><span class="token plain"> myEnum</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token metadata function" style="color:#87aff4">@JsonSerializable</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyEntity</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@JsonKey</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">unknownEnumValue</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyEnum</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">a</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyEnum</span><span class="token plain"> myEnum</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@JsonSerializable</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyEntity</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@JsonKey</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">unknownEnumValue</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">JsonKey</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">nullForUndefinedEnumValue</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyEnum</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> myEnum</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What’s next<a href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/#whats-next" class="hash-link" aria-label="Direct link to What’s next" title="Direct link to What’s next" translate="no">​</a></h2>
<p>To learn more about upcoming features, keep an eye on our <a href="https://dcm.featurebase.app/roadmap" target="_blank" rel="noopener noreferrer" class="">public roadmap</a>.</p>
<p>And to learn more about our upcoming videos and "Rules of the Week" content, subscribe to our <a href="https://www.youtube.com/@DCMAnalyzer" target="_blank" rel="noopener noreferrer" class="">Youtube Channel</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sharing-your-feedback">Sharing your feedback<a href="https://dcm.dev/blog/2026/08/24/whats-new-in-dcm-1-39-0/#sharing-your-feedback" class="hash-link" aria-label="Direct link to Sharing your feedback" title="Direct link to Sharing your feedback" translate="no">​</a></h2>
<p>If there is something you miss from DCM right now, want us to make something better, or have any general feedback — <a href="https://discord.gg/Vzjprgk4sb" target="_blank" rel="noopener noreferrer" class="">join our Discord server</a>! We’d love to hear from you.</p>]]></content>
        <author>
            <name>Dmitry Zhifarsky</name>
            <uri>https://dcm.dev</uri>
        </author>
        <category label="product-update" term="product-update"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[What’s new in DCM 1.38.0]]></title>
        <id>https://dcm.dev/blog/2026/06/22/whats-new-in-dcm-1-38-0/</id>
        <link href="https://dcm.dev/blog/2026/06/22/whats-new-in-dcm-1-38-0/"/>
        <updated>2026-06-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release includes 14 new rules; new config option to disable fixes for a particular rule; new single-line per-violation output format for Console reporter; global version constraint configuration via DCM Teams Console; support for converting fields to private named parameters for "dcm fix --type=unnecessarily-public-code" (only for Dart 3.12+); and other improvements!]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="Cover" src="https://dcm.dev/assets/images/2026-06-22-cover-7932b033327e33ccf6ee120cc22ddd6a.jpg" width="1400" height="736" class="img_ev3q"></p>
<p>Today we’re excited to announce the release of DCM 1.38.0!</p>
<p>This release includes 14 new rules; new config option to disable fixes for a particular rule; new single-line per-violation output format for Console reporter; global version constraint configuration via DCM Teams Console; support for converting fields to private named parameters for "dcm fix --type=unnecessarily-public-code" (only for Dart 3.12+); and other improvements! 🚀</p>
<p>Let’s go through the highlights of this release (and the full list of changes is <a class="" href="https://dcm.dev/changelog/#1.38.0">in our changelog</a>)!</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="global-version-constraint">Global Version Constraint<a href="https://dcm.dev/blog/2026/06/22/whats-new-in-dcm-1-38-0/#global-version-constraint" class="hash-link" aria-label="Direct link to Global Version Constraint" title="Direct link to Global Version Constraint" translate="no">​</a></h2>
<p>While there are several options to keep the installed DCM version in sync (for example, by introducing a global configuration file with the constraint), it still remains one of the challenging parts.</p>
<p>That's why this release adds a new way to configure the global version constrain via the DCM Console:</p>
<p><img decoding="async" loading="lazy" alt="Change Version Constraint" src="https://dcm.dev/assets/images/settings-86d7ec37ab6f6346ec3a9ad4fa4e0157.webp" width="2560" height="1500" class="img_ev3q"></p>
<p>This version constraint is different from the one configured via <a class="" href="https://dcm.dev/docs/configuration/global-configuration/"><code>dcm_global.yaml</code></a> (which needs to be configured for each project separately) and it applies to all users. If both <code>dcm_global.yaml</code> and this constraint are present, the latter gets the priority.</p>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>Global version constraint is available only for DCM 1.38.0+.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dashboards-improvements">Dashboards Improvements<a href="https://dcm.dev/blog/2026/06/22/whats-new-in-dcm-1-38-0/#dashboards-improvements" class="hash-link" aria-label="Direct link to Dashboards Improvements" title="Direct link to Dashboards Improvements" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="persistent-selected-intervals-and-groups">Persistent Selected Intervals and Groups<a href="https://dcm.dev/blog/2026/06/22/whats-new-in-dcm-1-38-0/#persistent-selected-intervals-and-groups" class="hash-link" aria-label="Direct link to Persistent Selected Intervals and Groups" title="Direct link to Persistent Selected Intervals and Groups" translate="no">​</a></h3>
<p>To help you keep the charts exactly as you left them, selected intervals and groups are now remembered after a page reload:</p>
<video width="100%" controls="" autoplay="" loop="" playsinline=""><source src="/video/persistent-selected-intervals.mp4"></video>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="persistent-selected-metric-segments">Persistent Selected Metric Segments<a href="https://dcm.dev/blog/2026/06/22/whats-new-in-dcm-1-38-0/#persistent-selected-metric-segments" class="hash-link" aria-label="Direct link to Persistent Selected Metric Segments" title="Direct link to Persistent Selected Metric Segments" translate="no">​</a></h3>
<p>And the same for selected metric segments:</p>
<video width="100%" controls="" autoplay="" loop="" playsinline=""><source src="/video/persistent-selected-metrics.mp4"></video>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="hiding-selected-categories-from-charts">Hiding Selected Categories from Charts<a href="https://dcm.dev/blog/2026/06/22/whats-new-in-dcm-1-38-0/#hiding-selected-categories-from-charts" class="hash-link" aria-label="Direct link to Hiding Selected Categories from Charts" title="Direct link to Hiding Selected Categories from Charts" translate="no">​</a></h3>
<p>To make it easier to filter out information when working with charts, charts with multiple groups/categories now support hiding selected categories by clicking on the category name:</p>
<video width="100%" controls="" autoplay="" loop="" playsinline=""><source src="/video/hiding-selected-issues-over-time.mp4"></video>
<p>And the same can be done with the overview pie chart:</p>
<video width="100%" controls="" autoplay="" loop="" playsinline=""><source src="/video/hiding-selected-issues-overview.mp4"></video>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="concise-console-output-format">Concise Console Output Format<a href="https://dcm.dev/blog/2026/06/22/whats-new-in-dcm-1-38-0/#concise-console-output-format" class="hash-link" aria-label="Direct link to Concise Console Output Format" title="Direct link to Concise Console Output Format" translate="no">​</a></h2>
<p>As we are continuing to improve the user experience, we are excited to introduce a new simplified output format for Console reporter!</p>
<p>While the old format provides all necessary information (including <code>severity</code>, <code>location</code>, <code>description</code>, <code>rule name</code> and a <code>link</code> to the docs), its primary downside is it makes harder to work with many issues as each console entry takes a lot of space (plus, if you are feeding the output to LLMs, it's kinda verbose).</p>
<p>To address that, the new concise output includes only the <code>location</code> and the <code>description</code>:</p>
<p><img decoding="async" loading="lazy" alt="Console Concise" src="https://dcm.dev/assets/images/analyze-concise-console-report-5316dcf9a051c4b9fa70e806899fa324.webp" width="2100" height="530" class="img_ev3q"></p>
<p>To try it out, pass <code>--concise</code> (or just <code>-c</code>) when calling any command.</p>
<p>Additionally, when passed to <code>dcm run</code>, there will be no separate sections for each command passed (e.g. <code>Analyze results:</code>, <code>Unused code results:</code>), but instead all issues will be in one sorted list:</p>
<p><img decoding="async" loading="lazy" alt="Console Concise" src="https://dcm.dev/assets/images/run-concise-console-report-c1af33004355f025b24f1c9c59e7938d.webp" width="2100" height="630" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-config-to-disabled-fixes">New Config to Disabled Fixes<a href="https://dcm.dev/blog/2026/06/22/whats-new-in-dcm-1-38-0/#new-config-to-disabled-fixes" class="hash-link" aria-label="Direct link to New Config to Disabled Fixes" title="Direct link to New Config to Disabled Fixes" translate="no">​</a></h2>
<p>To make the usage of IDE and CLI fixes even more flexible, with this release all rules now support a new config entry <code>suggest-fixes</code> that allows you to disable fixes on a per-rule basis.</p>
<p>For example,</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">analysis_options.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">rules</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">newline-before-return</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">suggest-fixes</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#8dec95">false</span></span><br></span></code></pre></div></div>
<p>will disable fixes for <code>newline-before-return</code> for both <code>dcm fix</code> and the IDE extensions.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="auto-fixable-issues-in-the-html-report">Auto-fixable Issues in the HTML Report<a href="https://dcm.dev/blog/2026/06/22/whats-new-in-dcm-1-38-0/#auto-fixable-issues-in-the-html-report" class="hash-link" aria-label="Direct link to Auto-fixable Issues in the HTML Report" title="Direct link to Auto-fixable Issues in the HTML Report" translate="no">​</a></h2>
<p>If you prefer working with HTML reports, in this release the HTML report for <code>dcm analyze</code> now also includes the number of auto-fixable issues to help you know how many issues can be quickly address with running <code>dcm fix</code>.</p>
<p><img decoding="async" loading="lazy" alt="HTML" src="https://dcm.dev/assets/images/analyze-html-report-with-fixes-718253ea6f9f09b1ba820b35edb2fd53.png" width="2714" height="1918" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-rules">New Rules<a href="https://dcm.dev/blog/2026/06/22/whats-new-in-dcm-1-38-0/#new-rules" class="hash-link" aria-label="Direct link to New Rules" title="Direct link to New Rules" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p><strong>Discovering and Adding Rules from New Releases</strong></p><p>Each DCM release introduces new rules. To explore all available rules and filter by version, use the <a class="" href="https://dcm.dev/docs/cli/init/#lints-preview"><code>dcm init lints-preview</code></a> command:</p><div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token builtin class-name" style="color:#7fdbca">dcm</span><span class="token plain"> init lints-preview </span><span class="token function" style="color:#87aff4">lib</span><span class="token plain"> --rule-version=1.38.0  </span><span class="token comment" style="color:#999999"># Show rules added in 1.38.0</span><br></span></code></pre></div></div><p>This command displays:</p><ul>
<li class="">Rule names and their violations in your codebase</li>
<li class="">Estimated effort to fix all violations of each rule</li>
<li class="">Whether a rule supports automatic fixes</li>
</ul><p>You can also generate the output in different formats.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-duplicate-factories"><a class="" href="https://dcm.dev/docs/rules/common/avoid-duplicate-factories/"><code>avoid-duplicate-factories</code></a><a href="https://dcm.dev/blog/2026/06/22/whats-new-in-dcm-1-38-0/#avoid-duplicate-factories" class="hash-link" aria-label="Direct link to avoid-duplicate-factories" title="Direct link to avoid-duplicate-factories" translate="no">​</a></h3>
<p>Warns when a class has a factory constructor with the same implementation as another factory constructor.</p>
<blockquote>
<p>This rule does not take into account parameter/factory names and other insignificant details.</p>
</blockquote>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> data</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">factory</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">fromString</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> data</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">data</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: This factory constructor is a duplicate of SomeClass.fromString.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Try removing this factory or adding unique functionality.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><mark class="code-warning"><span class="token keyword" style="color:#00bff9">factory</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">parse</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> data</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">data</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AnotherClass</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">AnotherClass</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">factory</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AnotherClass</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">empty</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AnotherClass</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: This factory constructor is a duplicate of AnotherClass.empty.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Try removing this factory or adding unique functionality.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">factory</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AnotherClass</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">withData</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> data</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AnotherClass</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>here, <code>SomeClass.parse</code> has exactly the same implementation as <code>SomeClass.fromString</code> and <code>AnotherClass.withData</code> has exactly the same implementation as <code>AnotherClass.empty</code> (even though the number of parameters differs, it does not affect the body of the factory constructor).</p>
<p>To fix the issue, try either removing the duplicate factory or changing the implementation to be unique.</p>
<p>This rule also comes with <strong>auto-fix</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-unnecessary-factory"><a class="" href="https://dcm.dev/docs/rules/common/avoid-unnecessary-factory/"><code>avoid-unnecessary-factory</code></a><a href="https://dcm.dev/blog/2026/06/22/whats-new-in-dcm-1-38-0/#avoid-unnecessary-factory" class="hash-link" aria-label="Direct link to avoid-unnecessary-factory" title="Direct link to avoid-unnecessary-factory" translate="no">​</a></h3>
<p>Suggests converting a factory constructor to a regular constructor.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Point</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">double</span><span class="token plain"> x</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">double</span><span class="token plain"> y</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Point</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">_</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">x</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">y</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: This factory constructor can be a regular constructor.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Consider converting it to a regular constructor.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><mark class="code-warning"><span class="token keyword" style="color:#00bff9">factory</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Point</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">double</span><span class="token plain"> x</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">double</span><span class="token plain"> y</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span></mark><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><mark class="code-warning"><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Point</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">_</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">x</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> y</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></mark><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><mark class="code-warning"><span class="token punctuation" style="color:#a7dbf7">}</span></mark><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: This factory constructor can be a regular constructor.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Consider converting it to a regular constructor.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><mark class="code-warning"><span class="token keyword" style="color:#00bff9">factory</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Point</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">atOrigin</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Point</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">_</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></mark><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>in both cases, having a factory constructor is unnecessary and only adds more code.</p>
<p>To fix that, use a regular constructor instead:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Point</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">double</span><span class="token plain"> x</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">double</span><span class="token plain"> y</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Point</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">x</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">y</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Point</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">atOrigin</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> x </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> y </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-unmodified-loop-condition"><a class="" href="https://dcm.dev/docs/rules/common/avoid-unmodified-loop-condition/"><code>avoid-unmodified-loop-condition</code></a><a href="https://dcm.dev/blog/2026/06/22/whats-new-in-dcm-1-38-0/#avoid-unmodified-loop-condition" class="hash-link" aria-label="Direct link to avoid-unmodified-loop-condition" title="Direct link to avoid-unmodified-loop-condition" translate="no">​</a></h3>
<p>Warns when a loop condition is not modified within the loop.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> left</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> right</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: None of the local variables in this condition are modified within the loop.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Try checking for a potential mistake.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">while</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><mark class="code-warning"><span class="token plain">left</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">isNotEmpty</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">left</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  left </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">''</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: None of the local variables in this condition are modified within the loop.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Try checking for a potential mistake.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">while</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><mark class="code-warning"><span class="token plain">left </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> right</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">left</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>here, none of the variables used in loop conditions are modified within the loop which results in an endless loop.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prefer-private-named-parameters"><a class="" href="https://dcm.dev/docs/rules/common/prefer-private-named-parameters/"><code>prefer-private-named-parameters</code></a><a href="https://dcm.dev/blog/2026/06/22/whats-new-in-dcm-1-38-0/#prefer-private-named-parameters" class="hash-link" aria-label="Direct link to prefer-private-named-parameters" title="Direct link to prefer-private-named-parameters" translate="no">​</a></h3>
<p>Suggests using private named parameters instead of assigning to a private class field manually.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Point</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">double</span><span class="token plain"> _x</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: Prefer using private named parameters instead of assigning to the private field manually.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Point</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">double</span><span class="token plain"> x</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><mark class="code-warning"><span class="token plain">_x </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> x</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Point</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">double</span><span class="token plain"> _x</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Point</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">._</span><span class="token plain">x</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>This rule also comes with <strong>auto-fix</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prefer-initializing-formals"><a class="" href="https://dcm.dev/docs/rules/common/prefer-initializing-formals/"><code>prefer-initializing-formals</code></a><a href="https://dcm.dev/blog/2026/06/22/whats-new-in-dcm-1-38-0/#prefer-initializing-formals" class="hash-link" aria-label="Direct link to prefer-initializing-formals" title="Direct link to prefer-initializing-formals" translate="no">​</a></h3>
<p>Suggests using initializing formal parameters when applicable.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Some</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> value</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> another</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Some</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> val</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> named</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token comment" style="color:#999999">// LINT: Use an initializing formal to assign a parameter to a field.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token comment" style="color:#999999">//  Try using 'this.value' to initialize the field.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><mark class="code-warning"><span class="token plain">value </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> val</span></mark><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      another </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> named</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Another</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> _val</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: Use an initializing formal to assign a parameter to a field.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Try using 'this.value' to initialize the field.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Another</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> _value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><mark class="code-warning"><span class="token plain">_val </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> _value</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Some</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> value</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> another</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Some</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> named</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> another </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> named</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Another</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> _val</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Another</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">._</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>This rule also comes with <strong>auto-fix</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prefer-random-secure"><a class="" href="https://dcm.dev/docs/rules/common/prefer-random-secure/"><code>prefer-random-secure</code></a><a href="https://dcm.dev/blog/2026/06/22/whats-new-in-dcm-1-38-0/#prefer-random-secure" class="hash-link" aria-label="Direct link to prefer-random-secure" title="Direct link to prefer-random-secure" translate="no">​</a></h3>
<p>Warns when <code>Random</code> is used in a security-sensitive context.</p>
<p>The output of <code>Random</code> is predictable and must not be used in security-sensitive contexts.</p>
<p>This rule also comes with <strong>auto-fix</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-sensitive-query-params"><a class="" href="https://dcm.dev/docs/rules/common/avoid-sensitive-query-params/"><code>avoid-sensitive-query-params</code></a><a href="https://dcm.dev/blog/2026/06/22/whats-new-in-dcm-1-38-0/#avoid-sensitive-query-params" class="hash-link" aria-label="Direct link to avoid-sensitive-query-params" title="Direct link to avoid-sensitive-query-params" translate="no">​</a></h3>
<p>Warns when a URL query string contains sensitive data.</p>
<p>URL query string could be saved in the browser's history, passed through Referers, stored in logs, or recorded in other sources. Try passing this data via the request headers instead.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: URL query string could be saved in the browser's history, passed through Referers, stored in logs, or recorded in other sources.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Try passing this data via the request headers.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> url </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Uri</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">https</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'api.example.com'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">''</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><mark class="code-warning"><span class="token string-literal string" style="color:#e1ffe4">'token'</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'hello'</span></mark><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: URL query string could be saved in the browser's history, passed through Referers, stored in logs, or recorded in other sources.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Try passing this data via the request headers.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> hardcoded </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><mark class="code-warning"><span class="token string-literal string" style="color:#e1ffe4">'https://api.example.com/user?token=test'</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>here, both URLs will end up with sensitive query parameters.</p>
<p>To address this issue, consider passing sensitive data via request headers or body.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-unrestricted-navigation"><a class="" href="https://dcm.dev/docs/rules/flutter/avoid-unrestricted-navigation/"><code>avoid-unrestricted-navigation</code></a><a href="https://dcm.dev/blog/2026/06/22/whats-new-in-dcm-1-38-0/#avoid-unrestricted-navigation" class="hash-link" aria-label="Direct link to avoid-unrestricted-navigation" title="Direct link to avoid-unrestricted-navigation" translate="no">​</a></h3>
<p>Warns when WebViews allow users to navigate to any URL by clicking links or through JavaScript.</p>
<p>Allowing unrestricted navigation within an app's WebView introduces serious security risks. For instance, malicious elements like ads can redirect users to deceptive phishing pages. Because WebViews lack standard browser safety cues (like a visible URL bar), users are more likely to trust these fake sites.</p>
<p>Additionally, if the WebView loads a page with a Cross-Site Scripting (XSS) vulnerability, unrestricted navigation can broaden the attack's impact. Ultimately, this loss of contextual security makes it much harder for users to spot and avoid malicious content.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">WebViewController</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// LINT: Avoid unrestricted navigation as it expands the attack surface to cross-site scripting (XSS) vulnerabilities.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">//  Consider preventing navigation to arbitrary URLs.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">setNavigationDelegate</span><span class="token punctuation" style="color:#a7dbf7">(</span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">NavigationDelegate</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: Avoid unrestricted navigation as it expands the attack surface to cross-site scripting (XSS) vulnerabilities.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Consider preventing navigation to arbitrary URLs.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">InAppWebViewSettings</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: Avoid unrestricted navigation as it expands the attack surface to cross-site scripting (XSS) vulnerabilities.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Consider preventing navigation to arbitrary URLs.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">InAppWebViewSettings</span><span class="token punctuation" style="color:#a7dbf7">(</span><mark class="code-warning"><span class="token plain">useShouldOverrideUrlLoading</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: Avoid unrestricted navigation as it expands the attack surface to cross-site scripting (XSS) vulnerabilities.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Consider preventing navigation to arbitrary URLs.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">HeadlessInAppWebView</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">InAppWebViewSettings</span><span class="token punctuation" style="color:#a7dbf7">(</span><mark class="code-warning"><span class="token plain">useShouldOverrideUrlLoading</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">WebViewController</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">setNavigationDelegate</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">NavigationDelegate</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">onNavigationRequest</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">InAppWebViewSettings</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">useShouldOverrideUrlLoading</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">HeadlessInAppWebView</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">InAppWebViewSettings</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">useShouldOverrideUrlLoading</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-unrestricted-javascript"><a class="" href="https://dcm.dev/docs/rules/flutter/avoid-unrestricted-javascript/"><code>avoid-unrestricted-javascript</code></a><a href="https://dcm.dev/blog/2026/06/22/whats-new-in-dcm-1-38-0/#avoid-unrestricted-javascript" class="hash-link" aria-label="Direct link to avoid-unrestricted-javascript" title="Direct link to avoid-unrestricted-javascript" translate="no">​</a></h3>
<p>Warns when JavaScript execution is enabled for WebViews.</p>
<p>Mobile applications using WebViews face severe risks if they render untrusted code, making them highly vulnerable to Cross-Site Scripting (XSS). Within a WebView context, malicious JavaScript can exfiltrate sensitive local files from the device. Even more critically, it can interact with exposed native application functions, potentially leading to catastrophic flaws like remote code execution.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">WebViewController</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// LINT: Avoid unrestricted JavaScript as it expands the attack surface to cross-site scripting (XSS) vulnerabilities.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// Consider disabling JavaScript for WebViews.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">setJavaScriptMode</span><span class="token punctuation" style="color:#a7dbf7">(</span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">JavaScriptMode</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">unrestricted</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: Avoid unrestricted JavaScript as it expands the attack surface to cross-site scripting (XSS) vulnerabilities.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Consider disabling JavaScript for WebViews.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">InAppWebViewSettings</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: Avoid unrestricted JavaScript as it expands the attack surface to cross-site scripting (XSS) vulnerabilities.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Consider disabling JavaScript for WebViews.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">InAppWebViewSettings</span><span class="token punctuation" style="color:#a7dbf7">(</span><mark class="code-warning"><span class="token plain">javaScriptEnabled</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: Avoid unrestricted JavaScript as it expands the attack surface to cross-site scripting (XSS) vulnerabilities.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Consider disabling JavaScript for WebViews.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">HeadlessInAppWebView</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">InAppWebViewSettings</span><span class="token punctuation" style="color:#a7dbf7">(</span><mark class="code-warning"><span class="token plain">javaScriptEnabled</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">WebViewController</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">setJavaScriptMode</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">JavaScriptMode</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">disabled</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">InAppWebViewSettings</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">javaScriptEnabled</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">HeadlessInAppWebView</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">InAppWebViewSettings</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">javaScriptEnabled</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prefer-single-notifier-per-file"><a class="" href="https://dcm.dev/docs/rules/riverpod/prefer-single-notifier-per-file/"><code>prefer-single-notifier-per-file</code></a><a href="https://dcm.dev/blog/2026/06/22/whats-new-in-dcm-1-38-0/#prefer-single-notifier-per-file" class="hash-link" aria-label="Direct link to prefer-single-notifier-per-file" title="Direct link to prefer-single-notifier-per-file" translate="no">​</a></h3>
<p>Suggests keeping only one <code>Notifier</code> per file.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Some</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Notifier</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> field </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// LINT: Prefer only one Notifier per file. Try moving this Notifier to a separate file.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">Another</span></mark><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Notifier</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">get</span><span class="token plain"> state</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">some_notifier.dart</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Some</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Notifier</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> field </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">another_notifier.dart</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Another</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Notifier</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">get</span><span class="token plain"> state</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prefer-correct-provider-file-name"><a class="" href="https://dcm.dev/docs/rules/riverpod/prefer-correct-provider-file-name/"><code>prefer-correct-provider-file-name</code></a><a href="https://dcm.dev/blog/2026/06/22/whats-new-in-dcm-1-38-0/#prefer-correct-provider-file-name" class="hash-link" aria-label="Direct link to prefer-correct-provider-file-name" title="Direct link to prefer-correct-provider-file-name" translate="no">​</a></h3>
<p>Suggests ending file names with <code>_provider.dart</code> for files that contain a single <code>Provider</code> declaration.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">some.dart</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// LINT: File name with Providers must end with '_provider.dart'.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">//  Try renaming the file.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><mark class="code-warning"><span class="token plain">firstProvider</span></mark><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Provider</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">ref</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> instance </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DisposableService</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">onCancel</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">instance</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">dispose</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> instance</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">some_provider.dart</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> firstProvider </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Provider</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">ref</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> instance </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DisposableService</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">onCancel</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">instance</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">dispose</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> instance</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prefer-riverpod-provider-suffix"><a class="" href="https://dcm.dev/docs/rules/riverpod/prefer-riverpod-provider-suffix/"><code>prefer-riverpod-provider-suffix</code></a><a href="https://dcm.dev/blog/2026/06/22/whats-new-in-dcm-1-38-0/#prefer-riverpod-provider-suffix" class="hash-link" aria-label="Direct link to prefer-riverpod-provider-suffix" title="Direct link to prefer-riverpod-provider-suffix" translate="no">​</a></h3>
<p>Suggests ending <code>Provider</code> variable names with the <code>Provider</code> suffix.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// LINT: The name of this provider variable should end with Provider.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">//  Try renaming this variable.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><mark class="code-warning"><span class="token plain">first</span></mark><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Provider</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">ref</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> instance </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DisposableService</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">onCancel</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">instance</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">dispose</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> instance</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// LINT: The name of this provider variable ends with one of the banned suffixes.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">//  Try renaming this variable.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><mark class="code-warning"><span class="token plain">firstNotifierProvider</span></mark><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Provider</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">ref</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> instance </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DisposableService</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">onCancel</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">instance</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">dispose</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> instance</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> firstProvider </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Provider</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">ref</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> instance </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DisposableService</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">onCancel</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">instance</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">dispose</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> instance</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> secondProvider </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Provider</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">ref</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> instance </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DisposableService</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">onCancel</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">instance</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">dispose</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> instance</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prefer-riverpod-notifier-suffix"><a class="" href="https://dcm.dev/docs/rules/riverpod/prefer-riverpod-notifier-suffix/"><code>prefer-riverpod-notifier-suffix</code></a><a href="https://dcm.dev/blog/2026/06/22/whats-new-in-dcm-1-38-0/#prefer-riverpod-notifier-suffix" class="hash-link" aria-label="Direct link to prefer-riverpod-notifier-suffix" title="Direct link to prefer-riverpod-notifier-suffix" translate="no">​</a></h3>
<p>Suggests ending <code>Notifier</code> class names with the <code>Notifier</code> suffix.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// LINT: The name of this notifier class should end with Notifier.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">//  Try renaming this class.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">Counter</span></mark><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Notifier</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// LINT: The name of this notifier class ends with one of the banned suffixes.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">//  Try renaming this class.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">CounterProviderNotifier</span></mark><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Notifier</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CounterNotifier</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Notifier</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AnotherNotifier</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Notifier</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prefer-correct-notifier-file-name"><a class="" href="https://dcm.dev/docs/rules/riverpod/prefer-correct-notifier-file-name/"><code>prefer-correct-notifier-file-name</code></a><a href="https://dcm.dev/blog/2026/06/22/whats-new-in-dcm-1-38-0/#prefer-correct-notifier-file-name" class="hash-link" aria-label="Direct link to prefer-correct-notifier-file-name" title="Direct link to prefer-correct-notifier-file-name" translate="no">​</a></h3>
<p>Suggests ending file names with <code>_notifier.dart</code> for files with Notifiers.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">some.dart</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// LINT: File name of Notifier classes must end with '_notifier.dart'.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">//  Try renaming the file.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">SomeNotifier</span></mark><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Notifier</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">some_notifier.dart</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeNotifier</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Notifier</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What’s next<a href="https://dcm.dev/blog/2026/06/22/whats-new-in-dcm-1-38-0/#whats-next" class="hash-link" aria-label="Direct link to What’s next" title="Direct link to What’s next" translate="no">​</a></h2>
<p>To learn more about upcoming features, keep an eye on our <a href="https://dcm.featurebase.app/roadmap" target="_blank" rel="noopener noreferrer" class="">public roadmap</a>.</p>
<p>And to learn more about our upcoming videos and "Rules of the Week" content, subscribe to our <a href="https://www.youtube.com/@DCMAnalyzer" target="_blank" rel="noopener noreferrer" class="">Youtube Channel</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sharing-your-feedback">Sharing your feedback<a href="https://dcm.dev/blog/2026/06/22/whats-new-in-dcm-1-38-0/#sharing-your-feedback" class="hash-link" aria-label="Direct link to Sharing your feedback" title="Direct link to Sharing your feedback" translate="no">​</a></h2>
<p>If there is something you miss from DCM right now, want us to make something better, or have any general feedback — <a href="https://discord.gg/Vzjprgk4sb" target="_blank" rel="noopener noreferrer" class="">join our Discord server</a>! We’d love to hear from you.</p>]]></content>
        <author>
            <name>Dmitry Zhifarsky</name>
            <uri>https://dcm.dev</uri>
        </author>
        <category label="product-update" term="product-update"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[What’s new in DCM 1.37.0]]></title>
        <id>https://dcm.dev/blog/2026/04/24/whats-new-in-dcm-1-37-0/</id>
        <link href="https://dcm.dev/blog/2026/04/24/whats-new-in-dcm-1-37-0/"/>
        <updated>2026-04-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release includes 11 new rules; 34 new CLI and IDE fixes; HTML report for "dcm analyze"; deprecated and removed assists; multiple new hints to increase awareness of existing CLI flags and options; and more!]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="Cover" src="https://dcm.dev/assets/images/2026-04-24-cover-efc3364ac4e7bfb61c843094184f12f1.jpg" width="1400" height="736" class="img_ev3q"></p>
<p>Today we’re excited to announce the release of DCM 1.37.0!</p>
<p>This release includes 11 new rules; 34 new CLI and IDE fixes; HTML report for "dcm analyze"; deprecated and removed assists; multiple new hints to increase awareness of existing CLI flags and options (for example, unsafe fixes, different fix types, how baseline works on so on); and more! 🚀</p>
<p>Let’s go through the highlights of this release (and the full list of changes is <a class="" href="https://dcm.dev/changelog/#1.37.0">in our changelog</a>)!</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="html-report-for-dcm-analyze">HTML Report for "dcm analyze"<a href="https://dcm.dev/blog/2026/04/24/whats-new-in-dcm-1-37-0/#html-report-for-dcm-analyze" class="hash-link" aria-label="Direct link to HTML Report for &quot;dcm analyze&quot;" title="Direct link to HTML Report for &quot;dcm analyze&quot;" translate="no">​</a></h2>
<p>With this release we are introducing the HTML report output for the analyze command.</p>
<p><img decoding="async" loading="lazy" alt="HTML" src="https://dcm.dev/assets/images/analyze-html-report-3cc170fa25ea963b88ed442e3b2b8b6a.png" width="2930" height="1930" class="img_ev3q"></p>
<p>The issues are grouped the same way as for the DCM Dashboards: each issue is counted only once and is placed into one of the 6 groups (Correctness, Readability, Maintainability, Memory Leak, Performance and Control Flow).</p>
<p>Additionally, opening a particular file and hovering over the info icon will show each issue detailed information:</p>
<p><img decoding="async" loading="lazy" alt="HTML" src="https://dcm.dev/assets/images/analyze-html-report-with-tooltip-d8607ea8c265962e2df1b34ae80c48a3.png" width="1938" height="1426" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="removed-assists">Removed Assists<a href="https://dcm.dev/blog/2026/04/24/whats-new-in-dcm-1-37-0/#removed-assists" class="hash-link" aria-label="Direct link to Removed Assists" title="Direct link to Removed Assists" translate="no">​</a></h2>
<p>With this release we are removing 2 (all) existing assists: "Extract to a File" and "Wrap with ...".</p>
<p>The first one was introduced back when the Dart extension didn't provide an alternative (which has changed) and the second one can be replaced with a custom snippet (at least in VS Code).</p>
<p>However, even just 2 assists were sitting on their own visitor which was adding unnecessary background calculations even if you never used them. So we decided to remove them and focus on other features.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-hints">New Hints<a href="https://dcm.dev/blog/2026/04/24/whats-new-in-dcm-1-37-0/#new-hints" class="hash-link" aria-label="Direct link to New Hints" title="Direct link to New Hints" translate="no">​</a></h2>
<p>To improve the onboarding experience (and help discover features even if you've been using the tool for a while), we are adding several new hints:</p>
<ol>
<li class="">
<p>The "dcm activate" command will now show next steps and useful links:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">✔ License key successfully activated. 0.3s</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">To get a preview of all lint issues, run 'dcm lints-preview .'</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">To quickly get started with the tool, check out these guides:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">- https://dcm.dev/docs/guides/choosing-first-dcm-rules/</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">- https://dcm.dev/docs/guides/integrating-into-existing-project/</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">- https://dcm.dev/docs/guides/uploading-data-to-dashboards/</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">And if you actively use LLMs (Claude, Codex, Copilot, etc.), check out these guides:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">- https://dcm.dev/docs/ide-integrations/mcp-server/</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">- https://dcm.dev/docs/ide-integrations/ai-cli-tools/</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Don't forget to restart your IDE if you have it open.</span><br></span></code></pre></div></div>
</li>
<li class="">
<p>The "dcm fix" command will now show other available types of fixes when used with the default <code>--type=lints</code>. Additionally, if you have any enabled rules that support only unsafe fixes, you will get a corresponding hint:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">✔ Calculation is completed. Applying the results. 0.7s</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Some of the enabled rules:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">- avoid-conditions-with-boolean-literals</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">- avoid-constant-assert-conditions</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">- avoid-suspicious-super-overrides</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">- avoid-unnecessary-gesture-detector</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">- avoid-unnecessary-if</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">- avoid-unnecessary-nullable-parameters</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">- avoid-unnecessary-nullable-return-type</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">- avoid-unnecessary-super</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">- avoid-unsafe-collection-methods</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">- avoid-unused-assignment</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">- avoid-unused-parameters</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">- match-base-class-default-value</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">- use-closest-build-context</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">can only be fixed with the "--unsafe" flag</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">To fix unused code, unused files, dependencies, or unnecessarily public code, try passing the "--type" option</span><br></span></code></pre></div></div>
</li>
<li class="">
<p>The "dcm init baseline" will now show a hint that explains what the baseline is (to avoid cases when the baseline is generated first and then all command show 0 issues):</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">This command adds ALL existing issues to the baseline, resulting in other commands showing 0 issues.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">If that is NOT the expected behavior, remove the generated baseline file.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">You can read more about the command here: https://dcm.dev/docs/cli/init/#baseline</span><br></span></code></pre></div></div>
</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-rules">New Rules<a href="https://dcm.dev/blog/2026/04/24/whats-new-in-dcm-1-37-0/#new-rules" class="hash-link" aria-label="Direct link to New Rules" title="Direct link to New Rules" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p><strong>Discovering and Adding Rules from New Releases</strong></p><p>Each DCM release introduces new rules. To explore all available rules and filter by version, use the <a class="" href="https://dcm.dev/docs/cli/init/#lints-preview"><code>dcm init lints-preview</code></a> command:</p><div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token builtin class-name" style="color:#7fdbca">dcm</span><span class="token plain"> init lints-preview </span><span class="token function" style="color:#87aff4">lib</span><span class="token plain"> --rule-version=1.37.0  </span><span class="token comment" style="color:#999999"># Show rules added in 1.37.0</span><br></span></code></pre></div></div><p>This command displays:</p><ul>
<li class="">Rule names and their violations in your codebase</li>
<li class="">Estimated effort to fix all violations of each rule</li>
<li class="">Whether a rule supports automatic fixes</li>
</ul><p>You can also generate the output in different formats.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="require-atomic-async-updates"><a class="" href="https://dcm.dev/docs/rules/common/require-atomic-async-updates/"><code>require-atomic-async-updates</code></a><a href="https://dcm.dev/blog/2026/04/24/whats-new-in-dcm-1-37-0/#require-atomic-async-updates" class="hash-link" aria-label="Direct link to require-atomic-async-updates" title="Direct link to require-atomic-async-updates" translate="no">​</a></h3>
<p>Warns when an assignment can lead to a race condition due to <code>await</code>.</p>
<p>An assignment is reported when the rule detects the following execution flow in an async function:</p>
<ol>
<li class="">The variable is read.</li>
<li class="">An <code>await</code> pauses the function.</li>
<li class="">After the function is resumed, a value is assigned to the variable from step 1.</li>
</ol>
<p>The assignment in step 3 is reported because it may be incorrectly resolved because the value of the variable from step 1 may have changed between steps 2 and 3. In particular, if the variable can be accessed from other execution contexts (for example, if it is not a local variable and therefore other functions can change it), the value of the variable may have changed elsewhere while the function was paused in step 2.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> foo </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics keyword" style="color:#00bff9">void</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> amount</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: This reassignment might use an outdated value due to a race condition.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Consider moving the await expression to its own local variable.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><mark class="code-warning"><span class="token plain">foo</span></mark><span class="token plain"> </span><span class="token operator" style="color:#00bff9">+=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> amount</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: This reassignment might use an outdated value due to a race condition.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Consider moving the await expression to its own local variable.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><mark class="code-warning"><span class="token plain">foo</span></mark><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> foo </span><span class="token operator" style="color:#00bff9">+</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> amount</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">main</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">wait</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// "fn" is called more than once</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>To fix the issue, consider introducing a local variable:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> foo </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics keyword" style="color:#00bff9">void</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> amount</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> local </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> amount</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  foo </span><span class="token operator" style="color:#00bff9">+=</span><span class="token plain"> local</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="keep-state-below-its-widget"><a class="" href="https://dcm.dev/docs/rules/flutter/keep-state-below-its-widget/"><code>keep-state-below-its-widget</code></a><a href="https://dcm.dev/blog/2026/04/24/whats-new-in-dcm-1-37-0/#keep-state-below-its-widget" class="hash-link" aria-label="Direct link to keep-state-below-its-widget" title="Direct link to keep-state-below-its-widget" translate="no">​</a></h3>
<p>Suggests placing the widget state right after the widget declaration.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// LINT: Prefer keeping the widget state right after the widget declaration.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">MyWidget4State</span></mark><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">MyWidget4</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Container</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyWidget4</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatefulWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyWidget4</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">MyWidget4</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">createState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyWidget4State</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyWidget4</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatefulWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyWidget4</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">MyWidget4</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">createState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyWidget4State</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyWidget4State</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">MyWidget4</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Container</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>This rule also comes with <strong>auto-fix</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="always-pass-global-key"><a class="" href="https://dcm.dev/docs/rules/flutter/always-pass-global-key/"><code>always-pass-global-key</code></a><a href="https://dcm.dev/blog/2026/04/24/whats-new-in-dcm-1-37-0/#always-pass-global-key" class="hash-link" aria-label="Direct link to always-pass-global-key" title="Direct link to always-pass-global-key" translate="no">​</a></h3>
<p>Warns when a global key field is not passed to any widget.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_AnotherState</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">_Example</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: This global key is not passed to any widget.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">GlobalKey</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><mark class="code-warning"><span class="token plain">_formKey</span></mark><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">GlobalKey</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_submitForm</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_formKey</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">currentState</span><span class="token operator" style="color:#00bff9">!</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">validate</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      _formKey</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">currentState</span><span class="token operator" style="color:#00bff9">!</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">save</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Form</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>here, even though the <code>_formKey</code> field is used in the <code>_submitForm</code> method (so the field itself is not highlighted as unused), the key is not passed to any widget.</p>
<p>To fix the issue, pass the key to a widget:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_AnotherState</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">_Example</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">GlobalKey</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> _formKey </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">GlobalKey</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_submitForm</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_formKey</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">currentState</span><span class="token operator" style="color:#00bff9">!</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">validate</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      _formKey</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">currentState</span><span class="token operator" style="color:#00bff9">!</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">save</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Form</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _formKey</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-labels"><a class="" href="https://dcm.dev/docs/rules/common/avoid-labels/"><code>avoid-labels</code></a><a href="https://dcm.dev/blog/2026/04/24/whats-new-in-dcm-1-37-0/#avoid-labels" class="hash-link" aria-label="Direct link to avoid-labels" title="Direct link to avoid-labels" translate="no">​</a></h3>
<p>Warns when a labeled statement is used.</p>
<p>While convenient in some cases, labels tend to be used only rarely and are frowned upon by some as a remedial form of flow control that is more error prone and harder to understand.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// LINT: Avoid labels. Try rewriting the code without them.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><mark class="code-warning"><span class="token plain">label</span></mark><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">while</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">break</span><span class="token plain"> label</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">while</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">break</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prefer-assert-initializers-first"><a class="" href="https://dcm.dev/docs/rules/common/prefer-assert-initializers-first/"><code>prefer-assert-initializers-first</code></a><a href="https://dcm.dev/blog/2026/04/24/whats-new-in-dcm-1-37-0/#prefer-assert-initializers-first" class="hash-link" aria-label="Direct link to prefer-assert-initializers-first" title="Direct link to prefer-assert-initializers-first" translate="no">​</a></h3>
<p>Suggests placing assert initializers at the beginning of the initializer list.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> value</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> another</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> val</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> some</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> value </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'123'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token comment" style="color:#999999">// LINT: Prefer placing assert initializers at the beginning of the initializer list.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><mark class="code-warning"><span class="token keyword" style="color:#00bff9">assert</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">val </span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      another </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">123</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token comment" style="color:#999999">// LINT: Prefer placing assert initializers at the beginning of the initializer list.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><mark class="code-warning"><span class="token keyword" style="color:#00bff9">assert</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">some </span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> value</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> another</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> val</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> some</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">assert</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">val </span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">assert</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">some </span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      value </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'123'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      another </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">123</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>This rule also comes with <strong>auto-fix</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="initializers-ordering"><a class="" href="https://dcm.dev/docs/rules/common/initializers-ordering/"><code>initializers-ordering</code></a><a href="https://dcm.dev/blog/2026/04/24/whats-new-in-dcm-1-37-0/#initializers-ordering" class="hash-link" aria-label="Direct link to initializers-ordering" title="Direct link to initializers-ordering" translate="no">​</a></h3>
<p>Ensures that the order of constructor initializers matches the order of the class fields.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Some</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> value</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> another</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: Constructor initializers do not match the fields order. Try sorting them.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Some</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> another </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><mark class="code-warning"><span class="token plain">value </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'some'</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Some</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> value</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> another</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Some</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> value </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'some'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> another </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>This rule also comes with <strong>auto-fix</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="newline-before-throw"><a class="" href="https://dcm.dev/docs/rules/common/newline-before-throw/"><code>newline-before-throw</code></a><a href="https://dcm.dev/blog/2026/04/24/whats-new-in-dcm-1-37-0/#newline-before-throw" class="hash-link" aria-label="Direct link to newline-before-throw" title="Direct link to newline-before-throw" translate="no">​</a></h3>
<p>Enforces a blank line before a throw expression in a block.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><mark class="code-warning"><span class="token keyword" style="color:#00bff9">throw</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Exception</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// LINT: Missing a blank line before 'throw'.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">throw</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Exception</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">throw</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Exception</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>This rule also comes with <strong>auto-fix</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="newline-before-break"><a class="" href="https://dcm.dev/docs/rules/common/newline-before-break/"><code>newline-before-break</code></a><a href="https://dcm.dev/blog/2026/04/24/whats-new-in-dcm-1-37-0/#newline-before-break" class="hash-link" aria-label="Direct link to newline-before-break" title="Direct link to newline-before-break" translate="no">​</a></h3>
<p>Enforces a blank line before a break statement in a block.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> value </span><span class="token keyword" style="color:#00bff9">in</span><span class="token plain"> values</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><mark class="code-warning"><span class="token keyword" style="color:#00bff9">break</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// LINT: Missing a blank line before 'break'.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> value </span><span class="token keyword" style="color:#00bff9">in</span><span class="token plain"> values</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">break</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>This rule also comes with <strong>auto-fix</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="newline-before-continue"><a class="" href="https://dcm.dev/docs/rules/common/newline-before-continue/"><code>newline-before-continue</code></a><a href="https://dcm.dev/blog/2026/04/24/whats-new-in-dcm-1-37-0/#newline-before-continue" class="hash-link" aria-label="Direct link to newline-before-continue" title="Direct link to newline-before-continue" translate="no">​</a></h3>
<p>Enforces a blank line before a continue statement in a block.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> value </span><span class="token keyword" style="color:#00bff9">in</span><span class="token plain"> values</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><mark class="code-warning"><span class="token keyword" style="color:#00bff9">continue</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// LINT: Missing a blank line before 'continue'.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> value </span><span class="token keyword" style="color:#00bff9">in</span><span class="token plain"> values</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">continue</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>This rule also comes with <strong>auto-fix</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="max-statements"><a class="" href="https://dcm.dev/docs/rules/common/max-statements/"><code>max-statements</code></a><a href="https://dcm.dev/blog/2026/04/24/whats-new-in-dcm-1-37-0/#max-statements" class="hash-link" aria-label="Direct link to max-statements" title="Direct link to max-statements" translate="no">​</a></h3>
<p>Warns when the number of statements in a function exceeds the configured threshold.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// LINT: This function has too many statements (25). Maximum allowed is 20.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">//  Try reducing the number of statements.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><mark class="code-warning"><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// 25 statements</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// 15 statements</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-dot-shorthands"><a class="" href="https://dcm.dev/docs/rules/common/avoid-dot-shorthands/"><code>avoid-dot-shorthands</code></a><a href="https://dcm.dev/blog/2026/04/24/whats-new-in-dcm-1-37-0/#avoid-dot-shorthands" class="hash-link" aria-label="Direct link to avoid-dot-shorthands" title="Direct link to avoid-dot-shorthands" translate="no">​</a></h3>
<p>Warns against using dot shorthands.</p>
<p>Use this rule only if you would like to <strong>not</strong> use dot shorthands in your codebase and keep it consistent.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>This rule is incompatible with rules that suggest using dot shorthands in various cases.</p></div></div>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// LINT: Avoid dot shorthands as they reduce readability. Try adding explicit types.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">case</span><span class="token plain"> </span><mark class="code-warning"><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span></mark><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> v </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// LINT: Avoid dot shorthands as they reduce readability. Try adding explicit types.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><mark class="code-warning"><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span></mark><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    _ </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: Avoid dot shorthands as they reduce readability. Try adding explicit types.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> another </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><mark class="code-warning"><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: Avoid dot shorthands as they reduce readability. Try adding explicit types.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><mark class="code-warning"><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">case</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> v </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    _ </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> another </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What’s next<a href="https://dcm.dev/blog/2026/04/24/whats-new-in-dcm-1-37-0/#whats-next" class="hash-link" aria-label="Direct link to What’s next" title="Direct link to What’s next" translate="no">​</a></h2>
<p>To learn more about upcoming features, keep an eye on our <a href="https://dcm.featurebase.app/roadmap" target="_blank" rel="noopener noreferrer" class="">public roadmap</a>.</p>
<p>And to learn more about our upcoming videos and "Rules of the Week" content, subscribe to our <a href="https://www.youtube.com/@DCMAnalyzer" target="_blank" rel="noopener noreferrer" class="">Youtube Channel</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sharing-your-feedback">Sharing your feedback<a href="https://dcm.dev/blog/2026/04/24/whats-new-in-dcm-1-37-0/#sharing-your-feedback" class="hash-link" aria-label="Direct link to Sharing your feedback" title="Direct link to Sharing your feedback" translate="no">​</a></h2>
<p>If there is something you miss from DCM right now, want us to make something better, or have any general feedback — <a href="https://discord.gg/Vzjprgk4sb" target="_blank" rel="noopener noreferrer" class="">join our Discord server</a>! We’d love to hear from you.</p>]]></content>
        <author>
            <name>Dmitry Zhifarsky</name>
            <uri>https://dcm.dev</uri>
        </author>
        <category label="product-update" term="product-update"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Flutter Cyclomatic Complexity Guide]]></title>
        <id>https://dcm.dev/blog/2026/04/01/cyclomatic-complexity-flutter-dcm/</id>
        <link href="https://dcm.dev/blog/2026/04/01/cyclomatic-complexity-flutter-dcm/"/>
        <updated>2026-04-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Learn how to identify, measure, and reduce Cyclomatic Complexity in Flutter apps using DCM—complete with real-world examples and team workflow tips.]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="Cover" src="https://dcm.dev/assets/images/2026-04-01-cover-5c59870505801389b0d9e79459340111.jpg" width="1050" height="561" class="img_ev3q"></p>
<p>Every Flutter developer (most likely) has opened that one screen, the one with the giant <code>build</code> method stuffed with feature flags, platform checks, theme conditionals, and inline <code>onPressed</code> handlers nobody dares to touch. You scroll through 200 lines of nested <code>if/else</code>, thinking "this should be two widgets… three widgets… a dozen widgets," but there's never time to refactor, and adding one more condition feels safer than rewriting the whole thing.</p>
<p>The result? A maintenance nightmare where every small feature spawns a dozen edge-case bugs.</p>
<p>That gut feeling of "too many branches" has a name: <a href="https://en.wikipedia.org/wiki/Cyclomatic_complexity" target="_blank" rel="noopener noreferrer" class=""><strong>Cyclomatic Complexity</strong></a>. It's a metric that counts the independent paths through a function. The higher the number, the more execution routes your tests (and your brain) need to cover.</p>
<p>In this post, we'll measure and tackle complexity in Flutter projects and you'll learn best practices around this topic.</p>
<p>Let's get started!</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-cyclomatic-complexity-actually-measures">What Cyclomatic Complexity Actually Measures<a href="https://dcm.dev/blog/2026/04/01/cyclomatic-complexity-flutter-dcm/#what-cyclomatic-complexity-actually-measures" class="hash-link" aria-label="Direct link to What Cyclomatic Complexity Actually Measures" title="Direct link to What Cyclomatic Complexity Actually Measures" translate="no">​</a></h2>
<p>Cyclomatic Complexity was introduced by Thomas McCabe in 1976 in his paper, <a href="https://ieeexplore.ieee.org/document/1702388/" target="_blank" rel="noopener noreferrer" class="">"A Complexity Measure"</a>.</p>
<p>The idea is simple:</p>
<blockquote>
<p>count every decision point in a function and add one.</p>
</blockquote>
<p>Each decision is a fork in the road that execution might take.</p>
<p>McCabe’s original idea was that every new path is another test case you should care about. When paths explode, the mental model collapses, regressions sneak in, and reviewers struggle to reason about side effects. Even in pure math terms, you can think of complexity as the number of linearly independent paths through a control-flow graph, more edges, more chances to miss a corner case.</p>
<center><p><img decoding="async" loading="lazy" alt="Control-flow" src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iDQogImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIEdlbmVyYXRlZCBieSBncmFwaHZpeiB2ZXJzaW9uIDIuMzguMCAoMjAxNDA0MTMuMjA0MSkNCiAtLT4NCjwhLS0gVGl0bGU6IENGR19leGFtcGxlcyBQYWdlczogMSAtLT4NCjxzdmcgd2lkdGg9IjIxNnB0IiBoZWlnaHQ9IjM5M3B0Ig0KIHZpZXdCb3g9IjAuMDAgMC4wMCAyMTYuMjUgMzkzLjAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCjxnIGlkPSJncmFwaDAiIGNsYXNzPSJncmFwaCIgdHJhbnNmb3JtPSJzY2FsZSgxIDEpIHJvdGF0ZSgwKSB0cmFuc2xhdGUoNCAzODkpIj4NCjx0aXRsZT5DRkdfZXhhbXBsZXM8L3RpdGxlPg0KPHBvbHlnb24gZmlsbD0id2hpdGUiIHN0cm9rZT0ibm9uZSIgcG9pbnRzPSItNCw0IC00LC0zODkgMjEyLjI1LC0zODkgMjEyLjI1LDQgLTQsNCIvPg0KPCEtLSBpZiAtLT4NCjxnIGlkPSJub2RlMSIgY2xhc3M9Im5vZGUiPjx0aXRsZT5pZjwvdGl0bGU+DQo8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBjeD0iMzIuMjU5MyIgY3k9Ii0zNTkiIHJ4PSIxMSIgcnk9IjExIi8+DQo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxMy4yNTkzIiB5PSItMzczLjgiIGZvbnQtZmFtaWx5PSJUaW1lcyBOZXcgUm9tYW4sc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPihhKTwvdGV4dD4NCjwvZz4NCjwhLS0gdGhlbiAtLT4NCjxnIGlkPSJub2RlMiIgY2xhc3M9Im5vZGUiPjx0aXRsZT50aGVuPC90aXRsZT4NCjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSIxMi4yNTkzIiBjeT0iLTMwMSIgcng9IjExIiByeT0iMTEiLz4NCjwvZz4NCjwhLS0gaWYmIzQ1OyZndDt0aGVuIC0tPg0KPGcgaWQ9ImVkZ2UxIiBjbGFzcz0iZWRnZSI+PHRpdGxlPmlmJiM0NTsmZ3Q7dGhlbjwvdGl0bGU+DQo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMjguODY2NiwtMzQ4LjVDMjUuNzUzNywtMzM5Ljc4NCAyMS4wOTQ4LC0zMjYuNzM5IDE3LjUwMzEsLTMxNi42ODIiLz4NCjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjE5LjA2NTcsLTMxNS44NTUgMTUuNzM1OSwtMzExLjczNCAxNS43Njk2LC0zMTcuMDMyIDE5LjA2NTcsLTMxNS44NTUiLz4NCjwvZz4NCjwhLS0gZWxzZSAtLT4NCjxnIGlkPSJub2RlMyIgY2xhc3M9Im5vZGUiPjx0aXRsZT5lbHNlPC90aXRsZT4NCjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSI1Mi4yNTkzIiBjeT0iLTMwMSIgcng9IjExIiByeT0iMTEiLz4NCjwvZz4NCjwhLS0gaWYmIzQ1OyZndDtlbHNlIC0tPg0KPGcgaWQ9ImVkZ2UyIiBjbGFzcz0iZWRnZSI+PHRpdGxlPmlmJiM0NTsmZ3Q7ZWxzZTwvdGl0bGU+DQo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMzUuNjUyMSwtMzQ4LjVDMzguNzY0OSwtMzM5Ljc4NCA0My40MjM5LC0zMjYuNzM5IDQ3LjAxNTYsLTMxNi42ODIiLz4NCjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjQ4Ljc0OSwtMzE3LjAzMiA0OC43ODI3LC0zMTEuNzM0IDQ1LjQ1MjksLTMxNS44NTUgNDguNzQ5LC0zMTcuMDMyIi8+DQo8L2c+DQo8IS0tIGZpIC0tPg0KPGcgaWQ9Im5vZGU0IiBjbGFzcz0ibm9kZSI+PHRpdGxlPmZpPC90aXRsZT4NCjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSIzMi4yNTkzIiBjeT0iLTI0MyIgcng9IjExIiByeT0iMTEiLz4NCjwvZz4NCjwhLS0gdGhlbiYjNDU7Jmd0O2ZpIC0tPg0KPGcgaWQ9ImVkZ2UzIiBjbGFzcz0iZWRnZSI+PHRpdGxlPnRoZW4mIzQ1OyZndDtmaTwvdGl0bGU+DQo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMTUuNjUyMSwtMjkwLjVDMTguNzY0OSwtMjgxLjc4NCAyMy40MjM5LC0yNjguNzM5IDI3LjAxNTYsLTI1OC42ODIiLz4NCjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjI4Ljc0OSwtMjU5LjAzMiAyOC43ODI3LC0yNTMuNzM0IDI1LjQ1MjksLTI1Ny44NTUgMjguNzQ5LC0yNTkuMDMyIi8+DQo8L2c+DQo8IS0tIGVsc2UmIzQ1OyZndDtmaSAtLT4NCjxnIGlkPSJlZGdlNCIgY2xhc3M9ImVkZ2UiPjx0aXRsZT5lbHNlJiM0NTsmZ3Q7Zmk8L3RpdGxlPg0KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTQ4Ljg2NjYsLTI5MC41QzQ1Ljc1MzcsLTI4MS43ODQgNDEuMDk0OCwtMjY4LjczOSAzNy41MDMxLC0yNTguNjgyIi8+DQo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIzOS4wNjU3LC0yNTcuODU1IDM1LjczNTksLTI1My43MzQgMzUuNzY5NiwtMjU5LjAzMiAzOS4wNjU3LC0yNTcuODU1Ii8+DQo8L2c+DQo8IS0tIGV4aXQxIC0tPg0KPGcgaWQ9Im5vZGU4IiBjbGFzcz0ibm9kZSI+PHRpdGxlPmV4aXQxPC90aXRsZT4NCjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSIzMi4yNTkzIiBjeT0iLTE4NSIgcng9IjExIiByeT0iMTEiLz4NCjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjEzLjI1OTMiIHk9Ii0xOTkuOCIgZm9udC1mYW1pbHk9IlRpbWVzIE5ldyBSb21hbixzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+KGMpPC90ZXh0Pg0KPC9nPg0KPCEtLSBmaSYjNDU7Jmd0O2V4aXQxIC0tPg0KPCEtLSB3aGlsZSAtLT4NCjxnIGlkPSJub2RlNSIgY2xhc3M9Im5vZGUiPjx0aXRsZT53aGlsZTwvdGl0bGU+DQo8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBjeD0iMTg2LjI1OSIgY3k9Ii0zNTkiIHJ4PSIxMSIgcnk9IjExIi8+DQo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxNjYuNzU5IiB5PSItMzczLjgiIGZvbnQtZmFtaWx5PSJUaW1lcyBOZXcgUm9tYW4sc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPihiKTwvdGV4dD4NCjwvZz4NCjwhLS0gYm9keSAtLT4NCjxnIGlkPSJub2RlNiIgY2xhc3M9Im5vZGUiPjx0aXRsZT5ib2R5PC90aXRsZT4NCjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSIxODYuMjU5IiBjeT0iLTMwMSIgcng9IjExIiByeT0iMTEiLz4NCjwvZz4NCjwhLS0gd2hpbGUmIzQ1OyZndDtib2R5IC0tPg0KPGcgaWQ9ImVkZ2U1IiBjbGFzcz0iZWRnZSI+PHRpdGxlPndoaWxlJiM0NTsmZ3Q7Ym9keTwvdGl0bGU+DQo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMTg2LjI1OSwtMzQ3Ljk4OEMxODYuMjU5LC0zMzkuNDk0IDE4Ni4yNTksLTMyNy4xNyAxODYuMjU5LC0zMTcuNDE3Ii8+DQo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIxODguMDA5LC0zMTcuMzA0IDE4Ni4yNTksLTMxMi4zMDQgMTg0LjUwOSwtMzE3LjMwNCAxODguMDA5LC0zMTcuMzA0Ii8+DQo8L2c+DQo8IS0tIGVuZCAtLT4NCjxnIGlkPSJub2RlNyIgY2xhc3M9Im5vZGUiPjx0aXRsZT5lbmQ8L3RpdGxlPg0KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgY3g9IjE4Ni4yNTkiIGN5PSItMjQzIiByeD0iMTEiIHJ5PSIxMSIvPg0KPC9nPg0KPCEtLSB3aGlsZSYjNDU7Jmd0O2VuZCAtLT4NCjxnIGlkPSJlZGdlNyIgY2xhc3M9ImVkZ2UiPjx0aXRsZT53aGlsZSYjNDU7Jmd0O2VuZDwvdGl0bGU+DQo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMTkxLjM5MSwtMzQ5LjJDMTk2LjMxOSwtMzQwLjIgMjAzLjQyMiwtMzI1LjY0MSAyMDYuMjU5LC0zMTIgMjA4LjI1LC0zMDIuNDI3IDIwOC4yNSwtMjk5LjU3MyAyMDYuMjU5LC0yOTAgMjAzLjg2NSwtMjc4LjQ5IDE5OC40MzUsLTI2Ni4zMjcgMTkzLjgzNSwtMjU3LjQwMSIvPg0KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMTk1LjI4MiwtMjU2LjM5NCAxOTEuMzkxLC0yNTIuOCAxOTIuMTkxLC0yNTguMDM2IDE5NS4yODIsLTI1Ni4zOTQiLz4NCjwvZz4NCjwhLS0gYm9keSYjNDU7Jmd0O3doaWxlIC0tPg0KPGcgaWQ9ImVkZ2U2IiBjbGFzcz0iZWRnZSI+PHRpdGxlPmJvZHkmIzQ1OyZndDt3aGlsZTp3PC90aXRsZT4NCjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik0xODAuNzQ0LC0zMTAuOTA2QzE3Mi4zMzQsLTMyNS4xODQgMTU4LjM1OSwtMzUyLjE3OCAxNjkuMTIsLTM1Ny45MTIiLz4NCjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjE2OS4wMDUsLTM1OS42NzcgMTc0LjI1OSwtMzU5IDE2OS43MywtMzU2LjI1MyAxNjkuMDA1LC0zNTkuNjc3Ii8+DQo8L2c+DQo8IS0tIGJvZHkmIzQ1OyZndDtlbmQgLS0+DQo8IS0tIHRvcCAtLT4NCjxnIGlkPSJub2RlMTIiIGNsYXNzPSJub2RlIj48dGl0bGU+dG9wPC90aXRsZT4NCjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSIxODYuMjU5IiBjeT0iLTE4NSIgcng9IjExIiByeT0iMTEiLz4NCjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE2Ni43NTkiIHk9Ii0xOTkuOCIgZm9udC1mYW1pbHk9IlRpbWVzIE5ldyBSb21hbixzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+KGQpPC90ZXh0Pg0KPC9nPg0KPCEtLSBlbmQmIzQ1OyZndDt0b3AgLS0+DQo8IS0tIGV4aXQyIC0tPg0KPGcgaWQ9Im5vZGU5IiBjbGFzcz0ibm9kZSI+PHRpdGxlPmV4aXQyPC90aXRsZT4NCjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSIzMi4yNTkzIiBjeT0iLTEyNyIgcng9IjExIiByeT0iMTEiLz4NCjwvZz4NCjwhLS0gZXhpdDEmIzQ1OyZndDtleGl0MiAtLT4NCjxnIGlkPSJlZGdlMTAiIGNsYXNzPSJlZGdlIj48dGl0bGU+ZXhpdDEmIzQ1OyZndDtleGl0MjwvdGl0bGU+DQo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMzIuMjU5MywtMTczLjk4OEMzMi4yNTkzLC0xNjUuNDk0IDMyLjI1OTMsLTE1My4xNyAzMi4yNTkzLC0xNDMuNDE3Ii8+DQo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIzNC4wMDk0LC0xNDMuMzA0IDMyLjI1OTMsLTEzOC4zMDQgMzAuNTA5NCwtMTQzLjMwNCAzNC4wMDk0LC0xNDMuMzA0Ii8+DQo8L2c+DQo8IS0tIG91dCAtLT4NCjxnIGlkPSJub2RlMTEiIGNsYXNzPSJub2RlIj48dGl0bGU+b3V0PC90aXRsZT4NCjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSIzMi4yNTkzIiBjeT0iLTExIiByeD0iMTEiIHJ5PSIxMSIvPg0KPC9nPg0KPCEtLSBleGl0MSYjNDU7Jmd0O291dCAtLT4NCjxnIGlkPSJlZGdlMTMiIGNsYXNzPSJlZGdlIj48dGl0bGU+ZXhpdDEmIzQ1OyZndDtvdXQ6ZTwvdGl0bGU+DQo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMzYuODM0LC0xNzQuNjk5QzUzLjU1NTYsLTEzOS43NDcgMTA3LjQzNiwtMTcuOTE4NSA0OS40MjA4LC0xMS4yODIxIi8+DQo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI0OS4zNDc0LC05LjUyNTU2IDQ0LjI1OTMsLTExIDQ5LjE1NjMsLTEzLjAyMDMgNDkuMzQ3NCwtOS41MjU1NiIvPg0KPC9nPg0KPCEtLSBib2R5MiAtLT4NCjxnIGlkPSJub2RlMTAiIGNsYXNzPSJub2RlIj48dGl0bGU+Ym9keTI8L3RpdGxlPg0KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgY3g9IjMyLjI1OTMiIGN5PSItNjkiIHJ4PSIxMSIgcnk9IjExIi8+DQo8L2c+DQo8IS0tIGV4aXQyJiM0NTsmZ3Q7Ym9keTIgLS0+DQo8ZyBpZD0iZWRnZTExIiBjbGFzcz0iZWRnZSI+PHRpdGxlPmV4aXQyJiM0NTsmZ3Q7Ym9keTI8L3RpdGxlPg0KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTMyLjI1OTMsLTExNS45ODhDMzIuMjU5MywtMTA3LjQ5NCAzMi4yNTkzLC05NS4xNjk3IDMyLjI1OTMsLTg1LjQxNjkiLz4NCjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjM0LjAwOTQsLTg1LjMwMzggMzIuMjU5MywtODAuMzAzOSAzMC41MDk0LC04NS4zMDM5IDM0LjAwOTQsLTg1LjMwMzgiLz4NCjwvZz4NCjwhLS0gZXhpdDImIzQ1OyZndDtvdXQgLS0+DQo8ZyBpZD0iZWRnZTE0IiBjbGFzcz0iZWRnZSI+PHRpdGxlPmV4aXQyJiM0NTsmZ3Q7b3V0PC90aXRsZT4NCjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik0zNy4zOTA1LC0xMTcuMkM0Mi4zMTg5LC0xMDguMiA0OS40MjIxLC05My42NDEzIDUyLjI1OTMsLTgwIDU0LjI1MDQsLTcwLjQyNzEgNTQuMjUwNCwtNjcuNTcyOSA1Mi4yNTkzLC01OCA0OS44NjU0LC00Ni40OTAxIDQ0LjQzNDUsLTM0LjMyNzQgMzkuODM1NCwtMjUuNDAxMSIvPg0KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNDEuMjgyMSwtMjQuMzk0IDM3LjM5MDUsLTIwLjc5OTggMzguMTkxMywtMjYuMDM2MyA0MS4yODIxLC0yNC4zOTQiLz4NCjwvZz4NCjwhLS0gYm9keTImIzQ1OyZndDtleGl0MSAtLT4NCjxnIGlkPSJlZGdlMTIiIGNsYXNzPSJlZGdlIj48dGl0bGU+Ym9keTImIzQ1OyZndDtleGl0MTp3PC90aXRsZT4NCjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik0yNy41NDYyLC03OS4wMjM5QzE0LjQ0ODIsLTEwNC45NjkgLTE5LjIzMTEsLTE3OC4zMTggMTUuMjAxNSwtMTg0LjU3NCIvPg0KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMTUuMTI5OSwtMTg2LjMyNCAyMC4yNTkzLC0xODUgMTUuNDI0MSwtMTgyLjgzNiAxNS4xMjk5LC0xODYuMzI0Ii8+DQo8L2c+DQo8IS0tIGJvZHkyJiM0NTsmZ3Q7b3V0IC0tPg0KPCEtLSBlbnRyeTEgLS0+DQo8ZyBpZD0ibm9kZTEzIiBjbGFzcz0ibm9kZSI+PHRpdGxlPmVudHJ5MTwvdGl0bGU+DQo8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBjeD0iMTg2LjI1OSIgY3k9Ii0xMjciIHJ4PSIxMSIgcnk9IjExIi8+DQo8L2c+DQo8IS0tIHRvcCYjNDU7Jmd0O2VudHJ5MSAtLT4NCjxnIGlkPSJlZGdlMTciIGNsYXNzPSJlZGdlIj48dGl0bGU+dG9wJiM0NTsmZ3Q7ZW50cnkxPC90aXRsZT4NCjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik0xODYuMjU5LC0xNzMuOTg4QzE4Ni4yNTksLTE2NS40OTQgMTg2LjI1OSwtMTUzLjE3IDE4Ni4yNTksLTE0My40MTciLz4NCjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjE4OC4wMDksLTE0My4zMDQgMTg2LjI1OSwtMTM4LjMwNCAxODQuNTA5LC0xNDMuMzA0IDE4OC4wMDksLTE0My4zMDQiLz4NCjwvZz4NCjwhLS0gZW50cnkyIC0tPg0KPGcgaWQ9Im5vZGUxNSIgY2xhc3M9Im5vZGUiPjx0aXRsZT5lbnRyeTI8L3RpdGxlPg0KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgY3g9IjE4Ni4yNTkiIGN5PSItNjkiIHJ4PSIxMSIgcnk9IjExIi8+DQo8L2c+DQo8IS0tIHRvcCYjNDU7Jmd0O2VudHJ5MiAtLT4NCjxnIGlkPSJlZGdlMTkiIGNsYXNzPSJlZGdlIj48dGl0bGU+dG9wJiM0NTsmZ3Q7ZW50cnkyOnc8L3RpdGxlPg0KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTE4MS41NDYsLTE3NC45NzZDMTY4LjQ0OCwtMTQ5LjAzMSAxMzQuNzY5LC03NS42ODIgMTY5LjIwMiwtNjkuNDI2NSIvPg0KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMTY5LjQyNCwtNzEuMTY0IDE3NC4yNTksLTY5IDE2OS4xMywtNjcuNjc2NCAxNjkuNDI0LC03MS4xNjQiLz4NCjwvZz4NCjwhLS0gb3V0MiAtLT4NCjxnIGlkPSJub2RlMTQiIGNsYXNzPSJub2RlIj48dGl0bGU+b3V0MjwvdGl0bGU+DQo8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBjeD0iMTg2LjI1OSIgY3k9Ii0xMSIgcng9IjExIiByeT0iMTEiLz4NCjwvZz4NCjwhLS0gZW50cnkxJiM0NTsmZ3Q7b3V0MiAtLT4NCjxnIGlkPSJlZGdlMTgiIGNsYXNzPSJlZGdlIj48dGl0bGU+ZW50cnkxJiM0NTsmZ3Q7b3V0MjwvdGl0bGU+DQo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMTkxLjM5MSwtMTE3LjJDMTk2LjMxOSwtMTA4LjIgMjAzLjQyMiwtOTMuNjQxMyAyMDYuMjU5LC04MCAyMDguMjUsLTcwLjQyNzEgMjA4LjI1LC02Ny41NzI5IDIwNi4yNTksLTU4IDIwMy44NjUsLTQ2LjQ5MDEgMTk4LjQzNSwtMzQuMzI3NCAxOTMuODM1LC0yNS40MDExIi8+DQo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIxOTUuMjgyLC0yNC4zOTQgMTkxLjM5MSwtMjAuNzk5OCAxOTIuMTkxLC0yNi4wMzYzIDE5NS4yODIsLTI0LjM5NCIvPg0KPC9nPg0KPCEtLSBlbnRyeTEmIzQ1OyZndDtlbnRyeTIgLS0+DQo8ZyBpZD0iZWRnZTIwIiBjbGFzcz0iZWRnZSI+PHRpdGxlPmVudHJ5MSYjNDU7Jmd0O2VudHJ5MjwvdGl0bGU+DQo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMTg2LjI1OSwtMTE1Ljk4OEMxODYuMjU5LC0xMDcuNDk0IDE4Ni4yNTksLTk1LjE2OTcgMTg2LjI1OSwtODUuNDE2OSIvPg0KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMTg4LjAwOSwtODUuMzAzOCAxODYuMjU5LC04MC4zMDM5IDE4NC41MDksLTg1LjMwMzkgMTg4LjAwOSwtODUuMzAzOCIvPg0KPC9nPg0KPCEtLSBlbnRyeTImIzQ1OyZndDtlbnRyeTEgLS0+DQo8ZyBpZD0iZWRnZTIxIiBjbGFzcz0iZWRnZSI+PHRpdGxlPmVudHJ5MiYjNDU7Jmd0O2VudHJ5MTp3PC90aXRsZT4NCjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik0xODAuNzQ0LC03OC45MDYzQzE3Mi4zMzQsLTkzLjE4NDEgMTU4LjM1OSwtMTIwLjE3OCAxNjkuMTIsLTEyNS45MTIiLz4NCjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjE2OS4wMDUsLTEyNy42NzcgMTc0LjI1OSwtMTI3IDE2OS43MywtMTI0LjI1MyAxNjkuMDA1LC0xMjcuNjc3Ii8+DQo8L2c+DQo8IS0tIGVudHJ5MiYjNDU7Jmd0O291dDIgLS0+DQo8L2c+DQo8L3N2Zz4NCg==" width="288" height="524" class="img_ev3q"></p></center>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-formula-behind-cyclomatic-complexity">The Formula Behind Cyclomatic Complexity<a href="https://dcm.dev/blog/2026/04/01/cyclomatic-complexity-flutter-dcm/#the-formula-behind-cyclomatic-complexity" class="hash-link" aria-label="Direct link to The Formula Behind Cyclomatic Complexity" title="Direct link to The Formula Behind Cyclomatic Complexity" translate="no">​</a></h3>
<p>If you model a function as a <a href="https://en.wikipedia.org/wiki/Control-flow_graph" target="_blank" rel="noopener noreferrer" class=""><strong>control-flow graph</strong></a> (nodes are blocks of code, edges are possible jumps), cyclomatic complexity can be computed directly from that graph:</p>
<center><strong>C = E - N + 2P</strong></center>
<ul>
<li class=""><strong>E</strong>: number of edges in the graph</li>
<li class=""><strong>N</strong>: number of nodes in the graph</li>
<li class=""><strong>P</strong>: number of connected components (for a single function, usually <strong>P = 1</strong>)</li>
</ul>
<p>For most single methods, this simplifies to <strong>C = E - N + 2</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-cyclomatic-complexity-is-important">Why Cyclomatic Complexity Is Important<a href="https://dcm.dev/blog/2026/04/01/cyclomatic-complexity-flutter-dcm/#why-cyclomatic-complexity-is-important" class="hash-link" aria-label="Direct link to Why Cyclomatic Complexity Is Important" title="Direct link to Why Cyclomatic Complexity Is Important" translate="no">​</a></h3>
<p>You can usually feel when a method is getting out of hand, but that feeling is subjective. One reviewer says, "this is too complex," another says, "it's fine." Metrics make that conversation objective. Instead of debating that can happen between you and team members, you can point to a cyclomatic complexity score of <strong>15</strong> and compare it to your team's agreed threshold of <strong>10</strong>. In this case, all will have an objective goal for this metric and will have common understanding and agreement.</p>
<p>DCM, in Flutter and Dart world, ships with built-in <a href="https://dcm.dev/docs/metrics" target="_blank" rel="noopener noreferrer" class="">metrics</a> to surface this problem early.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-dcm-counts-cyclomatic-complexity-in-dart">How DCM Counts Cyclomatic Complexity in Dart<a href="https://dcm.dev/blog/2026/04/01/cyclomatic-complexity-flutter-dcm/#how-dcm-counts-cyclomatic-complexity-in-dart" class="hash-link" aria-label="Direct link to How DCM Counts Cyclomatic Complexity in Dart" title="Direct link to How DCM Counts Cyclomatic Complexity in Dart" translate="no">​</a></h3>
<p><a href="https://dcm.dev/docs/metrics/function/cyclomatic-complexity/" target="_blank" rel="noopener noreferrer" class="">In DCM's implementation of Cyclomatic Complexity for Flutter and Dart</a>, a function starts with a <strong>base complexity of 1</strong> (the "happy path"), then adds one for each of the following:</p>
<table><thead><tr><th>Construct</th><th>Example</th></tr></thead><tbody><tr><td>Control-flow statements &amp; expressions</td><td><code>if</code>, <code>for</code>, <code>while</code>, <code>do</code>, <code>catch</code> (both statement and expression forms, e.g. collection <code>if</code> / <code>for</code>)</td></tr><tr><td>Conditional expressions</td><td><code>condition ? a : b</code></td></tr><tr><td><code>case</code> clauses</td><td>each <code>case</code> in a <code>switch</code> statement or expression</td></tr><tr><td>Logical operators (expressions)</td><td><code>a &amp;&amp; b</code>, <code>a || b</code></td></tr><tr><td>Logical patterns</td><td><code>&gt;= 0 &amp;&amp; &lt;= 10</code>, <code>1 || 2</code> (in pattern-matching contexts like <code>switch</code> or <code>if-case</code>)</td></tr><tr><td>Null-aware operators</td><td><code>?[]</code>, <code>?.</code>, <code>?..</code>, <code>...?</code>, <code>{?key: value}</code>, <code>{key: ?value}</code></td></tr><tr><td>Coalescing operators</td><td><code>??</code>, <code>??=</code></td></tr></tbody></table>
<p>Note that <code>else</code>, <code>finally</code>, and <code>default</code> or last <code>case</code> don't add to the count — they're the fallback path, not a new decision.</p>
<img src="https://dcm.dev/blog/2026-04-01/cyclomatic-dcm-light.webp" alt="Challenges" class="themedComponent_mlkZ themedComponent--light_NVdE" width="2689" height="862" style="margin-bottom:20px;height:auto"><img src="https://dcm.dev/blog/2026-04-01/cyclomatic-dcm-dark.webp" alt="Challenges" class="themedComponent_mlkZ themedComponent--dark_xIcU" width="2689" height="862" style="margin-bottom:20px;height:auto">
<p>Think of it like a road map. A straight highway has complexity 1. Add a traffic circle with two exits, you're at 2.</p>
<p>Throw in conditional toll lanes based on time of day? Complexity climbs fast. The more intersections, the harder it is to mentally trace all possible routes and the harder it is to write tests that cover them.</p>
<blockquote>
<p>In the HTML report, DCM shows which lines contribute to the cyclomatic complexity score, so you can see where the complexity is coming from. The video below shows what that looks like:</p>
</blockquote>
<video width="100%" controls="" autoplay="" loop="" playsinline=""><source src="/video/cyclomatic-showcase.mp4"></video>
<p>But only theory is not enough, let's get into more practical details in Flutter to see how you can address and tackle these issues.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-flutter-code-gets-too-complex">Where Flutter Code Gets Too Complex<a href="https://dcm.dev/blog/2026/04/01/cyclomatic-complexity-flutter-dcm/#where-flutter-code-gets-too-complex" class="hash-link" aria-label="Direct link to Where Flutter Code Gets Too Complex" title="Direct link to Where Flutter Code Gets Too Complex" translate="no">​</a></h2>
<p>Flutter's declarative UI style pushes developers toward composing small widgets, but tight deadlines and evolving requirements often produce these complexity hotspots:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-giant-build-methods">1. Giant <code>build</code> Methods<a href="https://dcm.dev/blog/2026/04/01/cyclomatic-complexity-flutter-dcm/#1-giant-build-methods" class="hash-link" aria-label="Direct link to 1-giant-build-methods" title="Direct link to 1-giant-build-methods" translate="no">​</a></h3>
<p>The most common offender. A single <code>build</code> method accumulates feature flags, A/B tests, theme checks, and conditional children until it becomes a wall of nested ternaries.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> theme </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Theme</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">of</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> isDark </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> theme</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">brightness </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Brightness</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">dark</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> platform </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> theme</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">platform</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> isPremium </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> user</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">subscription</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">isActive </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">!</span><span class="token plain">user</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">isBanned</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> canShare </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> featureFlags</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">shareEnabled </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> platform </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TargetPlatform</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">iOS</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> canDownload </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> featureFlags</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">downloadEnabled </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> platform </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TargetPlatform</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">android</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Scaffold</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    appBar</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AppBar</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      title</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">isPremium </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Pro Dashboard'</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Dashboard'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    body</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Padding</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      padding</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">EdgeInsets</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">16</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Column</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">isPremium</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token class-name" style="color:#7fdbca">PremiumBanner</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">user</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> user</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token keyword" style="color:#00bff9">else</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token class-name" style="color:#7fdbca">UpgradeBanner</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">canShare </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">!</span><span class="token plain">isDark</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token class-name" style="color:#7fdbca">ShareTile</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">onTap</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_share</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">user</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token keyword" style="color:#00bff9">else</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">canDownload </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> isDark</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token class-name" style="color:#7fdbca">DownloadTile</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">onTap</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_download</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">user</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token keyword" style="color:#00bff9">else</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">shrink</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">isPremium </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> canDownload </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> canShare</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Unlock all features!'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token class-name" style="color:#7fdbca">OrderList</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            orders</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> orders</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            onTap</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">order</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">order</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">isRefunded</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token function" style="color:#87aff4">_showRefund</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">order</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">else</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">order</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">isPending </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> isPremium</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token function" style="color:#87aff4">_expedite</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">order</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">else</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">order</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">isGift </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> canShare</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token function" style="color:#87aff4">_shareGift</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">order</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token function" style="color:#87aff4">_openDetails</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">order</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>Just to understand how many branches this method has, let's just look at control-flow-graph of this method:</p>
<img src="https://dcm.dev/blog/2026-04-01/complex-build-light.webp" alt="Challenges" class="themedComponent_mlkZ themedComponent--light_NVdE" width="2689" height="862" style="margin-bottom:20px;height:auto"><img src="https://dcm.dev/blog/2026-04-01/complex-build-dark.webp" alt="Challenges" class="themedComponent_mlkZ themedComponent--dark_xIcU" width="2689" height="862" style="margin-bottom:20px;height:auto">
<p>You see how complex and confusing it is! Even its not readable and even if you try to make it readable still you will loose the context after some branches.</p>
<p>Cyclomatic complexity for the example above is <strong>18</strong>. If your team uses a threshold of <strong>10</strong>, this method is clearly over it.</p>
<p>Let's now see how to fix it.</p>
<ul>
<li class="">
<p>Step 1: Extract conditional UI into helpers/child widgets:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">get</span><span class="token plain"> _actionTile </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_canShare </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">!</span><span class="token plain">_isDark</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ShareTile</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">onTap</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_share</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">user</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_canDownload </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> _isDark</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DownloadTile</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">onTap</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_download</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">user</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">shrink</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>I personally recommend extracting that into a dedicated widget:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ActionTile</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> canShare</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> canDownload</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> isDark</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">VoidCallback</span><span class="token plain"> onShare</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">VoidCallback</span><span class="token plain"> onDownload</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ActionTile</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">canShare</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">canDownload</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">isDark</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">onShare</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">onDownload</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">canShare </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">!</span><span class="token plain">isDark</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ShareTile</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">onTap</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> onShare</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">canDownload </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> isDark</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DownloadTile</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">onTap</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> onDownload</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">shrink</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// Usage inside build</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">get</span><span class="token plain"> _actionTile </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ActionTile</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  canShare</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _canShare</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  canDownload</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _canDownload</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  isDark</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _isDark</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  onShare</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_share</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">user</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  onDownload</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_download</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">user</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
</li>
<li class="">
<p>Step 2: Move <code>onTap</code> logic into a named method with guard clauses:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_handleOrderTap</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Order</span><span class="token plain"> o</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">o</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">isRefunded</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_showRefund</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">o</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">o</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">isPending </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> _isPremium</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_expedite</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">o</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">o</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">isGift </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> _canShare</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_shareGift</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">o</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token function" style="color:#87aff4">_openDetails</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">o</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
</li>
</ul>
<p>After these refactors, the <code>build</code> typically drops to <strong>~1–3</strong>, and each helper stays under <strong>~3–6</strong>.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// A complete refactored build using the extracted helpers</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Scaffold</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    appBar</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AppBar</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">title</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_isPremium </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Pro Dashboard'</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Dashboard'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    body</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Padding</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      padding</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">EdgeInsets</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">16</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Column</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          _banner</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          _actionTile</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          _unlockLabel</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token class-name" style="color:#7fdbca">OrderList</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">orders</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> orders</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> onTap</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _handleOrderTap</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="COC after refactoring" src="https://dcm.dev/assets/images/coc-after-4091654248e632b5768eb849bfd23741.webp" width="1978" height="1094" class="img_ev3q"></p>
<p>Let me repeat one of my notes above again as it's important. Extracting UI into function getters is a good stepping stone, but the stronger approach is to extract into dedicated widgets. Widgets encapsulate state, enable focused tests, and keep <code>build</code> focused on composition.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-inline-onpressed-handlers">2. Inline <code>onPressed</code> Handlers<a href="https://dcm.dev/blog/2026/04/01/cyclomatic-complexity-flutter-dcm/#2-inline-onpressed-handlers" class="hash-link" aria-label="Direct link to 2-inline-onpressed-handlers" title="Direct link to 2-inline-onpressed-handlers" translate="no">​</a></h3>
<p>It's generally not a good idea to put business-logics in callbacks! Yet it's tempting to toss validation, network calls, and error handling right into the button:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">ElevatedButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  onPressed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token operator" style="color:#00bff9">!</span><span class="token plain">_formKey</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">currentState</span><span class="token operator" style="color:#00bff9">!</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">validate</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token function" style="color:#87aff4">_showSnackBar</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Please fix the errors'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">return</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">quota</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">remaining </span><span class="token operator" style="color:#00bff9">&lt;=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token function" style="color:#87aff4">_showSnackBar</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Daily limit reached'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">return</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">connectivity</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">isOffline </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> featureFlags</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">offlineMode</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token function" style="color:#87aff4">_queueForLater</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token function" style="color:#87aff4">_submitNow</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Submit'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><br></span></code></pre></div></div>
<p>Three decision points hiding inside a widget tree. This makes the UI file harder to scan and the logic harder to test.</p>
<p>Here are few points to refactor the callback above:</p>
<ul>
<li class=""><strong>Extract to a named method:</strong> Keep widget trees easy to scan and move branching into a private method.</li>
<li class=""><strong>Use guard clauses:</strong> Return early on invalid states to keep nesting flat.</li>
<li class=""><strong>Separate concerns:</strong> Push side effects (network, storage) into a service so the handler orchestrates only.</li>
<li class=""><strong>Keep callbacks small:</strong> The example above already scores <strong>5</strong> (three <code>if</code>s + one <code>&amp;&amp;</code>), and that is enough branching to make an inline handler harder to scan.</li>
<li class=""><strong>Leverage DCM rules:</strong> Enable <a href="https://dcm.dev/docs/rules/flutter/prefer-extracting-callbacks/" target="_blank" rel="noopener noreferrer" class=""><code>prefer-extracting-callbacks</code></a> to flag long inline handlers in PRs.</li>
</ul>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// In your widget class</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics keyword" style="color:#00bff9">void</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_handleSubmit</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token operator" style="color:#00bff9">!</span><span class="token plain">_formKey</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">currentState</span><span class="token operator" style="color:#00bff9">!</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">validate</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_showSnackBar</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Please fix the errors'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">quota</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">remaining </span><span class="token operator" style="color:#00bff9">&lt;=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_showSnackBar</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Daily limit reached'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">connectivity</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">isOffline </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> featureFlags</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">offlineMode</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_queueForLater</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> _submitService</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">submit</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">formData</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token function" style="color:#87aff4">_showSnackBar</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Submitted'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token function" style="color:#87aff4">_showSnackBar</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Something went wrong'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ElevatedButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    onPressed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _handleSubmit</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Submit'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>If the handler grows, split responsibilities further:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SubmitService</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Connectivity</span><span class="token plain"> connectivity</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">FeatureFlags</span><span class="token plain"> featureFlags</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">SubmitService</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">connectivity</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">featureFlags</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics keyword" style="color:#00bff9">void</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">routeSubmit</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">FormData</span><span class="token plain"> data</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> quota</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">quota </span><span class="token operator" style="color:#00bff9">&lt;=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">throw</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">QuotaExceeded</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">connectivity</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">isOffline </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> featureFlags</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">offlineMode</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">queueForLater</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">data</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">submitNow</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">data</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics keyword" style="color:#00bff9">void</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_handleSubmit</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token operator" style="color:#00bff9">!</span><span class="token plain">_formKey</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">currentState</span><span class="token operator" style="color:#00bff9">!</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">validate</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_showSnackBar</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Please fix the errors'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> _service</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">routeSubmit</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">data</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> formData</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> quota</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> quota</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">remaining</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token function" style="color:#87aff4">_showSnackBar</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Submitted'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">on</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">QuotaExceeded</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token function" style="color:#87aff4">_showSnackBar</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Daily limit reached'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token function" style="color:#87aff4">_showSnackBar</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Something went wrong'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>Callbacks should read like a checklist, "validate → route → submit", with one or two decision points at most.</p>
<p>Let dedicated services own the complex paths.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-feature-flags-and-platform-branches">3. Feature Flags and Platform Branches<a href="https://dcm.dev/blog/2026/04/01/cyclomatic-complexity-flutter-dcm/#3-feature-flags-and-platform-branches" class="hash-link" aria-label="Direct link to 3. Feature Flags and Platform Branches" title="Direct link to 3. Feature Flags and Platform Branches" translate="no">​</a></h3>
<p>Cross-platform apps and gradual rollouts inevitably introduce conditions: "show this button on iOS only," "enable dark mode experiment for 10% of users." Each flag is another fork in the road.</p>
<p>Generally, I may recall two patterns for refactoring here:</p>
<ul>
<li class=""><strong>Centralize flag logic:</strong> Resolve feature/platform conditions in one place.</li>
<li class=""><strong>Widgetize branches:</strong> Return small widgets from a map instead of <code>if/else</code> pyramids.</li>
</ul>
<p>Let's see an example below extracted from one of my projects:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">FeatureResolver</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TargetPlatform</span><span class="token plain"> platform</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> isDark</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">FeatureFlags</span><span class="token plain"> flags</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">FeatureResolver</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">platform</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">isDark</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">flags</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">get</span><span class="token plain"> canShare </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> flags</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">shareEnabled </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> platform </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TargetPlatform</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">iOS </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">!</span><span class="token plain">isDark</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">get</span><span class="token plain"> canDownload </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> flags</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">downloadEnabled </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> platform </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TargetPlatform</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">android </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> isDark</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ActionTile</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">FeatureResolver</span><span class="token plain"> r</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">User</span><span class="token plain"> user</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ActionTile</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">r</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">user</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> builders </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">WidgetBuilder</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token string-literal string" style="color:#e1ffe4">'ios-light-share'</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ShareTile</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">onTap</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_share</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">user</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token string-literal string" style="color:#e1ffe4">'android-dark-download'</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DownloadTile</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">onTap</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_download</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">user</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> key </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> r</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">canShare</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'ios-light-share'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">r</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">canDownload </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'android-dark-download'</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'none'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> builders</span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token operator" style="color:#00bff9">?</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">call</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">?</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">shrink</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_share</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">User</span><span class="token plain"> u</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token comment" style="color:#999999">/* ... */</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_download</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">User</span><span class="token plain"> u</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token comment" style="color:#999999">/* ... */</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// Usage inside build</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">get</span><span class="token plain"> _actionTile </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ActionTile</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  r</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">FeatureResolver</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Theme</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">of</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">platform</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> _isDark</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> featureFlags</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  user</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> user</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>This collapses multiple branches into a single decision key, making <code>build</code> easier to scan and maintain.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-ad-hoc-setstate-flows">4. Ad-hoc <code>setState</code> Flows<a href="https://dcm.dev/blog/2026/04/01/cyclomatic-complexity-flutter-dcm/#4-ad-hoc-setstate-flows" class="hash-link" aria-label="Direct link to 4-ad-hoc-setstate-flows" title="Direct link to 4-ad-hoc-setstate-flows" translate="no">​</a></h3>
<p>Manual state management often leads to guard clauses checking <code>mounted</code>, current state, and async completion:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">Future</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics keyword" style="color:#00bff9">void</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_loadData</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_isLoading</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">return</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token function" style="color:#87aff4">setState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> _isLoading </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> data </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> repository</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">fetch</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token operator" style="color:#00bff9">!</span><span class="token plain">mounted</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">return</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">data</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">isEmpty </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> _retryCount </span><span class="token operator" style="color:#00bff9">&lt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">3</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      _retryCount</span><span class="token operator" style="color:#00bff9">++</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_loadData</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token function" style="color:#87aff4">setState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      _items </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> data</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      _isLoading </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token operator" style="color:#00bff9">!</span><span class="token plain">mounted</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">return</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token function" style="color:#87aff4">setState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> _error </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> e</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">toString</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>Six or more branches in a single async method, easy to misread and easy to break.</p>
<p>To refactor such scenario, you can:</p>
<ul>
<li class=""><strong>Extract a loader method:</strong> Keep <code>build</code> clean; move branching to a private method.</li>
<li class=""><strong>Guard clauses over nesting:</strong> Return early on busy, unmounted, empty, or error states.</li>
<li class=""><strong>Introduce a simple state enum:</strong> Replace multiple booleans with <code>LoadingState</code> to reduce condition combos.</li>
<li class=""><strong>Avoid recursive retries:</strong> Use a loop or counter + early returns for clarity.</li>
</ul>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">enum</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">LoadingState</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"> idle</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> loading</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> loaded</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> error </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_ViewModel</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> retryCount </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">LoadingState</span><span class="token plain"> state </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">LoadingState</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">idle</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Item</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> items </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> error</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> _vm </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_ViewModel</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics keyword" style="color:#00bff9">void</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_loadData</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token operator" style="color:#00bff9">!</span><span class="token plain">mounted</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">return</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// guard mounted first</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_vm</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">state </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">LoadingState</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">loading</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">return</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// avoid duplicate loads</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token function" style="color:#87aff4">setState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> _vm</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">state </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">LoadingState</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">loading</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> data </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> repository</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">fetch</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token operator" style="color:#00bff9">!</span><span class="token plain">mounted</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">return</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// guard after await</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">data</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">isEmpty </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> _vm</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">retryCount </span><span class="token operator" style="color:#00bff9">&lt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">3</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      _vm</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">retryCount</span><span class="token operator" style="color:#00bff9">++</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token function" style="color:#87aff4">setState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> _vm</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">state </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">LoadingState</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">idle</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">return</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// let caller decide when to call again</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token function" style="color:#87aff4">setState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      _vm</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">items </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> data</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      _vm</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">state </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">LoadingState</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">loaded</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token operator" style="color:#00bff9">!</span><span class="token plain">mounted</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">return</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token function" style="color:#87aff4">setState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      _vm</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">error </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> e</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">toString</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      _vm</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">state </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">LoadingState</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">error</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">get</span><span class="token plain"> _body </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_vm</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">state</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">LoadingState</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">loading </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Center</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CircularProgressIndicator</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">LoadingState</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">error </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ErrorView</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">message</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _vm</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">error </span><span class="token operator" style="color:#00bff9">?</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Unknown error'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">LoadingState</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">loaded </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ItemsList</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">items</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _vm</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">items</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> onRefresh</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _loadData</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  _ </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">EmptyView</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">onRefresh</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _loadData</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>This flattens control flow, avoids recursion, and funnels UI rendering through a single state. In practice, the method’s cyclomatic complexity drops to <strong>~4–6</strong>.</p>
<p><img decoding="async" loading="lazy" alt="COC result" src="https://dcm.dev/assets/images/coc-result-15e8b34749638cd6f14afddc7604b8c7.webp" width="2502" height="1648" class="img_ev3q"></p>
<p>All of these can definitely be flag by DCM and let's see how you can leverage that!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="measuring-complexity-with-dcm">Measuring Complexity with DCM<a href="https://dcm.dev/blog/2026/04/01/cyclomatic-complexity-flutter-dcm/#measuring-complexity-with-dcm" class="hash-link" aria-label="Direct link to Measuring Complexity with DCM" title="Direct link to Measuring Complexity with DCM" translate="no">​</a></h2>
<p>Here's how to set it up.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-add-dcm-to-your-project">1. Add DCM to Your Project<a href="https://dcm.dev/blog/2026/04/01/cyclomatic-complexity-flutter-dcm/#1-add-dcm-to-your-project" class="hash-link" aria-label="Direct link to 1. Add DCM to Your Project" title="Direct link to 1. Add DCM to Your Project" translate="no">​</a></h3>
<p>If you haven't already, install DCM following the <a href="https://dcm.dev/docs/getting-started/" target="_blank" rel="noopener noreferrer" class="">getting-started guide</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-configure-the-threshold">2. Configure the Threshold<a href="https://dcm.dev/blog/2026/04/01/cyclomatic-complexity-flutter-dcm/#2-configure-the-threshold" class="hash-link" aria-label="Direct link to 2. Configure the Threshold" title="Direct link to 2. Configure the Threshold" translate="no">​</a></h3>
<p>Open (or create) <code>analysis_options.yaml</code> and add a metrics block:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">analysis_options.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">metrics</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">cyclomatic-complexity</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule" style="color:#6dbdfa">threshold</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">10</span><br></span></code></pre></div></div>
<p>The <code>threshold</code> key tells DCM: "warn me when any function exceeds this number."</p>
<p>The default is 15. In this post, we use 10 as a stricter threshold.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-run-the-analysis">3. Run the Analysis<a href="https://dcm.dev/blog/2026/04/01/cyclomatic-complexity-flutter-dcm/#3-run-the-analysis" class="hash-link" aria-label="Direct link to 3. Run the Analysis" title="Direct link to 3. Run the Analysis" translate="no">​</a></h3>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token builtin class-name" style="color:#7fdbca">dcm</span><span class="token plain"> calculate-metrics </span><span class="token function" style="color:#87aff4">lib</span><br></span></code></pre></div></div>
<p>DCM outputs a per-function report. Functions exceeding the threshold appear in the results, along with their exact complexity score.</p>
<p>Here is an example output:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">~/.../flutter_test_cases on main ✗  &gt; dcm calculate-metrics lib/metrics/cyclomatic.dart</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">✔ Calculation is completed. Preparing the results: 29ms</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">lib/metrics/cyclomatic.dart:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    • function build (1 entry):</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      HIGH      This function has cyclomatic complexity of 18, which exceeds the threshold of 10.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                cyclomatic-complexity : https://dcm.dev/docs/metrics/function/cyclomatic-complexity</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Scanned folders: 1</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Scanned files: 1</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Scanned classes: 0</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Name                       Min   Max   Avg   Sum</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">cyclomatic-complexity  1  18.0  18.0  18.0  18.0</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">To view all metric values, pass the "--report-all" flag</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">To get a more detailed report, pass the "--reporter=html" option</span><br></span></code></pre></div></div>
<p>Here is a screenshot to show the full report when combined with other metrics and more files to be scanned:</p>
<p><img decoding="async" loading="lazy" alt="metric report" src="https://dcm.dev/assets/images/cyclomatic-report-faa42880e61908393d13b18a57c0a5cc.webp" width="2100" height="1358" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="interpreting-the-numbers">Interpreting the Numbers<a href="https://dcm.dev/blog/2026/04/01/cyclomatic-complexity-flutter-dcm/#interpreting-the-numbers" class="hash-link" aria-label="Direct link to Interpreting the Numbers" title="Direct link to Interpreting the Numbers" translate="no">​</a></h3>
<p>The exact number is a team decision and please consult with each other to land on a proper score. If you use 10 as the threshold which we did in this blog post, a practical way to read the numbers is:</p>
<table><thead><tr><th>Range</th><th>Guidance</th></tr></thead><tbody><tr><td>1–5</td><td>Simple, easy to test</td></tr><tr><td>6–10</td><td>Still manageable, but watch it</td></tr><tr><td>11–15</td><td>Over the threshold, refactor</td></tr><tr><td>16+</td><td>High complexity, split or simplify</td></tr></tbody></table>
<p>A single-digit score usually means the function does one thing well. Once a function moves past 10, it is already a refactoring target for teams using that stricter threshold.</p>
<p>Note, the default value from DCM is 15 so you can adjust this interpretation based on your score.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="refactoring-checklist">Refactoring Checklist<a href="https://dcm.dev/blog/2026/04/01/cyclomatic-complexity-flutter-dcm/#refactoring-checklist" class="hash-link" aria-label="Direct link to Refactoring Checklist" title="Direct link to Refactoring Checklist" translate="no">​</a></h2>
<p>The earlier sections already show the detailed examples. Here is the short version:</p>
<ol>
<li class="">
<p><strong>Keep <code>build</code> small.</strong> Push branching into helper getters (I do not recommend this but it's one way of doing it) or child widgets. If your <code>build</code> keeps growing, split it.</p>
</li>
<li class="">
<p><strong>Extract callbacks.</strong> Name the intent (<code>_handleSubmit</code>, <code>_onItemTap</code>) and move branching out of inline handlers.</p>
</li>
<li class="">
<p><strong>Favor guard clauses.</strong> <code>if (bad) return;</code> keeps control flow flatter than long <code>else</code> ladders.</p>
</li>
<li class="">
<p><strong>Centralize repeated conditions.</strong> Move feature-flag, platform, or state checks into small helpers or resolver objects when it improves readability.</p>
</li>
<li class="">
<p><strong>Measure again after refactoring.</strong> Re-run <code>dcm calculate-metrics lib</code> and confirm the score actually dropped.</p>
</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="pair-with-related-rules">Pair with Related Rules<a href="https://dcm.dev/blog/2026/04/01/cyclomatic-complexity-flutter-dcm/#pair-with-related-rules" class="hash-link" aria-label="Direct link to Pair with Related Rules" title="Direct link to Pair with Related Rules" translate="no">​</a></h3>
<p>Complexity often correlates with other smells. Enable complementary DCM rules:</p>
<ul>
<li class="">
<p><a href="https://dcm.dev/docs/rules/common/avoid-high-cyclomatic-complexity/" target="_blank" rel="noopener noreferrer" class=""><code>avoid-high-cyclomatic-complexity</code></a>: warns when a function or method exceeds the configured cyclomatic complexity threshold.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">rules</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">avoid-high-cyclomatic-complexity</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">threshold</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">10</span><br></span></code></pre></div></div>
</li>
<li class="">
<p><a href="https://dcm.dev/docs/rules/flutter/prefer-extracting-callbacks/" target="_blank" rel="noopener noreferrer" class=""><code>prefer-extracting-callbacks</code></a>: flags inline handlers longer than N lines.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule" style="color:#6dbdfa">rules</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">prefer-extracting-callbacks</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule" style="color:#6dbdfa">allowed-line-count</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule" style="color:#6dbdfa">ignored-named-arguments</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> onPressed</span><br></span></code></pre></div></div>
<p>Here is a good example:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyWidget</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      style</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      onPressed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">handlePressed</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">handlePressed</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyWidget</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      style</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      onPressed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> handlePressed</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">handlePressed</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p><a href="https://www.youtube.com/watch?v=iJFVm8j48O8" target="_blank" rel="noopener noreferrer" class="">Watch our video to learn more about this rule.</a></p>
</li>
<li class="">
<p><a href="https://dcm.dev/docs/rules/flutter/prefer-single-widget-per-file/" target="_blank" rel="noopener noreferrer" class=""><code>prefer-single-widget-per-file</code></a>: encourages small, focused widget files. You can also configure this rule!</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">rules</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">prefer-single-widget-per-file</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">ignore-visible-for-testing</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#8dec95">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">ignore-private-widgets</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#8dec95">true</span><br></span></code></pre></div></div>
<p>Then for this configuration with private widget being ignored, the good example would be:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeWidget</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// Correct, private widgets are ignored</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_SomeOtherWidget</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p><a href="https://www.youtube.com/watch?v=xa4zMwpXrr8" target="_blank" rel="noopener noreferrer" class="">Watch our video to learn more about this rule.</a></p>
</li>
<li class="">
<p>Nesting-level metrics like <a href="https://dcm.dev/docs/metrics/function/maximum-nesting-level/" target="_blank" rel="noopener noreferrer" class=""><code>maximum-nesting-level</code></a>: catches deep <code>if</code> pyramids even if raw complexity is moderate.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">metrics</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">maximum-nesting-level</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule" style="color:#6dbdfa">threshold</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">...</span><br></span></code></pre></div></div>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://dcm.dev/blog/2026/04/01/cyclomatic-complexity-flutter-dcm/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Cyclomatic Complexity is a leading indicator of maintenance pain. High-complexity functions hide bugs, resist testing, and slow down code reviews.</p>
<p>Start measuring it. Configure a threshold in DCM, run the analysis, and work through the worst offenders first.</p>
<p>This matters even more as the codebase grows or when the team has a wider range of experience levels. More code means more places for complex methods to accumulate, and less experienced developers will have a harder time reviewing and changing them safely.</p>
<p>Happy coding!</p>
<div class="formWrapper_FeQU"><p class="formTitle_o9oT">Enjoying this article?</p><p>Subscribe to get our latest articles and product updates by email.</p><form class="footerForm_u4Zn"><input class="trialInput_rT6u" type="email" placeholder="Email address" name="blogEmail"><button type="submit" class="button button--primary button--sm formButton_cuTv">Subscribe</button></form></div>]]></content>
        <author>
            <name>Majid Hajian</name>
            <uri>https://dcm.dev</uri>
        </author>
        <category label="blog" term="blog"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Riverpod Best Practices You're Probably Missing]]></title>
        <id>https://dcm.dev/blog/2026/03/25/inside-riverpod-source-code-guide-dcm-rules/</id>
        <link href="https://dcm.dev/blog/2026/03/25/inside-riverpod-source-code-guide-dcm-rules/"/>
        <updated>2026-03-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Learn how the Riverpod package works by reading its source code. Understand the architecture behind Flutter reactive state management and discover why certain patterns prevent bugs, memory leaks, and unexpected behaviors.]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="Cover" src="https://dcm.dev/assets/images/2026-03-25-cover-176823066fd203e43abc6c58e3680cc4.jpg" width="1050" height="561" class="img_ev3q"></p>
<p>If you've been building Flutter apps for a while, you've almost certainly encountered <a href="https://pub.dev/packages/riverpod" target="_blank" rel="noopener noreferrer" class="">Riverpod</a>. It's become one of the most popular state management solutions in the Flutter ecosystem, offering a reactive caching and data-binding framework that addresses many of the limitations found in other approaches.</p>
<p>That popularity is also exactly why easy mistakes can show up! The classic "my widget isn't rebuilding" bug, stale notifier references after async gaps, unnecessary subscriptions that waste resources, or memory leaks from undisposed instances, these are all common issues that can silently degrade your app's performance and reliability.</p>
<p>In this article, we'll connect the dots between the Riverpod implementation (straight from the <a href="https://github.com/rrousselGit/riverpod" target="_blank" rel="noopener noreferrer" class="">Riverpod repository</a>) and the <a href="https://dcm.dev/docs/rules/?categories=riverpod" target="_blank" rel="noopener noreferrer" class="">Riverpod lint rules</a> that prevent those problems, by showing <strong>what's actually happening under the hood</strong>.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>You can find the full source code examples for all the rules discussed in this article in our <a href="https://github.com/mhadaily/flutter_test_cases/tree/main/lib/lint_examples/riverpod_dcm_lints" target="_blank" rel="noopener noreferrer" class="">examples repository</a>.</p></div></div>
<p>Let's get started!</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-foundation-understanding-ref-and-the-lifecycle">The Foundation: Understanding <code>Ref</code> and the Lifecycle<a href="https://dcm.dev/blog/2026/03/25/inside-riverpod-source-code-guide-dcm-rules/#the-foundation-understanding-ref-and-the-lifecycle" class="hash-link" aria-label="Direct link to the-foundation-understanding-ref-and-the-lifecycle" title="Direct link to the-foundation-understanding-ref-and-the-lifecycle" translate="no">​</a></h2>
<p>Every interaction with Riverpod providers happens through the <a href="https://github.com/rrousselGit/riverpod/blob/master/packages/riverpod/lib/src/core/ref.dart" target="_blank" rel="noopener noreferrer" class=""><code>Ref</code></a> object. This is the core building block that allows providers to interact with other providers and manage their lifecycle.</p>
<p>The critical thing to understand is that <code>Ref</code> is <strong>not</strong> a permanent handle. It's tied to a specific provider lifecycle, and Riverpod validates that lifecycle on every operation. When you call methods like <code>read</code>, <code>watch</code>, or <code>listen</code>, the <code>Ref</code> first checks whether it's still valid. If the provider has been disposed or rebuilt in the meantime, the call fails with an exception:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">From riverpod/lib/src/core/ref.dart</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token metadata function" style="color:#87aff4">@internal</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">UnmountedRefException</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">implements</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Exception</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">UnmountedRefException</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">origin</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ProviderBase</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Object</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> origin</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// ....</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>This exception is the foundation of several lint rules we'll explore. The key insight is that <code>Ref</code> has a lifecycle, and using it after that lifecycle ends leads to runtime exceptions rather than silent bugs.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-mounted-property">The <code>mounted</code> Property<a href="https://dcm.dev/blog/2026/03/25/inside-riverpod-source-code-guide-dcm-rules/#the-mounted-property" class="hash-link" aria-label="Direct link to the-mounted-property" title="Direct link to the-mounted-property" translate="no">​</a></h3>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">From riverpod/lib/src/core/ref.dart</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">get</span><span class="token plain"> mounted </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">!</span><span class="token plain">_element</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">_disposed </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">identical</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_element</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">ref</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>The <code>mounted</code> property is your safeguard against using a disposed <code>Ref</code>. When a provider rebuilds or gets disposed, the old <code>Ref</code> becomes invalid. Any attempt to use it will throw <code>UnmountedRefException</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-read-vs-watch-distinction">The <code>read</code> vs <code>watch</code> Distinction<a href="https://dcm.dev/blog/2026/03/25/inside-riverpod-source-code-guide-dcm-rules/#the-read-vs-watch-distinction" class="hash-link" aria-label="Direct link to the-read-vs-watch-distinction" title="Direct link to the-read-vs-watch-distinction" translate="no">​</a></h2>
<p>One of the most important design decisions in Riverpod is the separation between "reading once" and "subscribing to changes." Let's examine how <a href="https://github.com/rrousselGit/riverpod/blob/master/packages/flutter_riverpod/lib/src/core/widget_ref.dart" target="_blank" rel="noopener noreferrer" class=""><code>WidgetRef</code></a> documents this in the source code:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">From flutter_riverpod/lib/src/core/widget_ref.dart</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">StateT</span><span class="token plain"> </span><span class="token generic-function" style="color:#87aff4">watch</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">StateT</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">ProviderListenable</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">StateT</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> provider</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>The difference is fundamental:</p>
<ul>
<li class=""><strong><code>watch</code></strong>: Subscribes to changes. When the provider's value changes, the widget rebuilds.</li>
<li class=""><strong><code>read</code></strong>: Gets the value once. No subscription. The widget won't rebuild when the value changes.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-refread-inside-build-bug">The <code>ref.read</code> Inside <code>build</code> Bug<a href="https://dcm.dev/blog/2026/03/25/inside-riverpod-source-code-guide-dcm-rules/#the-refread-inside-build-bug" class="hash-link" aria-label="Direct link to the-refread-inside-build-bug" title="Direct link to the-refread-inside-build-bug" translate="no">​</a></h3>
<p>This is what <a class="" href="https://dcm.dev/docs/rules/riverpod/avoid-ref-read-inside-build/"><code>avoid-ref-read-inside-build</code></a> catches.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: Widget won't update when counter changes!</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">HomeConsumerWidget</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ConsumerWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">HomeConsumerWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">WidgetRef</span><span class="token plain"> ref</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// 💥 Using read inside build — no subscription!</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> counter </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">read</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">counterProvider</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'</span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">$</span><span class="token string-literal interpolation expression">counter</span><span class="token string-literal string" style="color:#e1ffe4">'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>The problem: <code>read</code> doesn't subscribe. When <code>counterProvider</code> emits a new value, this widget <strong>won't rebuild</strong>. The display shows stale data.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Widget updates when counter changes</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">HomeConsumerWidget</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ConsumerWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">HomeConsumerWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">WidgetRef</span><span class="token plain"> ref</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// ✅ Using watch inside build — subscribed to changes!</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> counter </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">watch</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">counterProvider</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'</span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">$</span><span class="token string-literal interpolation expression">counter</span><span class="token string-literal string" style="color:#e1ffe4">'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>As the <a href="https://riverpod.dev/" target="_blank" rel="noopener noreferrer" class="">Riverpod documentation</a> states: <em>"Riverpod enhances the compiler by having common mistakes be a compilation-error."</em> This lint rule catches what the compiler cannot.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-refwatch-outside-build-bug">The <code>ref.watch</code> Outside <code>build</code> Bug<a href="https://dcm.dev/blog/2026/03/25/inside-riverpod-source-code-guide-dcm-rules/#the-refwatch-outside-build-bug" class="hash-link" aria-label="Direct link to the-refwatch-outside-build-bug" title="Direct link to the-refwatch-outside-build-bug" translate="no">​</a></h3>
<p>The flip side is equally problematic. This is what <a class="" href="https://dcm.dev/docs/rules/riverpod/avoid-ref-watch-outside-build/"><code>avoid-ref-watch-outside-build</code></a> catches.</p>
<p>Looking at the source code for the <code>watch</code> implementation in the consumer:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">From flutter_riverpod/lib/src/core/consumer.dart</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">StateT</span><span class="token plain"> </span><span class="token generic-function" style="color:#87aff4">watch</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">StateT</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">ProviderListenable</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">StateT</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> target</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token function" style="color:#87aff4">_assertNotDisposed</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> _dependencies</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">putIfAbsent</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">target</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> oldDependency </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> _oldDependencies</span><span class="token operator" style="color:#00bff9">?</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">remove</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">target</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">oldDependency </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> oldDependency</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> sub </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> container</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token generic-function" style="color:#87aff4">listen</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">StateT</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              target</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> _</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">markNeedsBuild</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// 👈 Triggers rebuild</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token function" style="color:#87aff4">_applyTickerMode</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">sub</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> sub</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">readSafe</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">valueOrProviderException</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token operator" style="color:#00bff9">as</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StateT</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>Notice the <code>markNeedsBuild()</code> call, this is what makes <code>watch</code> trigger rebuilds. When used outside of <code>build</code>, this subscription is wasteful and potentially buggy:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: Subscribing where it doesn't make sense</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">HomeConsumerWidget</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ConsumerWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">HomeConsumerWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">callback</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">WidgetRef</span><span class="token plain"> ref</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// 💥 Using watch outside build — wasteful subscription!</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> value </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">watch</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">counterProvider</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">WidgetRef</span><span class="token plain"> ref</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> counter </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">watch</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">counterProvider</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'</span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">$</span><span class="token string-literal interpolation expression">counter</span><span class="token string-literal string" style="color:#e1ffe4">'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>When you use <code>watch</code> in a callback, you're creating a subscription that won't trigger any meaningful rebuild (the callback already finished). Use <code>read</code> instead:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Read for event handlers</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">HomeConsumerWidget</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ConsumerWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">HomeConsumerWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">callback</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">WidgetRef</span><span class="token plain"> ref</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// ✅ Using read in callback — no unnecessary subscription</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> value </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">read</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">counterProvider</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">WidgetRef</span><span class="token plain"> ref</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> counter </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">watch</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">counterProvider</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'</span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">$</span><span class="token string-literal interpolation expression">counter</span><span class="token string-literal string" style="color:#e1ffe4">'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p><strong>The rule of thumb:</strong></p>
<ul>
<li class=""><strong>Inside <code>build</code></strong>: Use <code>watch</code> to subscribe to changes</li>
<li class=""><strong>Outside <code>build</code></strong> (callbacks, initState, etc.): Use <code>read</code> to get the value once</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-async-gap-problem">The Async Gap Problem<a href="https://dcm.dev/blog/2026/03/25/inside-riverpod-source-code-guide-dcm-rules/#the-async-gap-problem" class="hash-link" aria-label="Direct link to The Async Gap Problem" title="Direct link to The Async Gap Problem" translate="no">​</a></h2>
<p>One of the most dangerous patterns in Riverpod is using <code>ref</code> or <code>state</code> after an async gap. Let's look at why by examining the <a href="https://github.com/rrousselGit/riverpod/blob/master/packages/riverpod/lib/src/core/ref.dart" target="_blank" rel="noopener noreferrer" class=""><code>Ref</code></a> source:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">From riverpod/lib/src/core/ref.dart</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_throwIfInvalidUsage</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">assert</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    _debugCallbackStack </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token string-literal string" style="color:#e1ffe4">'Cannot use Ref or modify other providers inside life-cycles/selectors.'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token operator" style="color:#00bff9">!</span><span class="token plain">mounted</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">throw</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">UnmountedRefException</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_element</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">origin</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>Every operation on <code>Ref</code> checks if it's still mounted. During an async operation, the provider might rebuild or dispose, making the old <code>Ref</code> invalid.</p>
<p>This is what <a class="" href="https://dcm.dev/docs/rules/riverpod/use-ref-and-state-synchronously/"><code>use-ref-and-state-synchronously</code></a> catches.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: Using state after async gap without checking mounted</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token metadata function" style="color:#87aff4">@riverpod</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CountNotifier</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> _$</span><span class="token class-name" style="color:#7fdbca">CountNotifier</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics keyword" style="color:#00bff9">void</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">incrementDelayed</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics keyword" style="color:#00bff9">void</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">delayed</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Duration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">seconds</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// 💥 The notifier might be disposed during the delay!</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    state </span><span class="token operator" style="color:#00bff9">+=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>The fix is to check <code>ref.mounted</code> after async operations:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Check mounted before using state</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token metadata function" style="color:#87aff4">@riverpod</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CountNotifier</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> _$</span><span class="token class-name" style="color:#7fdbca">CountNotifier</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics keyword" style="color:#00bff9">void</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">incrementDelayed</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics keyword" style="color:#00bff9">void</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">delayed</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Duration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">seconds</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">mounted</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      state </span><span class="token operator" style="color:#00bff9">+=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// ✅ Safe to use after checking mounted</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>The same principle applies to <code>ref.read</code> after async gaps. This is what <a class="" href="https://dcm.dev/docs/rules/riverpod/use-ref-read-synchronously/"><code>use-ref-read-synchronously</code></a> catches:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: ref.read after async gap</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">HomeConsumerState</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ConsumerState</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">HomeConsumerStatefulWidget</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">FooWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      onChange</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token generic-function" style="color:#87aff4">read</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">WithAsync</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fetch</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token comment" style="color:#999999">// 💥 Widget might be unmounted!</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token generic-function" style="color:#87aff4">read</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">WithAsync</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Check mounted before ref.read</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">HomeConsumerState</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ConsumerState</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">HomeConsumerStatefulWidget</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">FooWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      onChange</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token generic-function" style="color:#87aff4">read</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">WithAsync</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fetch</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">mounted</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token generic-function" style="color:#87aff4">read</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">WithAsync</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// ✅ Safe after mounted check</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-notifier-build-method-is-sacred">The Notifier <code>build</code> Method Is Sacred<a href="https://dcm.dev/blog/2026/03/25/inside-riverpod-source-code-guide-dcm-rules/#the-notifier-build-method-is-sacred" class="hash-link" aria-label="Direct link to the-notifier-build-method-is-sacred" title="Direct link to the-notifier-build-method-is-sacred" translate="no">​</a></h2>
<p>Let's look at how Riverpod handles notifier initialization. The <a href="https://github.com/rrousselGit/riverpod/blob/master/packages/riverpod/lib/src/core/provider/notifier_provider.dart" target="_blank" rel="noopener noreferrer" class=""><code>notifier_provider.dart</code></a> source makes this very clear:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">From riverpod/lib/src/core/provider/notifier_provider.dart</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">/// The error message for when a notifier is used when uninitialized.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@internal</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> uninitializedElementError </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'''</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token string-literal string" style="color:#e1ffe4">Tried to use a notifier in an uninitialized state.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token string-literal string" style="color:#e1ffe4">This means that you tried to either:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token string-literal string" style="color:#e1ffe4">- Use ref/state inside the constructor of a notifier.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token string-literal string" style="color:#e1ffe4">  In this case you should move your logic inside the "build" method instead.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token string-literal string" style="color:#e1ffe4">- Use ref/state after the notifier was disposed.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token string-literal string" style="color:#e1ffe4">  In this case, consider using `ref.onDispose` earlier in your notifier's lifecycle</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token string-literal string" style="color:#e1ffe4">  to abort any pending logic that could try to use `ref/state`.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token string-literal string" style="color:#e1ffe4">'''</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>This error message directly explains why <a class="" href="https://dcm.dev/docs/rules/riverpod/avoid-notifier-constructors/"><code>avoid-notifier-constructors</code></a> exists:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: Logic in constructor</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Counter</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Notifier</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">var</span><span class="token plain"> state </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// 💥 Constructor logic runs before Riverpod initializes the notifier!</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Counter</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    state </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// This can cause initialization issues</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> state</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">increment</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    state</span><span class="token operator" style="color:#00bff9">++</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Logic in build method</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Counter</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Notifier</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// ✅ Initialized in the build method</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">increment</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    state</span><span class="token operator" style="color:#00bff9">++</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-public-properties-on-notifiers-are-problematic">Why Public Properties on Notifiers Are Problematic<a href="https://dcm.dev/blog/2026/03/25/inside-riverpod-source-code-guide-dcm-rules/#why-public-properties-on-notifiers-are-problematic" class="hash-link" aria-label="Direct link to Why Public Properties on Notifiers Are Problematic" title="Direct link to Why Public Properties on Notifiers Are Problematic" translate="no">​</a></h3>
<p>The <a href="https://github.com/rrousselGit/riverpod/blob/master/packages/riverpod/lib/src/core/provider/notifier_provider.dart" target="_blank" rel="noopener noreferrer" class=""><code>AnyNotifier</code></a> base class shows how notifiers are designed to work with a single <code>state</code> property:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">From riverpod/lib/src/core/provider/notifier_provider.dart</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">/// The value currently exposed by this notifier.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">///</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">/// Invoking the setter will notify listeners if [updateShouldNotify] returns true.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@visibleForTesting</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@protected</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">StateT</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">get</span><span class="token plain"> state </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> ref </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> $ref</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">_throwIfInvalidUsage</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">_element</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">readSelf</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">valueOrRawException</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@visibleForTesting</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@protected</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">set</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">state</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">StateT</span><span class="token plain"> newState</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> ref </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> $ref</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">_throwIfInvalidUsage</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">_element</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">setValueFromState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">newState</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>Notice how <code>state</code> triggers <code>_throwIfInvalidUsage()</code> and properly notifies listeners. Public properties bypass this mechanism entirely.</p>
<p>This is what <a class="" href="https://dcm.dev/docs/rules/riverpod/avoid-public-notifier-properties/"><code>avoid-public-notifier-properties</code></a> catches:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: Public property bypasses state management</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyNotifier</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Notifier</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">get</span><span class="token plain"> _privateGetter </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// 💥 This property doesn't go through Riverpod's state management!</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">get</span><span class="token plain"> publicGetter </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> _privateGetter</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Everything goes through state</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyState</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> left</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> right</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">MyState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">left</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">right</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyNotifier</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Notifier</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">MyState</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">MyState</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-stale-notifier-reference-trap">The Stale Notifier Reference Trap<a href="https://dcm.dev/blog/2026/03/25/inside-riverpod-source-code-guide-dcm-rules/#the-stale-notifier-reference-trap" class="hash-link" aria-label="Direct link to The Stale Notifier Reference Trap" title="Direct link to The Stale Notifier Reference Trap" translate="no">​</a></h2>
<p>Assigning notifiers to variables is a common mistake that leads to stale references. Let's understand why by looking at how notifier access works:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">From riverpod/lib/src/core/provider/notifier_provider.dart</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">extension</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ClassBaseX</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">StateT</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">ValueT</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">on</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AnyNotifier</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">StateT</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">ValueT</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  $</span><span class="token class-name" style="color:#7fdbca">ClassProviderElement</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">AnyNotifier</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">StateT</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">ValueT</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">StateT</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">Object</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">Object</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token function" style="color:#87aff4">requireElement</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> element </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">elementOrNull</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">element </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">throw</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StateError</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">uninitializedElementError</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">_throwIfInvalidUsage</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// 👈 Checks if ref is still valid</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> element</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>When you assign a notifier to a variable and use it after an async gap, you might be holding a reference to an already-unmounted notifier.</p>
<p>This is what <a class="" href="https://dcm.dev/docs/rules/riverpod/avoid-assigning-notifiers/"><code>avoid-assigning-notifiers</code></a> catches:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: Stale notifier reference</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">HomeConsumerState</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ConsumerState</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">HomeConsumerStatefulWidget</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">FooWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      onChange</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token comment" style="color:#999999">// 💥 This reference can become stale!</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> notifier </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token generic-function" style="color:#87aff4">read</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">MyNotifier</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">counterProvider</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">notifier</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">someAsyncOperation</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        notifier</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// 💥 Notifier might be unmounted!</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Always get fresh reference</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">HomeConsumerState</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ConsumerState</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">HomeConsumerStatefulWidget</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">FooWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      onChange</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token generic-function" style="color:#87aff4">read</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">MyNotifier</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">counterProvider</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">notifier</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">someFn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">someAsyncOperation</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token comment" style="color:#999999">// ✅ Get fresh reference after async gap</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token generic-function" style="color:#87aff4">read</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">MyNotifier</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">counterProvider</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">notifier</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-dispose-and-ref-dont-mix">The <code>dispose</code> and <code>Ref</code> Don't Mix<a href="https://dcm.dev/blog/2026/03/25/inside-riverpod-source-code-guide-dcm-rules/#the-dispose-and-ref-dont-mix" class="hash-link" aria-label="Direct link to the-dispose-and-ref-dont-mix" title="Direct link to the-dispose-and-ref-dont-mix" translate="no">​</a></h2>
<p>Looking at the <code>Ref</code> lifecycle, we can see why using <code>ref</code> inside <code>dispose</code> is dangerous:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">From riverpod/lib/src/core/ref.dart</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">RemoveListener</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">onDispose</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Function</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> listener</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token function" style="color:#87aff4">_throwIfInvalidUsage</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> list </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> _onDisposeListeners </span><span class="token operator" style="color:#00bff9">?</span><span class="token operator" style="color:#00bff9">?</span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  list</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">add</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">listener</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> list</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">remove</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">listener</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>The key insight from the <code>UnmountedRefException</code> message is clear: <em>"You tried to use Ref inside <code>onDispose</code> or other life-cycles. This is not supported, as the provider is already being disposed."</em></p>
<p>This is what <a class="" href="https://dcm.dev/docs/rules/riverpod/avoid-ref-inside-state-dispose/"><code>avoid-ref-inside-state-dispose</code></a> catches:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: Using ref in dispose</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_SomeState</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ConsumerState</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">SomeWidget</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">dispose</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// 💥 Providers might already be disposed!</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">read</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">provider</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">doSomething</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">dispose</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Don't use ref in dispose</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_SomeState</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ConsumerState</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">SomeWidget</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">dispose</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// ✅ Clean up without using ref</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">dispose</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-ondispose-callback-gap">The <code>onDispose</code> Callback Gap<a href="https://dcm.dev/blog/2026/03/25/inside-riverpod-source-code-guide-dcm-rules/#the-ondispose-callback-gap" class="hash-link" aria-label="Direct link to the-ondispose-callback-gap" title="Direct link to the-ondispose-callback-gap" translate="no">​</a></h2>
<p>Riverpod's <a href="https://github.com/rrousselGit/riverpod/blob/master/packages/riverpod/lib/src/core/ref.dart" target="_blank" rel="noopener noreferrer" class=""><code>Ref</code></a> provides extensive documentation about proper disposal patterns:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">From riverpod/lib/src/core/ref.dart</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">RemoveListener</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">onDispose</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Function</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> listener</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token function" style="color:#87aff4">_throwIfInvalidUsage</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> list </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> _onDisposeListeners </span><span class="token operator" style="color:#00bff9">?</span><span class="token operator" style="color:#00bff9">?</span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  list</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">add</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">listener</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> list</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">remove</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">listener</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>This is what <a class="" href="https://dcm.dev/docs/rules/riverpod/dispose-provided-instances/"><code>dispose-provided-instances</code></a> catches:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: dispose() is never called</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token class-name" style="color:#7fdbca">Provider</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">autoDispose</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">ref</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// 💥 Memory leak! dispose() is never called</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> instance </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DisposableService</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> instance</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DisposableService</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">dispose</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: dispose() is called via onDispose</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token class-name" style="color:#7fdbca">Provider</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">autoDispose</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">ref</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> instance </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DisposableService</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">onDispose</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">instance</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">dispose</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// ✅ Cleanup happens</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> instance</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DisposableService</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">dispose</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-asyncvalue-pattern-matching-trap">The <code>AsyncValue</code> Pattern Matching Trap<a href="https://dcm.dev/blog/2026/03/25/inside-riverpod-source-code-guide-dcm-rules/#the-asyncvalue-pattern-matching-trap" class="hash-link" aria-label="Direct link to the-asyncvalue-pattern-matching-trap" title="Direct link to the-asyncvalue-pattern-matching-trap" translate="no">​</a></h2>
<p>Riverpod's <a href="https://github.com/rrousselGit/riverpod/blob/master/packages/riverpod/lib/src/core/async_value.dart" target="_blank" rel="noopener noreferrer" class=""><code>AsyncValue</code></a> is designed for safe asynchronous state handling. Let's look at how it tracks values:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">From riverpod/lib/src/core/async_value.dart</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">ValueT</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">get</span><span class="token plain"> value </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> _value</span><span class="token operator" style="color:#00bff9">?</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">$1</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">get</span><span class="token plain"> hasValue </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> _value </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>The key insight: <code>value</code> can be <code>null</code> either because it's still loading OR because the actual value is <code>null</code>. This is particularly dangerous with nullable types.</p>
<p>This is what <a class="" href="https://dcm.dev/docs/rules/riverpod/avoid-nullable-async-value-pattern/"><code>avoid-nullable-async-value-pattern</code></a> catches:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: Unsafe pattern on nullable AsyncValue</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">asyncValue</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// 💥 If the actual value is null, this won't match even when data is loaded!</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">case</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AsyncValue</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> value</span><span class="token operator" style="color:#00bff9">?</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Use hasValue for nullable types</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">asyncValue</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// ✅ Explicitly check hasValue for nullable types</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">case</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AsyncValue</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> value</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> hasValue</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="provider-arguments-need-stable-equality">Provider Arguments Need Stable Equality<a href="https://dcm.dev/blog/2026/03/25/inside-riverpod-source-code-guide-dcm-rules/#provider-arguments-need-stable-equality" class="hash-link" aria-label="Direct link to Provider Arguments Need Stable Equality" title="Direct link to Provider Arguments Need Stable Equality" translate="no">​</a></h2>
<p>When using family providers with arguments, Riverpod relies on equality checks to determine if a "new" argument is logically the same as the old one. The <a href="https://riverpod.dev/docs/root/do_dont" target="_blank" rel="noopener noreferrer" class="">official documentation</a> warns against dynamically creating providers, and the same principle applies to arguments.</p>
<p>This is what <a class="" href="https://dcm.dev/docs/rules/riverpod/prefer-immutable-provider-arguments/"><code>prefer-immutable-provider-arguments</code></a> catches:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: Arguments without consistent equality</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// 💥 New instance every time — Riverpod can't cache properly!</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">watch</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token function" style="color:#87aff4">someProvider</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">SomeClassWithoutEquals</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// 💥 Lists don't have value equality by default!</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">watch</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token function" style="color:#87aff4">someProvider</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token number" style="color:#8dec95">42</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// 💥 Functions are never equal!</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">watch</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token function" style="color:#87aff4">someProvider</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Arguments with stable equality</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">watch</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token function" style="color:#87aff4">someProvider</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">SomeClassWithEquals</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">watch</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token function" style="color:#87aff4">someProvider</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">watch</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token function" style="color:#87aff4">someProvider</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Object</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">watch</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token function" style="color:#87aff4">someProvider</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token number" style="color:#8dec95">42</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// ✅ const lists have value equality</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">watch</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token function" style="color:#87aff4">someProvider</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token string-literal string" style="color:#e1ffe4">'string'</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">42</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>If you pass a value that doesn't support stable equality checks, you can run into:</p>
<ul>
<li class=""><strong>Unnecessary rebuilds</strong>: Your widget rebuilds even if nothing meaningful changed</li>
<li class=""><strong>Lost caching</strong>: Riverpod thinks you're asking for "new" data every time</li>
<li class=""><strong>Stale data</strong>: Providers don't reuse results across identical inputs</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="calling-notifier-methods-inside-build">Calling Notifier Methods Inside <code>build</code><a href="https://dcm.dev/blog/2026/03/25/inside-riverpod-source-code-guide-dcm-rules/#calling-notifier-methods-inside-build" class="hash-link" aria-label="Direct link to calling-notifier-methods-inside-build" title="Direct link to calling-notifier-methods-inside-build" translate="no">​</a></h2>
<p>The <code>build</code> method can be invoked frequently, and calling notifier methods inside it can lead to unwanted side effects.</p>
<p>This is what <a class="" href="https://dcm.dev/docs/rules/riverpod/avoid-calling-notifier-members-inside-build/"><code>avoid-calling-notifier-members-inside-build</code></a> catches:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: Side effect in build</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">HomeConsumerState</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ConsumerState</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">HomeConsumerStatefulWidget</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> counter </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token generic-function" style="color:#87aff4">watch</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Counter</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">provider</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">notifier</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    counter</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">increment</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// 💥 Called on every rebuild!</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Container</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// Placeholder to keep the example syntactically valid</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Side effects in callbacks</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">HomeConsumerState</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ConsumerState</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">HomeConsumerStatefulWidget</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> counter </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token generic-function" style="color:#87aff4">watch</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Counter</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">provider</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">notifier</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Button</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">onTap</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> counter</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">increment</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// ✅ Called only on user interaction</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="code-style-unnecessary-consumer-widgets">Code Style: Unnecessary Consumer Widgets<a href="https://dcm.dev/blog/2026/03/25/inside-riverpod-source-code-guide-dcm-rules/#code-style-unnecessary-consumer-widgets" class="hash-link" aria-label="Direct link to Code Style: Unnecessary Consumer Widgets" title="Direct link to Code Style: Unnecessary Consumer Widgets" translate="no">​</a></h2>
<p>Sometimes developers extend <code>ConsumerWidget</code> but never actually use the <code>ref</code> parameter. This adds unnecessary overhead.</p>
<p>This is what <a class="" href="https://dcm.dev/docs/rules/riverpod/avoid-unnecessary-consumer-widgets/"><code>avoid-unnecessary-consumer-widgets</code></a> catches:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: ConsumerWidget without using ref</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// 💥 This widget doesn't use ref at all!</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">HomeConsumerWidget</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ConsumerWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">HomeConsumerWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">WidgetRef</span><span class="token plain"> ref</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Hello'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// ref is never used</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Regular StatelessWidget</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">HomeWidget</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">HomeWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Hello'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>Or if you need <code>ref</code> only in a specific part of the widget tree, use <code>Consumer</code>:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Using Consumer for scoped ref access</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">HomeWidget</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">HomeWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Consumer</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      builder</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> ref</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> value </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">watch</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">helloWorldProvider</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="enable-all-riverpod-rules">Enable All Riverpod Rules<a href="https://dcm.dev/blog/2026/03/25/inside-riverpod-source-code-guide-dcm-rules/#enable-all-riverpod-rules" class="hash-link" aria-label="Direct link to Enable All Riverpod Rules" title="Direct link to Enable All Riverpod Rules" translate="no">​</a></h2>
<p>Ready to add these rules to your project? DCM includes <a class="" href="https://dcm.dev/docs/rules/?categories=riverpod">rules for specific packages</a> like Riverpod, and enabling them is a great way to catch bugs early.</p>
<p>Add the following to your <code>analysis_options.yaml</code>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">analysis_options.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">rules</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999"># Prevent missing UI updates</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> avoid</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">ref</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">read</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">inside</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">build</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999"># Prevent wasteful subscriptions</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> avoid</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">ref</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">watch</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">outside</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">build</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999"># Prevent UnmountedRefException crashes</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> use</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">ref</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">and</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">state</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">synchronously</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> use</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">ref</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">read</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">synchronously</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999"># Prevent initialization issues</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> avoid</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">notifier</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">constructors</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999"># Prevent bypassed state management</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> avoid</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">public</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">notifier</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">properties</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999"># Prevent stale references</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> avoid</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">assigning</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">notifiers</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999"># Prevent memory leaks</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> dispose</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">provided</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">instances</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999"># Prevent incorrect pattern matching</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> avoid</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">nullable</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">async</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">pattern</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999"># Prevent side effects in build</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> avoid</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">calling</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">notifier</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">members</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">inside</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">build</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999"># Prevent ref usage in dispose</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> avoid</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">ref</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">inside</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">state</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">dispose</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999"># Prevent unnecessary Consumer overhead</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> avoid</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">unnecessary</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">consumer</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">widgets</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999"># Prevent caching issues with provider arguments</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> prefer</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">immutable</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">provider</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">arguments</span></span><br></span></code></pre></div></div>
<p>To discover all available Riverpod rules and filter by other packages you use, visit the <a class="" href="https://dcm.dev/docs/rules/?categories=riverpod">rules page</a> and use the "Categories" filter.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="summary">Summary<a href="https://dcm.dev/blog/2026/03/25/inside-riverpod-source-code-guide-dcm-rules/#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary" translate="no">​</a></h2>
<p>Understanding the Riverpod source code reveals why these lint rules exist. They're not arbitrary style preferences but safeguards against real bugs, and they help you write more robust Riverpod code and catch bugs before they reach production.</p>
<p>Happy coding!</p>
<div class="formWrapper_FeQU"><p class="formTitle_o9oT">Enjoying this article?</p><p>Subscribe to get our latest articles and product updates by email.</p><form class="footerForm_u4Zn"><input class="trialInput_rT6u" type="email" placeholder="Email address" name="blogEmail"><button type="submit" class="button button--primary button--sm formButton_cuTv">Subscribe</button></form></div>]]></content>
        <author>
            <name>Majid Hajian</name>
            <uri>https://dcm.dev</uri>
        </author>
        <category label="blog" term="blog"/>
        <category label="Riverpod" term="Riverpod"/>
        <category label="Flutter" term="Flutter"/>
        <category label="State Management" term="State Management"/>
        <category label="Reactive Programming" term="Reactive Programming"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[What’s new in DCM 1.36.0]]></title>
        <id>https://dcm.dev/blog/2026/03/19/whats-new-in-dcm-1-36-0/</id>
        <link href="https://dcm.dev/blog/2026/03/19/whats-new-in-dcm-1-36-0/"/>
        <updated>2026-03-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release includes 11 new rules; a new command to safely rename public code that can be private (with a CLI fix!); a new option for overriding DCM configuration when uploading results to Dashboards; improved error messages for failed uploads; improved detection of unused code and files; and more!]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="Cover" src="https://dcm.dev/assets/images/2026-03-19-cover-c709a59e4226f01dbdf1fa07cae68c32.jpg" width="1400" height="736" class="img_ev3q"></p>
<p>Today we’re excited to announce the release of DCM 1.36.0!</p>
<p>This release includes 11 new rules; a new command to safely rename public code that can be private (with a CLI fix!); a new option for overriding DCM configuration when uploading results to Dashboards; improved error messages for failed uploads; improved detection of unused code and files; and more!</p>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>❗️ With the next release we plan to discontinue all DCM versions <strong>prior to 1.27.0</strong>. If you're still using one of those, consider upgrading to a newer version.</p></div></div>
<p>Let’s go through the highlights of this release (and the full list of changes is <a class="" href="https://dcm.dev/changelog/#1.36.0">in our changelog</a>)!</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-command-for-unnecessarily-public-code">New Command for Unnecessarily Public Code<a href="https://dcm.dev/blog/2026/03/19/whats-new-in-dcm-1-36-0/#new-command-for-unnecessarily-public-code" class="hash-link" aria-label="Direct link to New Command for Unnecessarily Public Code" title="Direct link to New Command for Unnecessarily Public Code" translate="no">​</a></h2>
<p>With this release, we are excited to present <a class="" href="https://dcm.dev/docs/cli/code-quality-checks/unnecessarily-public-code/">a new command</a> for detecting public top-level declarations and class members (fields, methods, etc.) that are used only in the containing file (including parts) and can be made private.</p>
<p>This command helps you ensure that only relevant classes, state and behavior are accessible to external files reducing overall API surface.</p>
<p>To execute the command, run:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">$ </span><span class="token builtin class-name" style="color:#7fdbca">dcm</span><span class="token plain"> check-unnecessarily-public-code </span><span class="token function" style="color:#87aff4">lib</span><span class="token plain"> </span><span class="token comment" style="color:#999999"># or dcm upc lib</span><br></span></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="Console" src="https://dcm.dev/assets/images/unnecessarily-public-code-console-report-af97153d9af16d9ef96e32c6115b9e12.webp" width="4200" height="1640" class="img_ev3q"></p>
<p>Furthermore, you can automatically fix some of the issues reported by this command via <code>dcm fix</code> reducing time to addresses them to just few minutes.</p>
<p>To do so, set the <code>--type</code> option to unnecessarily-public-code <code>--type=unnecessarily-public-code</code>:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">$ </span><span class="token builtin class-name" style="color:#7fdbca">dcm</span><span class="token plain"> fix --type=unnecessarily-public-code </span><span class="token function" style="color:#87aff4">lib</span><span class="token plain"> </span><span class="token comment" style="color:#999999"># or dcm f --type=unnecessarily-public-code lib</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The fix won't apply to fields as renaming fields without changing named parameters in constructors will break your code.</p><p>This issue will be addressed with Dart 3.12 once Dart gets <a href="https://github.com/dart-lang/sdk/blob/main/CHANGELOG.md#private-named-parameters" target="_blank" rel="noopener noreferrer" class=""><code>private-named-parameters</code></a>.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overriding-configuration-for-uploads">Overriding Configuration for Uploads<a href="https://dcm.dev/blog/2026/03/19/whats-new-in-dcm-1-36-0/#overriding-configuration-for-uploads" class="hash-link" aria-label="Direct link to Overriding Configuration for Uploads" title="Direct link to Overriding Configuration for Uploads" translate="no">​</a></h2>
<p>By default, <code>dcm run --upload</code> uses <code>analysis_options.yaml</code> files to detect available DCM configuration (same as other commands).</p>
<p>With this release, the command now supports a new option called <code>--upload-options-path</code> that allows overriding the configuration specifically for uploads helping you to have 2 different configurations: one for local and CI runs and another only for uploads.</p>
<p>Note that this configuration will apply to <strong>all</strong> analyzed packages.</p>
<p>For example,</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">dcm_shared_options.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">metrics</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">cyclomatic-complexity</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token key atrule" style="color:#6dbdfa">threshold</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">20</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">number-of-parameters</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token key atrule" style="color:#6dbdfa">threshold</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">4</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">maximum-nesting-level</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token key atrule" style="color:#6dbdfa">threshold</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">5</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">exclude</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">metrics</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> test/</span><span class="token important">**</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">rules</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> avoid</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">dynamic</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> avoid</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">passing</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">async</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">when</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">sync</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">expected</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> avoid</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">redundant</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">async</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> avoid</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">unnecessary</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">type</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">assertions</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> avoid</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">unnecessary</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">type</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">casts</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> avoid</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">unrelated</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">type</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">assertions</span></span><br></span></code></pre></div></div>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token builtin class-name" style="color:#7fdbca">dcm</span><span class="token plain"> run </span><span class="token function" style="color:#87aff4">lib</span><span class="token plain"> --all --upload --project=PROJECT_KEY --email=LICENSE_EMAIL --upload-options-path=</span><span class="token string" style="color:#e1ffe4">"/root/dcm_shared_options.yaml"</span><br></span></code></pre></div></div>
<p>will analyze and upload issues with the provided configuration.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The shared configuration file can have any name, but we recommend adding the <code>dcm_</code> prefix which will enable autocompletion and validation for that file.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="detection-of-unused-freezed-and-jsonserializable-classes">Detection of Unused Freezed and JsonSerializable Classes<a href="https://dcm.dev/blog/2026/03/19/whats-new-in-dcm-1-36-0/#detection-of-unused-freezed-and-jsonserializable-classes" class="hash-link" aria-label="Direct link to Detection of Unused Freezed and JsonSerializable Classes" title="Direct link to Detection of Unused Freezed and JsonSerializable Classes" translate="no">​</a></h2>
<p>With this release, the <code>check-unused-code</code> command now detects Freezed and JsonSerializable classes that are only referenced in generated code helping you quickly locate and remove them (or add a proper reference if they should be actually used).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="improved-error-messages-for-failed-uploads">Improved Error Messages for Failed Uploads<a href="https://dcm.dev/blog/2026/03/19/whats-new-in-dcm-1-36-0/#improved-error-messages-for-failed-uploads" class="hash-link" aria-label="Direct link to Improved Error Messages for Failed Uploads" title="Direct link to Improved Error Messages for Failed Uploads" translate="no">​</a></h2>
<p>To help you catch any configuration issues during the initial setup for Dashboards, a failure to upload the metadata will now show a detailed error message with useful links:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">Failed to validate credentials. Please check that the passed global project key and email are correct.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">You can access the global project key on the "Access" page https://dcm.dev/docs/getting-started/for-teams/license-keys/#access-global-project-key-.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">The passed email must be your CI email https://dcm.dev/docs/getting-started/for-teams/license-keys/#access-cicd-credentials.</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="project-tags-in-automatic-projects-creation">Project Tags in Automatic Projects Creation<a href="https://dcm.dev/blog/2026/03/19/whats-new-in-dcm-1-36-0/#project-tags-in-automatic-projects-creation" class="hash-link" aria-label="Direct link to Project Tags in Automatic Projects Creation" title="Direct link to Project Tags in Automatic Projects Creation" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>This feature is available to <strong>Enterprise</strong> users only.</p></div></div>
<p>In DCM 1.33.0 we introduced a way to automatically generate DCM Dashboards projects based on the monorepo structure.</p>
<p>With this release, we are extending this feature to support automatically creating and assigning project tags. To do so, set the tags in the <code>analysis_options.yaml</code> file:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">analysis_options.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">project</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> my_monorepo_package</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">project-tags</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> some_tag</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> another_tag</span></span><br></span></code></pre></div></div>
<p>Those tags will be automatically assigned (or created and assigned) to your Dashboards project. Removing a tag from the list unassigns it from the project, but the tag itself will remain available. Keeping an empty list <strong>will not</strong> remove any tags from the existing projects.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-rules">New Rules<a href="https://dcm.dev/blog/2026/03/19/whats-new-in-dcm-1-36-0/#new-rules" class="hash-link" aria-label="Direct link to New Rules" title="Direct link to New Rules" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p><strong>Discovering and Adding Rules from New Releases</strong></p><p>Each DCM release introduces new rules. To explore all available rules and filter by version, use the <a class="" href="https://dcm.dev/docs/cli/init/#lints-preview"><code>dcm init lints-preview</code></a> command:</p><div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token builtin class-name" style="color:#7fdbca">dcm</span><span class="token plain"> init lints-preview </span><span class="token function" style="color:#87aff4">lib</span><span class="token plain"> --rule-version=1.36.0  </span><span class="token comment" style="color:#999999"># Show rules added in 1.36.0</span><br></span></code></pre></div></div><p>This command displays:</p><ul>
<li class="">Rule names and their violations in your codebase</li>
<li class="">Estimated effort to fix all violations of each rule</li>
<li class="">Whether a rule supports automatic fixes</li>
</ul><p>You can also generate the output in different formats.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-unassigned-local-variable"><a class="" href="https://dcm.dev/docs/rules/common/avoid-unassigned-local-variable/"><code>avoid-unassigned-local-variable</code></a><a href="https://dcm.dev/blog/2026/03/19/whats-new-in-dcm-1-36-0/#avoid-unassigned-local-variable" class="hash-link" aria-label="Direct link to avoid-unassigned-local-variable" title="Direct link to avoid-unassigned-local-variable" translate="no">​</a></h3>
<p>Warns when a local variable is used but has not yet received a value.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token class-name" style="color:#7fdbca">int</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_value</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> val</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: This local variable is used but has not yet received a value.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Try assigning a value or using 'null' directly.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><mark class="code-warning"><span class="token plain">val</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> val</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">int</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_another</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> val</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: This local variable is used but has not yet received a value.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Try assigning a value or using 'null' directly.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><mark class="code-warning"><span class="token plain">val</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>To fix this issue, replace <code>val</code> with <code>null</code> or assign a value to it:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token class-name" style="color:#7fdbca">int</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">correct</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> val</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  val </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> val</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">int</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">correct</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> val </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> val</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-throw"><a class="" href="https://dcm.dev/docs/rules/common/avoid-throw/"><code>avoid-throw</code></a><a href="https://dcm.dev/blog/2026/03/19/whats-new-in-dcm-1-36-0/#avoid-throw" class="hash-link" aria-label="Direct link to avoid-throw" title="Direct link to avoid-throw" translate="no">​</a></h3>
<p>Warns when the <code>throw</code> expression is used.</p>
<p>Use this rule if you prefer to avoid throwing exceptions or errors and instead rely on the result pattern. You can also scope this rule to only a part of your codebase by configuring <code>exclude</code> or <code>include</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-unnecessary-parentheses"><a class="" href="https://dcm.dev/docs/rules/common/avoid-unnecessary-parentheses/"><code>avoid-unnecessary-parentheses</code></a><a href="https://dcm.dev/blog/2026/03/19/whats-new-in-dcm-1-36-0/#avoid-unnecessary-parentheses" class="hash-link" aria-label="Direct link to avoid-unnecessary-parentheses" title="Direct link to avoid-unnecessary-parentheses" translate="no">​</a></h3>
<p>Suggests removing unnecessary parentheses.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> input</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> another</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: Unnecessary parentheses. Try removing them.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> _ </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><mark class="code-warning"><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">input</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: Unnecessary parentheses. Try removing them.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> _ </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><mark class="code-warning"><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">input</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">isEmpty</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token plain"> </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> toolPath </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> another </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token comment" style="color:#999999">// LINT: Unnecessary parentheses. Try removing them.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> input</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">isEmpty </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> input </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><mark class="code-warning"><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> input</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token comment" style="color:#999999">// LINT: Unnecessary parentheses. Try removing them.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><mark class="code-warning"><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">input</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">f</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> a</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><mark class="code-warning"><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">a</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">isEven</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// LINT: Unnecessary parentheses. Try removing them.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>can be simplified to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> input</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> another</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> _ </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">input</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> _ </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> input</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">isEmpty </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> toolPath </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> another </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> input</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">isEmpty </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> input </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> input</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> input</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">f</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> a</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> a</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">isEven</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>This rule also comes with <strong>auto-fix</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prefer-non-nulls"><a class="" href="https://dcm.dev/docs/rules/common/prefer-non-nulls/"><code>prefer-non-nulls</code></a><a href="https://dcm.dev/blog/2026/03/19/whats-new-in-dcm-1-36-0/#prefer-non-nulls" class="hash-link" aria-label="Direct link to prefer-non-nulls" title="Direct link to prefer-non-nulls" translate="no">​</a></h3>
<p>Suggests using <code>.nonNulls</code> instead of <code>.whereType</code> for filtering out nullable values.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Iterable</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> a </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: Prefer '.nonNulls' instead of '.whereType' for filtering out nullable values.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  a</span><span class="token punctuation" style="color:#a7dbf7">.</span><mark class="code-warning"><span class="token generic-function" style="color:#87aff4">whereType</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>can be simplified to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Iterable</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> a </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  a</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">nonNulls</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>This rule also comes with <strong>auto-fix</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-disposing-late-fields"><a class="" href="https://dcm.dev/docs/rules/flutter/avoid-disposing-late-fields/"><code>avoid-disposing-late-fields</code></a><a href="https://dcm.dev/blog/2026/03/19/whats-new-in-dcm-1-36-0/#avoid-disposing-late-fields" class="hash-link" aria-label="Direct link to avoid-disposing-late-fields" title="Direct link to avoid-disposing-late-fields" translate="no">​</a></h3>
<p>Warns when a <code>late</code> widget state field is disposed in <code>dispose</code> method.</p>
<p>Disposing a <code>late</code> field can lead to either an exception related to the field not being initialized or to an unnecessary initialization of the field followed by its immediate disposal. Consider declaring such fields as nullable instead of <code>late</code>.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_ShinyWidgetState</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">ShinyWidget</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">late</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeDisposable</span><span class="token plain"> _someDisposable</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">dispose</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// LINT: Avoid calling 'dispose' on a late field. Try making it nullable instead.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><mark class="code-warning"><span class="token plain">_someDisposable</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">dispose</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></mark><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">dispose</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_ShinyWidgetState</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">ShinyWidget</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">SomeDisposable</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> _someDisposable</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">dispose</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    _someDisposable</span><span class="token operator" style="color:#00bff9">?</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">dispose</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">dispose</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prefer-correct-static-icon-provider"><a class="" href="https://dcm.dev/docs/rules/flutter/prefer-correct-static-icon-provider/"><code>prefer-correct-static-icon-provider</code></a><a href="https://dcm.dev/blog/2026/03/19/whats-new-in-dcm-1-36-0/#prefer-correct-static-icon-provider" class="hash-link" aria-label="Direct link to prefer-correct-static-icon-provider" title="Direct link to prefer-correct-static-icon-provider" translate="no">​</a></h3>
<p>Warns when a class with the <code>@staticIconProvider</code> annotation does not have <code>IconData</code> fields or any of those fields are not static.</p>
<p>All <code>IconData</code> fields must be static in order for tree shacking to work properly.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token metadata function" style="color:#87aff4">@staticIconProvider</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">abstract</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Some</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: IconData fields must be static const for the @staticIconProvider to have any effect.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Try removing the annotation or making this field static const.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><mark class="code-warning"><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">IconData</span><span class="token plain"> icon </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">IconData</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// LINT: This class has no IconData fields which makes @staticIconProvider redundant.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">//  Try removing the annotation or adding IconData fields.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><mark class="code-warning"><span class="token metadata function" style="color:#87aff4">@staticIconProvider</span></mark><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">abstract</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Some</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token metadata function" style="color:#87aff4">@staticIconProvider</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">abstract</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Some</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">IconData</span><span class="token plain"> icon </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">IconData</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="add-equatable-props"><a class="" href="https://dcm.dev/docs/rules/equatable/add-equatable-props/"><code>add-equatable-props</code></a><a href="https://dcm.dev/blog/2026/03/19/whats-new-in-dcm-1-36-0/#add-equatable-props" class="hash-link" aria-label="Direct link to add-equatable-props" title="Direct link to add-equatable-props" translate="no">​</a></h3>
<p>Warns when a class inherits <code>Equatable</code> but is missing the <code>props</code> getter.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// LINT: This class inherits Equatable, but is missing the 'props' getter. Try adding it.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">Child</span></mark><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Parent</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> y</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Child</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">y</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">sealed</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Parent</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">with</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">EquatableMixin</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Object</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">get</span><span class="token plain"> props </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Parent</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Child</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Parent</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> y</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Child</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">y</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">   </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Object</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">get</span><span class="token plain"> props </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">props</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> y</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">sealed</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Parent</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">with</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">EquatableMixin</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Object</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">get</span><span class="token plain"> props </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Parent</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="use-then-answer"><a class="" href="https://dcm.dev/docs/rules/mocktail/use-then-answer/"><code>use-then-answer</code></a><a href="https://dcm.dev/blog/2026/03/19/whats-new-in-dcm-1-36-0/#use-then-answer" class="hash-link" aria-label="Direct link to use-then-answer" title="Direct link to use-then-answer" translate="no">​</a></h3>
<p>Warns when <code>thenReturn</code> is used with <code>Future</code> or <code>Stream</code>.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">main</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: 'thenReturn' should not be used to return a Stream or Future.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Use 'thenAnswer' instead.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">when</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> expression</span><span class="token punctuation" style="color:#a7dbf7">)</span><mark class="code-warning"><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">thenReturn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">value</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">main</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">when</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> expression</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">thenAnswer</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">value</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">when</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> expression</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">thenReturn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="pass-mock-object"><a class="" href="https://dcm.dev/docs/rules/mocktail/pass-mock-object/"><code>pass-mock-object</code></a><a href="https://dcm.dev/blog/2026/03/19/whats-new-in-dcm-1-36-0/#pass-mock-object" class="hash-link" aria-label="Direct link to pass-mock-object" title="Direct link to pass-mock-object" translate="no">​</a></h3>
<p>Warns when <code>verify</code>, <code>verifyNever</code>, <code>when</code> or other similar invocations receive a regular object instead of a mock.</p>
<p>Such invocations must only be given a Mock object.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">main</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token function" style="color:#87aff4">test</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'some test'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> instance </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// LINT: This invocation must only be given a Mock object.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">//  Try passing an object that extends Mock.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">when</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><mark class="code-warning"><span class="token plain">instance</span></mark><span class="token number" style="color:#8dec95">.</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// LINT: This invocation must only be given a Mock object.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">//  Try passing an object that extends Mock.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token function" style="color:#87aff4">verify</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><mark class="code-warning"><span class="token plain">instance</span></mark><span class="token number" style="color:#8dec95">.</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// LINT: This invocation must only be given a Mock object.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">//  Try passing an object that extends Mock.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token function" style="color:#87aff4">verifyZeroInteractions</span><span class="token punctuation" style="color:#a7dbf7">(</span><mark class="code-warning"><span class="token plain">instance</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> value</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">main</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token function" style="color:#87aff4">test</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'some test'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> mock </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_SomeMock</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">when</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> mock</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token function" style="color:#87aff4">verify</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> mock</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token function" style="color:#87aff4">verifyZeroInteractions</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">mock</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_SomeMock</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Mock</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">implements</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-implementation-in-mocks"><a class="" href="https://dcm.dev/docs/rules/mocktail/avoid-implementation-in-mocks/"><code>avoid-implementation-in-mocks</code></a><a href="https://dcm.dev/blog/2026/03/19/whats-new-in-dcm-1-36-0/#avoid-implementation-in-mocks" class="hash-link" aria-label="Direct link to avoid-implementation-in-mocks" title="Direct link to avoid-implementation-in-mocks" translate="no">​</a></h3>
<p>Warns when a class that extends <code>Mock</code> has overridden members.</p>
<p>Instead of adding implementation to mock classes, try specifying expected values via <code>when</code>. Alternatively, consider using <code>Fake</code> instead of <code>Mock</code>.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Mock</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">implements</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Other</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: Classes that extend Mock should not have any overridden members.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Try moving the implementation to when or use Fake instead.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><mark class="code-warning"><span class="token metadata function" style="color:#87aff4">@override</span></mark><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">getResult</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'result'</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">main</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token function" style="color:#87aff4">test</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'some test'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> mock </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">when</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> mock</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">getResult</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">thenReturn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'result'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Mock</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">implements</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Other</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prefer-correct-any-matcher"><a class="" href="https://dcm.dev/docs/rules/mocktail/prefer-correct-any-matcher/"><code>prefer-correct-any-matcher</code></a><a href="https://dcm.dev/blog/2026/03/19/whats-new-in-dcm-1-36-0/#prefer-correct-any-matcher" class="hash-link" aria-label="Direct link to prefer-correct-any-matcher" title="Direct link to prefer-correct-any-matcher" translate="no">​</a></h3>
<p>Warns when <code>any</code> or <code>captureAny</code> have incorrect or misused <code>named</code> argument.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">main</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token function" style="color:#87aff4">test</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'some test'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> correct </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Correct</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// LINT: This invocation stubs a positional argument and should not have the 'named' argument.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">//  Try removing this argument.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">when</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> correct</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">work</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token function" style="color:#87aff4">any</span><span class="token punctuation" style="color:#a7dbf7">(</span><mark class="code-warning"><span class="token plain">named</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'named'</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// LINT: This invocation stubs a named argument and should have the 'named' argument.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">//  Try adding it.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">when</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> correct</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">work</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token function" style="color:#87aff4">any</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> namedValue</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><mark class="code-warning"><span class="token function" style="color:#87aff4">any</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// LINT: The passed name of the argument does not match the actual argument name.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">//  Try updating the name.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">when</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> correct</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">work</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token function" style="color:#87aff4">any</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> namedValue</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">any</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">named</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><mark class="code-warning"><span class="token string-literal string" style="color:#e1ffe4">'some'</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">main</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token function" style="color:#87aff4">test</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'some test'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> correct </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Correct</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">when</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> correct</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">work</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token function" style="color:#87aff4">any</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">when</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> correct</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">work</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token function" style="color:#87aff4">any</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> namedValue</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">any</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">named</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'namedValue'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What’s next<a href="https://dcm.dev/blog/2026/03/19/whats-new-in-dcm-1-36-0/#whats-next" class="hash-link" aria-label="Direct link to What’s next" title="Direct link to What’s next" translate="no">​</a></h2>
<p>To learn more about upcoming features, keep an eye on our <a href="https://dcm.featurebase.app/roadmap" target="_blank" rel="noopener noreferrer" class="">public roadmap</a>.</p>
<p>And to learn more about our upcoming videos and "Rules of the Week" content, subscribe to our <a href="https://www.youtube.com/@DCMAnalyzer" target="_blank" rel="noopener noreferrer" class="">Youtube Channel</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sharing-your-feedback">Sharing your feedback<a href="https://dcm.dev/blog/2026/03/19/whats-new-in-dcm-1-36-0/#sharing-your-feedback" class="hash-link" aria-label="Direct link to Sharing your feedback" title="Direct link to Sharing your feedback" translate="no">​</a></h2>
<p>If there is something you miss from DCM right now, want us to make something better, or have any general feedback — <a href="https://discord.gg/Vzjprgk4sb" target="_blank" rel="noopener noreferrer" class="">join our Discord server</a>! We’d love to hear from you.</p>]]></content>
        <author>
            <name>Dmitry Zhifarsky</name>
            <uri>https://dcm.dev</uri>
        </author>
        <category label="product-update" term="product-update"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Flutter BLoC Best Practices You're Probably Missing]]></title>
        <id>https://dcm.dev/blog/2026/03/11/flutter-bloc-best-practices-youre-probably-missing/</id>
        <link href="https://dcm.dev/blog/2026/03/11/flutter-bloc-best-practices-youre-probably-missing/"/>
        <updated>2026-03-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Learn how the BLoC pattern works by reading its source code. Understand the architecture behind Flutter state management and discover why certain patterns prevent crashes and memory leaks.]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="Cover" src="https://dcm.dev/assets/images/2026-03-11-cover-329898c38160a1e6c71e9b77390edaf4.jpg" width="1050" height="552" class="img_ev3q"></p>
<p>Reading source code is honestly one of the best ways to understand how things actually work. I've been building Flutter apps with the <a href="https://pub.dev/packages/bloc" target="_blank" rel="noopener noreferrer" class="">BLoC pattern</a> for years, and I thought I had it figured out, until I opened the <a href="https://github.com/felangel/bloc" target="_blank" rel="noopener noreferrer" class="">bloc repository</a> and started digging through the code.</p>
<p>What I found was code that makes you go "oh, <em>that's</em> why." That <code>StateError</code> that crashes your app at 2 AM? It's literally one <code>if</code> statement. The "my UI isn't updating" bug that haunts every developer? One line of code explains the whole thing.</p>
<p>I realized that understanding these patterns at the source level is exactly what separates solid state management from fragile code. So I decided to walk you through the BLoC source code and show how <a href="https://dcm.dev/docs/rules/?categories=bloc" target="_blank" rel="noopener noreferrer" class="">BLoC lint rules</a> connect directly to what's actually happening under the hood.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>You can find the full source code examples for all the rules discussed in this article in our <a href="https://github.com/mhadaily/flutter_test_cases/tree/main/lib/lint_examples/bloc_dcm_lints" target="_blank" rel="noopener noreferrer" class="">examples repository</a>.</p></div></div>
<p>Let's get started!</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-foundation">The Foundation<a href="https://dcm.dev/blog/2026/03/11/flutter-bloc-best-practices-youre-probably-missing/#the-foundation" class="hash-link" aria-label="Direct link to The Foundation" title="Direct link to The Foundation" translate="no">​</a></h2>
<p>Every <code>Bloc</code> and <code>Cubit</code> extends <a href="https://github.com/felangel/bloc/blob/06bf7762372f6e1b828c7b3aa8b0194737ddda35/packages/bloc/lib/src/bloc_base.dart#L56" target="_blank" rel="noopener noreferrer" class=""><code>BlocBase</code></a>, which implements the core lifecycle. Let's look at the <code>emit()</code> method, it's where all the magic (and bugs) happen:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">From bloc/lib/src/bloc_base.dart</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">abstract</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BlocBase</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">implements</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StateStreamableSource</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Emittable</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ErrorSink</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">BlocBase</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">._</span><span class="token plain">state</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    _blocObserver</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">onCreate</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> _stateController </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StreamController</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">broadcast</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token plain"> _state</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> _emitted </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">get</span><span class="token plain"> state </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> _state</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Stream</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">get</span><span class="token plain"> stream </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> _stateController</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">stream</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">get</span><span class="token plain"> isClosed </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> _stateController</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">isClosed</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// 👈 Delegates to stream controller</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@protected</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@visibleForTesting</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">emit</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">State</span><span class="token plain"> state</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">isClosed</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">throw</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StateError</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Cannot emit new states after calling close'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">state </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> _state </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> _emitted</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">return</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// 👈 Same-instance check!</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token function" style="color:#87aff4">onChange</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Change</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">currentState</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">state</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> nextState</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> state</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      _state </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> state</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      _stateController</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">add</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_state</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      _emitted </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">error</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> stackTrace</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token function" style="color:#87aff4">onError</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">error</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> stackTrace</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">rethrow</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@mustCallSuper</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics keyword" style="color:#00bff9">void</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">close</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    _blocObserver</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">onClose</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> _stateController</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">close</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// 👈 Closing the controller marks isClosed as true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>Two lines in this code explain two of the most common BLoC bugs. Let me show you.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-isclosed-guard">The <code>isClosed</code> Guard<a href="https://dcm.dev/blog/2026/03/11/flutter-bloc-best-practices-youre-probably-missing/#the-isclosed-guard" class="hash-link" aria-label="Direct link to the-isclosed-guard" title="Direct link to the-isclosed-guard" translate="no">​</a></h3>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">isClosed</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">throw</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StateError</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Cannot emit new states after calling close'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>This is the source of <strong>"Cannot emit new states after calling close"</strong>, one of the most common BLoC errors.</p>
<p>Here's the scenario: user opens a screen, triggers an API call, then navigates away immediately. The widget disposes, <code>close()</code> gets called, but the async operation is still running. When it finishes and tries to emit... <strong>crash</strong>.</p>
<p>This is exactly what <a class="" href="https://dcm.dev/docs/rules/bloc/check-is-not-closed-after-async-gap/"><code>check-is-not-closed-after-async-gap</code></a> catches.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: Will crash if BLoC closes during the await</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SearchBlocBad</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Bloc</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">SearchEvent</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">SearchState</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">SearchBlocBad</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">._</span><span class="token plain">repository</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">super</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">SearchInitialImpl</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token generic-function" style="color:#87aff4">on</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">SearchQueryChanged</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_onQueryChanged</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SearchRepository</span><span class="token plain"> _repository</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics keyword" style="color:#00bff9">void</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_onQueryChanged</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">SearchQueryChanged</span><span class="token plain"> event</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Emitter</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">SearchState</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> emit</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token function" style="color:#87aff4">emit</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">SearchLoadingState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> results </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> _repository</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">search</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">event</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">query</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// 💥 CRASH: If user navigated away during the search, this emit throws</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token function" style="color:#87aff4">emit</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">SearchSuccessImpl</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">results</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>The fix is simple, just check <code>isClosed</code> before emitting:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Always check isClosed after async gaps</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics keyword" style="color:#00bff9">void</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_onQueryChanged</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">SearchQueryChanged</span><span class="token plain"> event</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Emitter</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">SearchState</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> emit</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token function" style="color:#87aff4">emit</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">SearchLoadingState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> results </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> _repository</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">search</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">event</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">query</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// ✅ Safe: Check before emitting</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token operator" style="color:#00bff9">!</span><span class="token plain">isClosed</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token function" style="color:#87aff4">emit</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">SearchSuccessImpl</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">results</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>The rule also supports custom event, listening methods through configuration:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">analysis_options.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">rules</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">check-is-not-closed-after-async-gap</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">additional-methods</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> customOn</span><br></span></code></pre></div></div>
<p>This single rule eliminates an entire category of production crashes. I can't stress enough how important it is.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-equality-short-circuit">The Equality Short-Circuit<a href="https://dcm.dev/blog/2026/03/11/flutter-bloc-best-practices-youre-probably-missing/#the-equality-short-circuit" class="hash-link" aria-label="Direct link to The Equality Short-Circuit" title="Direct link to The Equality Short-Circuit" translate="no">​</a></h3>
<p>Now look at the second critical line:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">state </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> _state </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> _emitted</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">return</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>This line silently skips emits when the state hasn't changed. The <code>==</code> operator uses your state's equality implementation. If you emit the <em>same instance</em>, <code>identical(this, other)</code> returns true and <strong>the UI never rebuilds</strong>.</p>
<p>This is the infamous "my UI isn't updating" bug, and it's what <a class="" href="https://dcm.dev/docs/rules/bloc/emit-new-bloc-state-instances/"><code>emit-new-bloc-state-instances</code></a> catches.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: Emitting the same instance, UI won't update</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">UserBloc</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Bloc</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">UserEvent</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">UserState</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">UserBloc</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">super</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">UserState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token generic-function" style="color:#87aff4">on</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">UpdateNameEvent</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">event</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> emit</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token comment" style="color:#999999">// 💥 This modifies the existing state object</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      state</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">name </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> event</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token comment" style="color:#999999">// 💥 Same instance, same reference, UI ignores this emit!</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token function" style="color:#87aff4">emit</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">state</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>The solution is to always create a new state instance:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Always emit a new instance</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">UserBloc</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Bloc</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">UserEvent</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">UserState</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">UserBloc</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">super</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">UserState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token generic-function" style="color:#87aff4">on</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">UpdateNameEvent</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">event</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> emit</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token comment" style="color:#999999">// ✅ New instance with updated values</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token function" style="color:#87aff4">emit</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">state</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">copyWith</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> event</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@immutable</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">UserState</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> name</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">UserState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">name </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">''</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">UserState</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">copyWith</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token class-name" style="color:#7fdbca">String</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> name</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">UserState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> name </span><span class="token operator" style="color:#00bff9">?</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>This bug is a nightmare to debug because everything <em>looks</em> right. The event fires, the handler runs, emit gets called... but nothing happens on screen. The rule catches it instantly.</p>
<blockquote>
<p>Read more about <em>BLoC Library FAQ</em>: <a href="https://bloclibrary.dev/faqs/#state-not-updating" target="_blank" rel="noopener noreferrer" class="">State not updating</a></p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-provider-lifecycle">The Provider Lifecycle<a href="https://dcm.dev/blog/2026/03/11/flutter-bloc-best-practices-youre-probably-missing/#the-provider-lifecycle" class="hash-link" aria-label="Direct link to The Provider Lifecycle" title="Direct link to The Provider Lifecycle" translate="no">​</a></h2>
<p>The <a href="https://github.com/felangel/bloc/blob/master/packages/flutter_bloc/lib/src/bloc_provider.dart" target="_blank" rel="noopener noreferrer" class=""><code>BlocProvider</code></a> source code shows exactly why two common memory bugs happen:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">From flutter_bloc/lib/src/bloc_provider.dart</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BlocProvider</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics"> </span><span class="token generics keyword" style="color:#00bff9">extends</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">StateStreamableSource</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Object</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SingleChildStatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Constructor for create: mode</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BlocProvider</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">T</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Function</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> create</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Key</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> key</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">child</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">lazy </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _create </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> create</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">       _value </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">super</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> key</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Named constructor for .value mode</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BlocProvider</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">value</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">T</span><span class="token plain"> value</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Key</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> key</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">child</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _value </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> value</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        _create </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        lazy </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">super</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> key</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> lazy</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">T</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Function</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> _create</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">T</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> _value</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">buildWithChild</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">assert</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      child </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token string-literal string" style="color:#e1ffe4">'</span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">$</span><span class="token string-literal interpolation expression">runtimeType</span><span class="token string-literal string" style="color:#e1ffe4"> used outside of MultiBlocProvider must specify a child'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> value </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> _value</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> value </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">InheritedProvider</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">value</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            value</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> value</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            startListening</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _startListening</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            lazy</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> lazy</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token comment" style="color:#999999">// ❌ NO dispose callback for .value!</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">InheritedProvider</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            create</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _create</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            dispose</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> bloc</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> bloc</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">close</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// ✅ Auto-close for create:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            startListening</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _startListening</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            lazy</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> lazy</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>Look at the two code paths:</p>
<ul>
<li class=""><strong><code>create:</code> mode</strong>: Passes <code>dispose: (_, bloc) =&gt; bloc.close()</code> to the <code>InheritedProvider</code></li>
<li class=""><strong><code>.value</code> mode</strong>: No <code>dispose</code> callback at all</li>
</ul>
<p>This is exactly why the provider lifecycle rules exist.</p>
<img src="https://dcm.dev/blog/2026-02-17/create-bloc-lifecycle-light.webp" alt="BLoC Provider Lifecycle" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="https://dcm.dev/blog/2026-02-17/create-bloc-lifecycle-dark.webp" alt="BLoC Provider Lifecycle" class="themedComponent_mlkZ themedComponent--dark_xIcU">
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-the-wrong-provider-type">Using the Wrong Provider Type<a href="https://dcm.dev/blog/2026/03/11/flutter-bloc-best-practices-youre-probably-missing/#using-the-wrong-provider-type" class="hash-link" aria-label="Direct link to Using the Wrong Provider Type" title="Direct link to Using the Wrong Provider Type" translate="no">​</a></h3>
<p>Before we even get to <code>create:</code> vs <code>.value</code>, there's an even more fundamental mistake:</p>
<p>| Using a generic <code>Provider</code> when you should be using <code>BlocProvider</code>.</p>
<p>If your project uses both <code>bloc</code> and <code>provider</code> packages, it's easy to accidentally wrap a BLoC in a plain <code>Provider</code>, which bypasses the lifecycle management that <code>BlocProvider</code> provides.</p>
<p>This is what <a class="" href="https://dcm.dev/docs/rules/bloc/prefer-correct-bloc-provider/"><code>prefer-correct-bloc-provider</code></a> catches.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: Using Provider instead of BlocProvider</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// 💥 This won't auto-close the BLoC when disposed!</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> provider </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Provider</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">CounterBloc</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  create</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CounterBloc</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CounterPage</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Use BlocProvider for BLoCs</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> blocProvider </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BlocProvider</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">CounterBloc</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  create</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CounterBloc</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CounterPage</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="passing-existing-instances-to-create">Passing Existing Instances to <code>create:</code><a href="https://dcm.dev/blog/2026/03/11/flutter-bloc-best-practices-youre-probably-missing/#passing-existing-instances-to-create" class="hash-link" aria-label="Direct link to passing-existing-instances-to-create" title="Direct link to passing-existing-instances-to-create" translate="no">​</a></h3>
<p><code>BlocProvider(create: ...)</code> takes ownership of the BLoC instance. It will call <code>close()</code> when the provider is disposed. But if you pass an <em>existing</em> instance to <code>create:</code>, you've created a lifecycle mismatch.</p>
<p>This is what <a class="" href="https://dcm.dev/docs/rules/bloc/avoid-existing-instances-in-bloc-provider/"><code>avoid-existing-instances-in-bloc-provider</code></a> catches.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: BlocProvider will close an instance it doesn't own</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// 🚨 This BLoC is created outside the provider</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> counterBloc </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CounterBloc</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BlocProvider</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token comment" style="color:#999999">// 💥 BlocProvider will close this when disposed,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token comment" style="color:#999999">// but you might try to use it elsewhere!</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      create</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> counterBloc</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CounterPage</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>Instead, let the provider create and own the instance:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Let BlocProvider create and own the instance</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BlocProvider</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token comment" style="color:#999999">// ✅ Provider creates it, provider owns it, provider closes it</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      create</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CounterBloc</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CounterPage</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>This causes double-close errors or worse use-after-close bugs that are super hard to track down. The BLoC seems fine sometimes and crashes randomly other times.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="instantiating-in-value">Instantiating in <code>.value</code><a href="https://dcm.dev/blog/2026/03/11/flutter-bloc-best-practices-youre-probably-missing/#instantiating-in-value" class="hash-link" aria-label="Direct link to instantiating-in-value" title="Direct link to instantiating-in-value" translate="no">​</a></h3>
<p>This is the flip side. When you use <code>.value</code>, you're telling the provider: "I'm giving you an existing instance; don't touch its lifecycle." But if you instantiate a new BLoC directly in <code>.value</code>, <em>nobody</em> will close it.</p>
<p>This is what <a class="" href="https://dcm.dev/docs/rules/bloc/avoid-instantiating-in-bloc-value-provider/"><code>avoid-instantiating-in-bloc-value-provider</code></a> catches.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: Memory leak, this BLoC will never be closed</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token class-name" style="color:#7fdbca">BlocProvider</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">value</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// 💥 MEMORY LEAK: Who closes this? Nobody!</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  value</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CounterBloc</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CounterPage</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>When using <code>.value</code>, you must manage the lifecycle yourself:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Pass an existing instance that you manage</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ParentWidget</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatefulWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">ParentWidget</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">createState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_ParentWidgetState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_ParentWidgetState</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">ParentWidget</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">late</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CounterBloc</span><span class="token plain"> _counterBloc</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">initState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">initState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    _counterBloc </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CounterBloc</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">dispose</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    _counterBloc</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">close</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// ✅ You manage the lifecycle</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">dispose</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BlocProvider</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">value</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      value</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _counterBloc</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// ✅ Existing instance</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CounterPage</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>Silent memory leaks accumulate until your app becomes sluggish and eventually crashes. These leaks don't show up in testing but destroy user experience in production.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>We also have written a comprehensive blog post about memory leaks and how it happens in Flutter in general. If you are interested to deep dive, read <a class="" href="https://dcm.dev/blog/2024/10/21/lets-talk-about-memory-leaks-in-dart-and-flutter/">Let's talk about memory leaks in Dart and Flutter</a>.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-event-system">The Event System<a href="https://dcm.dev/blog/2026/03/11/flutter-bloc-best-practices-youre-probably-missing/#the-event-system" class="hash-link" aria-label="Direct link to The Event System" title="Direct link to The Event System" translate="no">​</a></h2>
<p>The <a href="https://github.com/felangel/bloc/blob/master/packages/bloc/lib/src/bloc.dart" target="_blank" rel="noopener noreferrer" class=""><code>Bloc</code></a> class builds on <code>BlocBase</code> by adding event-driven architecture. Let's look at how <code>on&lt;E&gt;()</code> works:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">From bloc/lib/src/bloc.dart</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">abstract</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Bloc</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Event</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BlocBase</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">implements</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BlocEventSink</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Event</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Bloc</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">initialState</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> _eventController </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StreamController</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Event</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">broadcast</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> _subscriptions </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">StreamSubscription</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">dynamic</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> _handlers </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">_Handler</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> _emitters </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">_Emitter</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">dynamic</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">add</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Event</span><span class="token plain"> event</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">assert</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> handlerExists </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> _handlers</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">any</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">handler</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> handler</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">isType</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">event</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token operator" style="color:#00bff9">!</span><span class="token plain">handlerExists</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> eventType </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> event</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">runtimeType</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">throw</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StateError</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token string-literal string" style="color:#e1ffe4">'''add(</span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">$</span><span class="token string-literal interpolation expression">eventType</span><span class="token string-literal string" style="color:#e1ffe4">) was called without a registered event handler.\n'''</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token string-literal string" style="color:#e1ffe4">'''Make sure to register a handler via on&lt;</span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">$</span><span class="token string-literal interpolation expression">eventType</span><span class="token string-literal string" style="color:#e1ffe4">&gt;((event, emit) {...})'''</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token function" style="color:#87aff4">onEvent</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">event</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      _eventController</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">add</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">event</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">error</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> stackTrace</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token function" style="color:#87aff4">onError</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">error</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> stackTrace</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">rethrow</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token generic-function" style="color:#87aff4">on</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">E</span><span class="token generics"> </span><span class="token generics keyword" style="color:#00bff9">extends</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">Event</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">EventHandler</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">E</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> handler</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">EventTransformer</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">E</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> transformer</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:#999999">// Prevent duplicate handlers for the same event type</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">assert</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> handlerExists </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> _handlers</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">any</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">handler</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> handler</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">type </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">E</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">handlerExists</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">throw</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StateError</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token string-literal string" style="color:#e1ffe4">'on&lt;</span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">$</span><span class="token string-literal interpolation expression class-name" style="color:#7fdbca">E</span><span class="token string-literal string" style="color:#e1ffe4">&gt; was called multiple times. '</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token string-literal string" style="color:#e1ffe4">'There should only be a single event handler per event type.'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      _handlers</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">add</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">_Handler</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">isType</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">dynamic</span><span class="token plain"> e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> e </span><span class="token operator" style="color:#00bff9">is</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">E</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> type</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">E</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> subscription </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">transformer </span><span class="token operator" style="color:#00bff9">?</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> _eventTransformer</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      _eventController</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">stream</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">where</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">event</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> event </span><span class="token operator" style="color:#00bff9">is</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">E</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token generic-function" style="color:#87aff4">cast</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">E</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">dynamic</span><span class="token plain"> event</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">onEmit</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">State</span><span class="token plain"> state</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">isClosed</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">return</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">state </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> state </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> _emitted</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">return</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token function" style="color:#87aff4">onTransition</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Transition</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            currentState</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">state</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            event</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> event </span><span class="token operator" style="color:#00bff9">as</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">E</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            nextState</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> state</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token function" style="color:#87aff4">emit</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">state</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token comment" style="color:#999999">// ... handler invocation with Emitter</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">listen</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    _subscriptions</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">add</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">subscription</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>Key takeaways from this code:</p>
<ul>
<li class="">
<p><strong>Events flow through a <code>StreamController</code></strong>: The <code>add()</code> method doesn't directly call handlers, it pushes to a stream that handlers subscribe to. This is the unidirectional flow that public methods violate.</p>
</li>
<li class="">
<p><strong><code>onTransition()</code> captures the full picture</strong>: Unlike <code>onChange()</code> (which only has before/after state), transitions include the triggering event. This is why <code>BlocObserver</code> can provide complete tracing <em>if</em> you use events.</p>
</li>
<li class="">
<p><strong>Guard clauses everywhere</strong>: Notice <code>if (isClosed) return;</code> appears multiple times. The library tries to protect you, but async gaps can still slip through.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-change-and-transition-types">The <code>Change</code> and <code>Transition</code> Types<a href="https://dcm.dev/blog/2026/03/11/flutter-bloc-best-practices-youre-probably-missing/#the-change-and-transition-types" class="hash-link" aria-label="Direct link to the-change-and-transition-types" title="Direct link to the-change-and-transition-types" translate="no">​</a></h3>
<p>Understanding these immutable records explains why we need immutable events and states:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">From bloc/lib/src/change.dart and transition.dart</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token metadata function" style="color:#87aff4">@immutable</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Change</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Change</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">currentState</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">nextState</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token plain"> currentState</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token plain"> nextState</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">operator</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">==</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Object</span><span class="token plain"> other</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token function" style="color:#87aff4">identical</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> other</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">||</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      other </span><span class="token operator" style="color:#00bff9">is</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Change</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          runtimeType </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> other</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">runtimeType </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          currentState </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> other</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">currentState </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          nextState </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> other</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">nextState</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@immutable</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Transition</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Event</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Change</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Transition</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token plain"> currentState</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">event</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token plain"> nextState</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">super</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">currentState</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> currentState</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> nextState</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> nextState</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Event</span><span class="token plain"> event</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// 👈 The event is captured in the transition</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>If your events are mutable, a <code>Transition</code> captured by <code>BlocObserver</code> could have its event changed <em>after</em> being logged, creating weird bugs that are almost impossible to track down.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="public-methods-bypass-events">Public Methods Bypass Events<a href="https://dcm.dev/blog/2026/03/11/flutter-bloc-best-practices-youre-probably-missing/#public-methods-bypass-events" class="hash-link" aria-label="Direct link to Public Methods Bypass Events" title="Direct link to Public Methods Bypass Events" translate="no">​</a></h3>
<p>The entire point of the BLoC pattern is unidirectional data flow. Events go in, states come out. When you add public methods to a BLoC, you create a back door that bypasses the event system.</p>
<p>This is what <a class="" href="https://dcm.dev/docs/rules/bloc/avoid-bloc-public-methods/"><code>avoid-bloc-public-methods</code></a> catches.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: Public methods bypass the event system</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CounterBloc</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Bloc</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">CounterEvent</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">CounterBloc</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">super</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// 🚨 This bypasses events entirely!</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// BlocObserver won't see this change.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// You can't replay this action.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// State history becomes incomplete.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">incrementDirectly</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token function" style="color:#87aff4">emit</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">state </span><span class="token operator" style="color:#00bff9">+</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">onChange</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Change</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> change</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">onChange</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">change</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">change</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// Won't log incrementDirectly() calls properly</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>Keep all state mutations flowing through events:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Everything flows through events</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CounterBloc</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Bloc</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">CounterEvent</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">CounterBloc</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">super</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token generic-function" style="color:#87aff4">on</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">IncrementPressed</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">event</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> emit</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">emit</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">state </span><span class="token operator" style="color:#00bff9">+</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Keep implementation details private</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_logAnalytics</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"> </span><span class="token comment" style="color:#999999">/* ... */</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">onChange</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Change</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> change</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">onChange</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">change</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">change</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// ✅ All state changes are tracked</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// Usage in widget:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token generic-function" style="color:#87aff4">read</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">CounterBloc</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">add</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">IncrementPressed</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>When you use events, <code>Bloc.on&lt;E&gt;()</code> creates <code>Transition</code> objects that include the event. But <code>Cubit.emit()</code> (and direct <code>emit()</code> calls from public methods) only create <code>Change</code> objects, no event information. This is why <code>BlocObserver.onTransition()</code> gives you full traceability, but only if you actually use events.</p>
<p>Every public method is technical debt. Your future self (or teammates) will have to figure out which state changes come from events and which come from direct method calls.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="context-and-bloc-to-bloc">Context and BLoC-to-BLoC<a href="https://dcm.dev/blog/2026/03/11/flutter-bloc-best-practices-youre-probably-missing/#context-and-bloc-to-bloc" class="hash-link" aria-label="Direct link to Context and BLoC-to-BLoC" title="Direct link to Context and BLoC-to-BLoC" translate="no">​</a></h2>
<p>Two more architectural rules deserve attention.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="buildcontext-doesnt-belong-in-blocs"><code>BuildContext</code> Doesn't Belong in BLoCs<a href="https://dcm.dev/blog/2026/03/11/flutter-bloc-best-practices-youre-probably-missing/#buildcontext-doesnt-belong-in-blocs" class="hash-link" aria-label="Direct link to buildcontext-doesnt-belong-in-blocs" title="Direct link to buildcontext-doesnt-belong-in-blocs" translate="no">​</a></h3>
<p>When you pass <code>BuildContext</code> to a BLoC event or Cubit method, you're creating a vulnerable situation. The context is tied to a specific widget in the tree. If that widget is disposed while the BLoC is still processing, you get errors like "looking up a deactivated widget's ancestor."</p>
<p>Beyond crashes, passing context destroys testability. How do you unit test a BLoC that needs a real <code>BuildContext</code>?</p>
<p>This is what <a class="" href="https://dcm.dev/docs/rules/bloc/avoid-passing-build-context-to-blocs/"><code>avoid-passing-build-context-to-blocs</code></a> catches.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: Context coupling creates crashes and untestable code</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// In your widget:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">bloc</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">add</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">LoadUserEvent</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// 🚨 Passing context to event</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// In your event:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">LoadUserEvent</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">UserEvent</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// 💥 This will cause problems</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">LoadUserEvent</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// In your Cubit:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SettingsCubit</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Cubit</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">SettingsState</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// 💥 What happens when this context is no longer mounted?</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">loadTheme</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> theme </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Theme</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">of</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// ... use theme</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>Extract the data you need <em>before</em> passing it to the BLoC:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Pass data, not context</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// In your widget:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> userId </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token generic-function" style="color:#87aff4">read</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">AuthBloc</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">state</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">userId</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">bloc</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">add</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">LoadUserEvent</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">userId</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// ✅ Pass the data you need</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// In your event:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">LoadUserEvent</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">UserEvent</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> userId</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// ✅ Just the data</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">LoadUserEvent</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">userId</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// In your Cubit:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SettingsCubit</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Cubit</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">SettingsState</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ThemeRepository</span><span class="token plain"> _themeRepository</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">SettingsCubit</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">._</span><span class="token plain">themeRepository</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">super</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">SettingsInitial</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">loadTheme</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// ✅ Get theme data from repository, not context</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> theme </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> _themeRepository</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">getCurrentTheme</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token function" style="color:#87aff4">emit</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">SettingsLoaded</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">theme</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="blocs-should-not-know-about-each-other">BLoCs Should Not Know About Each Other<a href="https://dcm.dev/blog/2026/03/11/flutter-bloc-best-practices-youre-probably-missing/#blocs-should-not-know-about-each-other" class="hash-link" aria-label="Direct link to BLoCs Should Not Know About Each Other" title="Direct link to BLoCs Should Not Know About Each Other" translate="no">​</a></h3>
<p>It's tempting to inject one BLoC into another when they need to coordinate. But this creates tight coupling and circular dependency risks. If <code>BlocA</code> depends on <code>BlocB</code>, and <code>BlocB</code> needs data from <code>BlocA</code>, you've got a maintenance nightmare.</p>
<p>This is what <a class="" href="https://dcm.dev/docs/rules/bloc/avoid-passing-bloc-to-bloc/"><code>avoid-passing-bloc-to-bloc</code></a> catches.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: Direct BLoC-to-BLoC coupling</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CartBloc</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Bloc</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">CartEvent</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">CartState</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AuthBloc</span><span class="token plain"> authBloc</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// 🚨 Direct dependency</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">late</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StreamSubscription</span><span class="token plain"> _authSubscription</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">CartBloc</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">authBloc</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">super</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">CartInitial</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// 🚨 Tight coupling: CartBloc knows too much about AuthBloc</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    _authSubscription </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> authBloc</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">stream</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">listen</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">authState</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">authState </span><span class="token operator" style="color:#00bff9">is</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Unauthenticated</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token function" style="color:#87aff4">add</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">ClearCartEvent</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics keyword" style="color:#00bff9">void</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">close</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    _authSubscription</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">cancel</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">close</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>There are two better approaches: coordinate in the widget layer, or use a shared stream:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Coordinate at the presentation layer or through repositories</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// Option 1: Coordinate in the widget layer</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CartPage</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BlocListener</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">AuthBloc</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">AuthState</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      listener</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> state</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">state </span><span class="token operator" style="color:#00bff9">is</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Unauthenticated</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token comment" style="color:#999999">// ✅ Widget coordinates between BLoCs</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          context</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token generic-function" style="color:#87aff4">read</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">CartBloc</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">add</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">ClearCartEvent</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CartView</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// Option 2: Use a shared repository/stream</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CartBloc</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Bloc</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">CartEvent</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">CartState</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CartRepository</span><span class="token plain"> _cartRepository</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Stream</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">AuthStatus</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> _authStatusStream</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// ✅ Stream, not BLoC</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">CartBloc</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CartRepository</span><span class="token plain"> cartRepository</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Stream</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">AuthStatus</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> authStatusStream</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _cartRepository </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> cartRepository</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        _authStatusStream </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> authStatusStream</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">super</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">CartInitial</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    _authStatusStream</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">listen</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">status</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">status </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AuthStatus</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">unauthenticated</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token function" style="color:#87aff4">add</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">ClearCartEvent</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<img src="https://dcm.dev/blog/2026-02-17/bloc-coordination-pattern-light.webp" alt="BLoC Coordination Patterns" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="https://dcm.dev/blog/2026-02-17/bloc-coordination-pattern-dark.webp" alt="BLoC Coordination Patterns" class="themedComponent_mlkZ themedComponent--dark_xIcU">
<p>The "quick fix" of passing one BLoC to another always leads to maintenance headaches as the app grows.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-blocbuilder-rebuild-logic">The <code>BlocBuilder</code> Rebuild Logic<a href="https://dcm.dev/blog/2026/03/11/flutter-bloc-best-practices-youre-probably-missing/#the-blocbuilder-rebuild-logic" class="hash-link" aria-label="Direct link to the-blocbuilder-rebuild-logic" title="Direct link to the-blocbuilder-rebuild-logic" translate="no">​</a></h2>
<p>Let's look at how <a href="https://github.com/felangel/bloc/blob/master/packages/flutter_bloc/lib/src/bloc_builder.dart" target="_blank" rel="noopener noreferrer" class=""><code>BlocBuilder</code></a> decides when to rebuild:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">From flutter_bloc/lib/src/bloc_builder.dart</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">typedef</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BlocBuilderCondition</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">S</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Function</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">S</span><span class="token plain"> previous</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">S</span><span class="token plain"> current</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BlocBuilder</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">B</span><span class="token generics"> </span><span class="token generics keyword" style="color:#00bff9">extends</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">StateStreamable</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">S</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">S</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BlocBuilderBase</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">B</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">S</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BlocBuilder</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">builder</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Key</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> key</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">B</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> bloc</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">BlocBuilderCondition</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">S</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> buildWhen</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">super</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> key</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> bloc</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> bloc</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> buildWhen</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> buildWhen</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BlocWidgetBuilder</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">S</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> builder</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">S</span><span class="token plain"> state</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">builder</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> state</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_BlocBuilderBaseState</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">B</span><span class="token generics"> </span><span class="token generics keyword" style="color:#00bff9">extends</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">StateStreamable</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">S</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">S</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">BlocBuilderBase</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">B</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">S</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">late</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">B</span><span class="token plain"> _bloc</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">late</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">S</span><span class="token plain"> _state</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">initState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">initState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    _bloc </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> widget</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">bloc </span><span class="token operator" style="color:#00bff9">?</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token generic-function" style="color:#87aff4">read</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">B</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    _state </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> _bloc</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">state</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">widget</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">bloc </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token comment" style="color:#999999">// Trigger a rebuild if the bloc reference has changed.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      context</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token generic-function" style="color:#87aff4">select</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">B</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">bool</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">bloc</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">identical</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_bloc</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> bloc</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BlocListener</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">B</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">S</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      bloc</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _bloc</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      listenWhen</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> widget</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">buildWhen</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      listener</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> state</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">setState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> _state </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> state</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> widget</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> _state</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>The key insight here: <code>BlocBuilder</code> delegates to <code>BlocListener</code> under the hood! The <code>buildWhen</code> callback is passed as <code>listenWhen</code> to the listener. When a new state arrives:</p>
<ol>
<li class=""><code>BlocListener</code> checks if <code>listenWhen</code> (your <code>buildWhen</code>) returns <code>true</code></li>
<li class="">If true, the listener calls <code>setState(() =&gt; _state = state)</code>, triggering a rebuild</li>
<li class="">If false, the listener doesn't fire, so no <code>setState</code>, no rebuild</li>
</ol>
<p>This is a powerful optimization, but if you leave <code>buildWhen</code> empty or forget to add it for expensive widgets, you're missing optimization opportunities.</p>
<p>This is what <a class="" href="https://dcm.dev/docs/rules/bloc/avoid-empty-build-when/"><code>avoid-empty-build-when</code></a> catches.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: BlocBuilder without buildWhen might rebuild too often</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token class-name" style="color:#7fdbca">BlocBuilder</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">CounterBloc</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// 🚨 No buildWhen means this rebuilds on EVERY state change</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// If the builder is expensive, this could cause jank</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  builder</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> state</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ExpensiveWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">count</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> state</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>Add an explicit <code>buildWhen</code> to control when rebuilds happen:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Explicit buildWhen for optimization</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token class-name" style="color:#7fdbca">BlocBuilder</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">CounterBloc</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  buildWhen</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">previous</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> current</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// ✅ Only rebuild when the count actually changes</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> previous </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> current</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  builder</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> state</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ExpensiveWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">count</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> state</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dart-3-type-safety">Dart 3 Type Safety<a href="https://dcm.dev/blog/2026/03/11/flutter-bloc-best-practices-youre-probably-missing/#dart-3-type-safety" class="hash-link" aria-label="Direct link to Dart 3 Type Safety" title="Direct link to Dart 3 Type Safety" translate="no">​</a></h2>
<p>Dart 3 introduced sealed classes, and they're a game-changer for BLoC patterns. These rules leverage Dart 3's type system to catch bugs at compile time rather than runtime.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="sealed-events-and-states">Sealed Events and States<a href="https://dcm.dev/blog/2026/03/11/flutter-bloc-best-practices-youre-probably-missing/#sealed-events-and-states" class="hash-link" aria-label="Direct link to Sealed Events and States" title="Direct link to Sealed Events and States" translate="no">​</a></h3>
<p>Dart 3's sealed classes enable exhaustiveness checking. If your events and states are sealed, the compiler will warn you when you add a new event but forget to handle it, or when your <code>switch</code> statement doesn't cover all states.</p>
<p>This is what <a class="" href="https://dcm.dev/docs/rules/bloc/prefer-sealed-bloc-events/"><code>prefer-sealed-bloc-events</code></a> and <a class="" href="https://dcm.dev/docs/rules/bloc/prefer-sealed-bloc-state/"><code>prefer-sealed-bloc-state</code></a> enforce.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: No compile-time exhaustiveness checking</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// Without sealed, nothing stops you from forgetting a case</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">abstract</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CounterEvent</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">IncrementEvent</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CounterEvent</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DecrementEvent</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CounterEvent</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ResetEvent</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CounterEvent</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// Added later...</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// In a widget somewhere:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">handleEvent</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">CounterEvent</span><span class="token plain"> event</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">event </span><span class="token operator" style="color:#00bff9">is</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">IncrementEvent</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// handle</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">else</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">event </span><span class="token operator" style="color:#00bff9">is</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DecrementEvent</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// handle</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// 💥 Oops! ResetEvent is silently ignored. No warning.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>With sealed classes, the compiler enforces exhaustive handling:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Sealed classes enable exhaustiveness checking</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">sealed</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CounterEvent</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">IncrementEvent</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CounterEvent</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DecrementEvent</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CounterEvent</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ResetEvent</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CounterEvent</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// Now this is a compile error:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">handleEvent</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">CounterEvent</span><span class="token plain"> event</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">event</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">case</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">IncrementEvent</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token comment" style="color:#999999">// handle</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">case</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DecrementEvent</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token comment" style="color:#999999">// handle</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// ❌ Compile error: The type 'CounterEvent' is not exhaustively matched</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// by the switch cases since it doesn't match 'ResetEvent()'.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>You can configure the naming pattern:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">analysis_options.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">rules</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">prefer-sealed-bloc-events</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">name-pattern</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> Event$</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">prefer-sealed-bloc-state</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">name-pattern</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> State$</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="immutable-events">Immutable Events<a href="https://dcm.dev/blog/2026/03/11/flutter-bloc-best-practices-youre-probably-missing/#immutable-events" class="hash-link" aria-label="Direct link to Immutable Events" title="Direct link to Immutable Events" translate="no">​</a></h3>
<p>If an event can be modified after it's created, you risk mutation-based side effects. An event handler might change a property, affecting how subsequent handlers (or replays) process the same event.</p>
<p>This is what <a class="" href="https://dcm.dev/docs/rules/bloc/prefer-immutable-bloc-events/"><code>prefer-immutable-bloc-events</code></a> catches.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: Mutable events can be modified after dispatch</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">UpdateUserEvent</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">UserEvent</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> name</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// 🚨 Mutable field</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">UpdateUserEvent</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// Somewhere in your code:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> event </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">UpdateUserEvent</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Alice'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">bloc</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">add</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">event</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// Later, accidentally or intentionally:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">event</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">name </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Bob'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// 💥 Mutated after dispatch!</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// If event handlers cache or compare events, this causes chaos.</span></span><br></span></code></pre></div></div>
<p>Make events immutable with <code>final</code> fields and <code>const</code> constructors:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Immutable events are predictable</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token metadata function" style="color:#87aff4">@immutable</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">sealed</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">UserEvent</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@immutable</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">UpdateUserEvent</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">UserEvent</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> name</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// ✅ Final field</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">UpdateUserEvent</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="design-patterns-in-bloc">Design Patterns in BLoC<a href="https://dcm.dev/blog/2026/03/11/flutter-bloc-best-practices-youre-probably-missing/#design-patterns-in-bloc" class="hash-link" aria-label="Direct link to Design Patterns in BLoC" title="Direct link to Design Patterns in BLoC" translate="no">​</a></h2>
<p>When you look at the BLoC source code, you can spot several design patterns at work:</p>
<table><thead><tr><th style="text-align:left">Pattern</th><th style="text-align:left">Where It Appears</th><th style="text-align:left">Purpose</th></tr></thead><tbody><tr><td style="text-align:left"><strong>Observer</strong></td><td style="text-align:left"><code>BlocObserver</code>, <code>stream.listen()</code></td><td style="text-align:left">React to state changes without tight coupling</td></tr><tr><td style="text-align:left"><strong>Command</strong></td><td style="text-align:left"><code>Event</code> classes</td><td style="text-align:left">Encapsulate actions as objects for replay, logging</td></tr><tr><td style="text-align:left"><strong>Mediator</strong></td><td style="text-align:left"><code>BlocProvider</code></td><td style="text-align:left">Decouple BLoC creation from widget tree</td></tr><tr><td style="text-align:left"><strong>Strategy</strong></td><td style="text-align:left"><code>EventTransformer</code></td><td style="text-align:left">Swap event processing strategies (debounce, throttle)</td></tr><tr><td style="text-align:left"><strong>Immutable Value Object</strong></td><td style="text-align:left"><code>Change</code>, <code>Transition</code>, States</td><td style="text-align:left">Ensure predictable, traceable state history</td></tr></tbody></table>
<p>Understanding these patterns explains <em>why</em> the BLoC architecture works and why breaking its contracts (public methods, mutable events, coupled BLoCs) causes problems.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="code-style-rules">Code Style Rules<a href="https://dcm.dev/blog/2026/03/11/flutter-bloc-best-practices-youre-probably-missing/#code-style-rules" class="hash-link" aria-label="Direct link to Code Style Rules" title="Direct link to Code Style Rules" translate="no">​</a></h2>
<p>These rules don't prevent bugs, but they make your codebase more consistent and easier to maintain.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prefer-multi-bloc-provider"><a class="" href="https://dcm.dev/docs/rules/bloc/prefer-multi-bloc-provider/"><code>prefer-multi-bloc-provider</code></a><a href="https://dcm.dev/blog/2026/03/11/flutter-bloc-best-practices-youre-probably-missing/#prefer-multi-bloc-provider" class="hash-link" aria-label="Direct link to prefer-multi-bloc-provider" title="Direct link to prefer-multi-bloc-provider" translate="no">​</a></h3>
<p>When you need multiple BLoCs at the same level, nesting <code>BlocProvider</code> widgets creates an indentation nightmare. <code>MultiBlocProvider</code> is syntactic sugar that keeps things flat.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: Nesting hell</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token class-name" style="color:#7fdbca">BlocProvider</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">AuthBloc</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  create</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AuthBloc</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BlocProvider</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">SettingsBloc</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    create</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SettingsBloc</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BlocProvider</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">ThemeBloc</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      create</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ThemeBloc</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BlocProvider</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">AnalyticsBloc</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        create</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AnalyticsBloc</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// 4 levels deep!</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>Use <code>MultiBlocProvider</code> to keep things flat:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Flat and readable</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token class-name" style="color:#7fdbca">MultiBlocProvider</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  providers</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">BlocProvider</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">AuthBloc</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">create</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AuthBloc</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">BlocProvider</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">SettingsBloc</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">create</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SettingsBloc</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">BlocProvider</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">ThemeBloc</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">create</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ThemeBloc</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">BlocProvider</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">AnalyticsBloc</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">create</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AnalyticsBloc</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prefer-bloc-extensions"><a class="" href="https://dcm.dev/docs/rules/bloc/prefer-bloc-extensions/"><code>prefer-bloc-extensions</code></a><a href="https://dcm.dev/blog/2026/03/11/flutter-bloc-best-practices-youre-probably-missing/#prefer-bloc-extensions" class="hash-link" aria-label="Direct link to prefer-bloc-extensions" title="Direct link to prefer-bloc-extensions" translate="no">​</a></h3>
<p>Use <code>context.read&lt;T&gt;()</code> instead of <code>BlocProvider.of&lt;T&gt;(context)</code>. The extension methods are shorter, more consistent, and make it harder to forget <code>listen: true</code> when you need watch semantics.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: Verbose and easy to forget listen parameter</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// Have to remember listen: false is default (read behavior)</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> bloc </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BlocProvider</span><span class="token number" style="color:#8dec95">.</span><span class="token generic-function" style="color:#87aff4">of</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">CounterBloc</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// Easy to forget listen: true when you need reactivity</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> bloc </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BlocProvider</span><span class="token number" style="color:#8dec95">.</span><span class="token generic-function" style="color:#87aff4">of</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">CounterBloc</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> listen</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>The extension methods are clearer and more concise:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Clear intent, shorter code</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// Read once (doesn't rebuild on state changes)</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> bloc </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token generic-function" style="color:#87aff4">read</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">CounterBloc</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// Watch (rebuilds when state changes)</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> bloc </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token generic-function" style="color:#87aff4">watch</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">CounterBloc</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prefer-bloc-event-suffix--prefer-bloc-state-suffix"><a class="" href="https://dcm.dev/docs/rules/bloc/prefer-bloc-event-suffix/"><code>prefer-bloc-event-suffix</code></a> &amp; <a class="" href="https://dcm.dev/docs/rules/bloc/prefer-bloc-state-suffix/"><code>prefer-bloc-state-suffix</code></a><a href="https://dcm.dev/blog/2026/03/11/flutter-bloc-best-practices-youre-probably-missing/#prefer-bloc-event-suffix--prefer-bloc-state-suffix" class="hash-link" aria-label="Direct link to prefer-bloc-event-suffix--prefer-bloc-state-suffix" title="Direct link to prefer-bloc-event-suffix--prefer-bloc-state-suffix" translate="no">​</a></h3>
<p>When events are named <code>FetchUsers</code> instead of <code>FetchUsersEvent</code>, it becomes harder to distinguish events from methods, classes, or other constructs at a glance.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: Inconsistent naming</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// Is this a class? A method? An event?</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">FetchUsers</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">UpdateProfile</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Loading</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>Consistent suffixes make the intent immediately clear:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Clear suffixes</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// Immediately clear what these are</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">FetchUsersEvent</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">UpdateProfileEvent</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">LoadingState</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>You can customize the pattern:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">analysis_options.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">rules</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">prefer-bloc-event-suffix</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">name-pattern</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> Event$</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">ignore-subclasses</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#8dec95">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">prefer-bloc-state-suffix</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">name-pattern</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> State$</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">ignore-subclasses</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#8dec95">true</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="recommended-configuration">Recommended Configuration<a href="https://dcm.dev/blog/2026/03/11/flutter-bloc-best-practices-youre-probably-missing/#recommended-configuration" class="hash-link" aria-label="Direct link to Recommended Configuration" title="Direct link to Recommended Configuration" translate="no">​</a></h2>
<p>Here's a starting <code>analysis_options.yaml</code> configuration that enables all BLoC rules with sensible defaults:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">analysis_options.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">rules</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:#999999"># Crash &amp; leak prevention</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> check</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">is</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">not</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">closed</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">after</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">async</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">gap</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> avoid</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">existing</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">instances</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">in</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">bloc</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">provider</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> avoid</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">instantiating</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">in</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">bloc</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">provider</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> avoid</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">passing</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">build</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">to</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">blocs</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:#999999"># Architectural integrity</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> avoid</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">bloc</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">public</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">methods</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> avoid</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">bloc</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">public</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">fields</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> emit</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">new</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">bloc</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">state</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">instances</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> avoid</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">passing</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">bloc</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">to</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">bloc</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:#999999"># Modern type safety (Dart 3+)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">prefer-sealed-bloc-events</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">name-pattern</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> Event$</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">prefer-sealed-bloc-state</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">name-pattern</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> State$</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">prefer-immutable-bloc-events</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">name-pattern</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> Event$</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">prefer-immutable-bloc-state</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">name-pattern</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> State$</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:#999999"># Code style</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> prefer</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">multi</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">bloc</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">provider</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> prefer</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">bloc</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">extensions</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> avoid</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">empty</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">build</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">when</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">prefer-bloc-event-suffix</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">name-pattern</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> Event$</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">ignore-subclasses</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#8dec95">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">prefer-bloc-state-suffix</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">name-pattern</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> State$</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">ignore-subclasses</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#8dec95">true</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://dcm.dev/blog/2026/03/11/flutter-bloc-best-practices-youre-probably-missing/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Reading source code is one of the best ways to level up as a developer. The next time you encounter a bug or wonder why a pattern exists, open the source and look for yourself. You might be surprised what you find.</p>
<p>Happy coding!</p>
<div class="formWrapper_FeQU"><p class="formTitle_o9oT">Enjoying this article?</p><p>Subscribe to get our latest articles and product updates by email.</p><form class="footerForm_u4Zn"><input class="trialInput_rT6u" type="email" placeholder="Email address" name="blogEmail"><button type="submit" class="button button--primary button--sm formButton_cuTv">Subscribe</button></form></div>]]></content>
        <author>
            <name>Majid Hajian</name>
            <uri>https://dcm.dev</uri>
        </author>
        <category label="blog" term="blog"/>
        <category label="BLoC" term="BLoC"/>
        <category label="Flutter" term="Flutter"/>
        <category label="State Management" term="State Management"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Flutter Provider Best Practices You're Probably Missing]]></title>
        <id>https://dcm.dev/blog/2026/03/04/flutter-provider-best-practices-youre-probably-missing/</id>
        <link href="https://dcm.dev/blog/2026/03/04/flutter-provider-best-practices-youre-probably-missing/"/>
        <updated>2026-03-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Learn how the Provider package works by reading its source code. Understand the architecture behind Flutter dependency injection and discover why certain patterns prevent bugs and memory leaks.]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="Cover" src="https://dcm.dev/assets/images/2026-03-04-cover-3a1abe44fde614342145292805602074.jpg" width="1050" height="561" class="img_ev3q"></p>
<p>If you've been building Flutter apps for a while, you've almost certainly touched <a href="https://pub.dev/packages/provider" target="_blank" rel="noopener noreferrer" class="">Flutter Provider package</a>, directly or indirectly.</p>
<p>It's one of the most popular (and longest-running) state management solutions in the ecosystem, and its ideas show up everywhere: dependency injection, <code>InheritedWidget</code> powered updates, and patterns that many other packages build on.</p>
<p>That popularity is also exactly why easy mistakes can show up: the famous "my widget isn't rebuilding" bug, silent performance issues from unnecessary subscriptions, or the kind of memory leak that can slowly take over your app over time and cause crashes!</p>
<p>In this article, we'll connect the dots between the <code>Provider</code> implementation (straight from the <a href="https://github.com/rrousselGit/provider" target="_blank" rel="noopener noreferrer" class="">provider repository</a>) and the <a href="https://dcm.dev/docs/rules/?categories=provider" target="_blank" rel="noopener noreferrer" class="">Provider lint rules</a> that prevent those problems, by showing <strong>what's actually happening under the hood</strong>.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>You can find the full source code examples for all the rules discussed in this article in our <a href="https://github.com/mhadaily/flutter_test_cases/tree/main/lib/lint_examples/provider_dcm_lints" target="_blank" rel="noopener noreferrer" class="">examples repository</a>.</p></div></div>
<p>Let's get started!</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-foundation">The Foundation<a href="https://dcm.dev/blog/2026/03/04/flutter-provider-best-practices-youre-probably-missing/#the-foundation" class="hash-link" aria-label="Direct link to The Foundation" title="Direct link to The Foundation" translate="no">​</a></h2>
<p>Every Provider widget ultimately extends <a href="https://github.com/rrousselGit/provider/blob/558bdcd26ddb2b922bec06e3fa0d91bc59479baf/packages/provider/lib/src/inherited_provider.dart#L54" target="_blank" rel="noopener noreferrer" class=""><code>InheritedProvider</code></a>, which is the core building block. Let's look at how it manages the lifecycle:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">From provider/lib/src/inherited_provider.dart</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">InheritedProvider</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SingleChildStatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">/// Creates a value, then expose it to its descendants.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">InheritedProvider</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Key</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> key</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Create</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> create</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">T</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Function</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">T</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> update</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">UpdateShouldNotify</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> updateShouldNotify</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Function</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">T</span><span class="token plain"> value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> debugCheckInvalidValueType</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">StartListening</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> startListening</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Dispose</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> dispose</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// 👈 The dispose callback</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">builder</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> lazy</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _lazy </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> lazy</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        _delegate </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_CreateInheritedProvider</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          create</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> create</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          update</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> update</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          updateShouldNotify</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> updateShouldNotify</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          debugCheckInvalidValueType</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> debugCheckInvalidValueType</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          startListening</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> startListening</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          dispose</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> dispose</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// 👈 Passed to the delegate</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">super</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> key</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">/// Expose an existing value without disposing it.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">InheritedProvider</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">value</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Key</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> key</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">T</span><span class="token plain"> value</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">UpdateShouldNotify</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> updateShouldNotify</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">StartListening</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> startListening</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> lazy</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">builder</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _lazy </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> lazy</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        _delegate </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_ValueInheritedProvider</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// 👈 Different delegate, NO dispose!</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          value</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> value</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          updateShouldNotify</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> updateShouldNotify</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          startListening</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> startListening</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">super</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> key</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>Two key observations from this code:</p>
<ol>
<li class=""><strong>The <code>create</code> constructor accepts a <code>dispose</code> callback</strong>, <code>Provider</code> will call this when the widget is unmounted</li>
<li class=""><strong>The <code>.value</code> constructor uses a different delegate</strong>, It doesn't accept a <code>dispose</code> callback because it doesn't own the lifecycle</li>
</ol>
<p>This distinction is fundamental to understanding <code>Provider</code> lifecycle bugs.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-changenotifierprovider-lifecycle">The <code>ChangeNotifierProvider</code> Lifecycle<a href="https://dcm.dev/blog/2026/03/04/flutter-provider-best-practices-youre-probably-missing/#the-changenotifierprovider-lifecycle" class="hash-link" aria-label="Direct link to the-changenotifierprovider-lifecycle" title="Direct link to the-changenotifierprovider-lifecycle" translate="no">​</a></h3>
<p>Let's look at how <a href="https://github.com/rrousselGit/provider/blob/558bdcd26ddb2b922bec06e3fa0d91bc59479baf/packages/provider/lib/src/change_notifier_provider.dart#L98" target="_blank" rel="noopener noreferrer" class=""><code>ChangeNotifierProvider</code></a> extends this pattern:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">From provider/lib/src/change_notifier_provider.dart</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ChangeNotifierProvider</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics"> </span><span class="token generics keyword" style="color:#00bff9">extends</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">ChangeNotifier</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ListenableProvider</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">/// Creates a [ChangeNotifier] using `create` and automatically</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">/// disposes it when [ChangeNotifierProvider] is removed from the widget tree.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">ChangeNotifierProvider</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Key</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> key</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Create</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> create</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> lazy</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">TransitionBuilder</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> builder</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">super</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          key</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> key</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          create</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> create</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          dispose</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _dispose</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// 👈 Auto-dispose for create:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          lazy</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> lazy</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          builder</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> builder</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">/// Provides an existing [ChangeNotifier].</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">ChangeNotifierProvider</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">value</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Key</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> key</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">T</span><span class="token plain"> value</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">TransitionBuilder</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> builder</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">value</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// 👈 NO dispose for .value!</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          key</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> key</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          builder</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> builder</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          value</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> value</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_dispose</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ChangeNotifier</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> notifier</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    notifier</span><span class="token operator" style="color:#00bff9">?</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">dispose</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// 👈 The actual disposal</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>Look at the two code paths:</p>
<ul>
<li class=""><strong><code>create</code> mode</strong>: Automatically calls <code>notifier?.dispose()</code> when the provider is removed</li>
<li class=""><strong><code>.value</code> mode</strong>: No automatic disposal, you're expected to manage the lifecycle yourself</li>
</ul>
<p>This is exactly why the lifecycle rules exist.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-value-constructor-trap">The <code>.value</code> Constructor Trap<a href="https://dcm.dev/blog/2026/03/04/flutter-provider-best-practices-youre-probably-missing/#the-value-constructor-trap" class="hash-link" aria-label="Direct link to the-value-constructor-trap" title="Direct link to the-value-constructor-trap" translate="no">​</a></h2>
<p>The <code>Provider</code> source code makes it clear: <code>.value</code> is for <em>existing</em> instances that you manage yourself. But developers often misuse it by instantiating new objects directly inside.</p>
<p>This is what <a class="" href="https://dcm.dev/docs/rules/provider/avoid-instantiating-in-value-provider/"><code>avoid-instantiating-in-value-provider</code></a> catches.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>While we use <code>ChangeNotifierProvider</code> in these examples, this rule applies to <strong>all</strong> providers with a <code>.value</code> constructor: <code>Provider.value</code>, <code>ListenableProvider.value</code>, <code>StreamProvider.value</code>, <code>FutureProvider.value</code>, and others.</p></div></div>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: Memory leak, nobody disposes this!</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ChangeNotifierProvider</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">value</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token comment" style="color:#999999">// 💥 MEMORY LEAK: This ChangeNotifier will never be disposed!</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      value</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyChangeNotifier</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">HomePage</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>Every time <code>MyApp</code> rebuilds (which happens often in Flutter), a new <code>MyChangeNotifier</code> is created. The old one is never disposed because <code>.value</code> doesn't manage lifecycle. This leads to:</p>
<ul>
<li class="">Memory accumulation</li>
<li class="">Listener callbacks piling up</li>
<li class="">Eventually, app sluggishness or crashes</li>
</ul>
<p>The fix is simple, use the <code>create</code> constructor when you want <code>Provider</code> to manage the instance:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Provider manages the lifecycle</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ChangeNotifierProvider</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token comment" style="color:#999999">// ✅ Provider creates it, Provider disposes it</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      create</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyChangeNotifier</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">HomePage</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>Or, if you need to use <code>.value</code> (like when passing an existing instance to a new route), manage the lifecycle yourself:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: You manage the lifecycle</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ParentWidget</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatefulWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">ParentWidget</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">createState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_ParentWidgetState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_ParentWidgetState</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">ParentWidget</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">late</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyChangeNotifier</span><span class="token plain"> _notifier</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">initState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">initState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    _notifier </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyChangeNotifier</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">dispose</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    _notifier</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">dispose</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// ✅ You manage the lifecycle</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">dispose</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ChangeNotifierProvider</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">value</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      value</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _notifier</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// ✅ Existing instance</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ChildWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-dispose-callback-gap">The <code>dispose</code> Callback Gap<a href="https://dcm.dev/blog/2026/03/04/flutter-provider-best-practices-youre-probably-missing/#the-dispose-callback-gap" class="hash-link" aria-label="Direct link to the-dispose-callback-gap" title="Direct link to the-dispose-callback-gap" translate="no">​</a></h2>
<p>Even when using the <code>create:</code> constructor correctly, there's another easy-to-miss bug which is classes with <code>dispose</code> methods that aren't <code>ChangeNotifiers</code>.</p>
<p>Look at this part of the <a href="https://github.com/rrousselGit/provider/blob/558bdcd26ddb2b922bec06e3fa0d91bc59479baf/packages/provider/lib/src/provider.dart#L236" target="_blank" rel="noopener noreferrer" class=""><code>Provider</code></a> class:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">From provider/lib/src/provider.dart</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Provider</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">InheritedProvider</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">/// Creates a value, store it, and expose it to its descendants.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">///</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">/// The value can be optionally disposed using [dispose] callback.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Provider</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Key</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> key</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Create</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> create</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Dispose</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> dispose</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// 👈 Optional dispose callback</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> lazy</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">TransitionBuilder</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> builder</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">super</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          key</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> key</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          lazy</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> lazy</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          builder</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> builder</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          create</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> create</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          dispose</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> dispose</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// 👈 YOU must pass it!</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token comment" style="color:#999999">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>Unlike <code>ChangeNotifierProvider</code>, the base <code>Provider</code> doesn't automatically call <code>dispose()</code>. You must explicitly provide the callback. This is what <a class="" href="https://dcm.dev/docs/rules/provider/dispose-providers/"><code>dispose-providers</code></a> catches.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: dispose() is never called</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DatabaseService</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Database</span><span class="token plain"> _db</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">DatabaseService</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _db </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Database</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">open</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">dispose</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    _db</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">close</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// This cleanup never happens!</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// In your widget tree:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Provider</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  create</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DatabaseService</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// 💥 No dispose callback! Database connection leaked!</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>The fix is to provide the <code>dispose</code> callback:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: dispose() is called on unmount</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token class-name" style="color:#7fdbca">Provider</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  create</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DatabaseService</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  dispose</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> service</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> service</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">dispose</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// ✅ Cleanup happens</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>This rule triggers for any class that has <code>dispose</code>, <code>close</code>, or <code>cancel</code> methods not called inside the <code>dispose</code> callback.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-read-vs-watch-distinction">The <code>read</code> vs <code>watch</code> Distinction<a href="https://dcm.dev/blog/2026/03/04/flutter-provider-best-practices-youre-probably-missing/#the-read-vs-watch-distinction" class="hash-link" aria-label="Direct link to the-read-vs-watch-distinction" title="Direct link to the-read-vs-watch-distinction" translate="no">​</a></h2>
<p>One of the most important design decisions in <code>Provider</code> is the separation between "reading once" and "subscribing to changes." Let's look at the <a href="https://github.com/rrousselGit/provider/blob/558bdcd26ddb2b922bec06e3fa0d91bc59479baf/packages/provider/lib/src/provider.dart#L551" target="_blank" rel="noopener noreferrer" class="">ReadContext</a> and <a href="https://github.com/rrousselGit/provider/blob/558bdcd26ddb2b922bec06e3fa0d91bc59479baf/packages/provider/lib/src/provider.dart#L688" target="_blank" rel="noopener noreferrer" class="">WatchContext</a> source code:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">From provider/lib/src/provider.dart</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">/// Exposes the [read] method.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">extension</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ReadContext</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">on</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">T</span><span class="token plain"> </span><span class="token generic-function" style="color:#87aff4">read</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Provider</span><span class="token number" style="color:#8dec95">.</span><span class="token generic-function" style="color:#87aff4">of</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> listen</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// 👈 listen: false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">/// Exposes the [watch] method.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">extension</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">WatchContext</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">on</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">T</span><span class="token plain"> </span><span class="token generic-function" style="color:#87aff4">watch</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Provider</span><span class="token number" style="color:#8dec95">.</span><span class="token generic-function" style="color:#87aff4">of</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// 👈 listen: true (default)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>The difference is just one parameter: <code>listen</code>. But the implications are huge:</p>
<ul>
<li class=""><strong><code>watch</code> (listen: true)</strong>: Registers a dependency. When the provider's value changes, Flutter marks this widget for rebuild.</li>
<li class=""><strong><code>read</code> (listen: false)</strong>: Gets the value once. No subscription. Widget won't rebuild when value changes.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-read-inside-build-bug">The <code>read</code> Inside <code>build</code> Bug<a href="https://dcm.dev/blog/2026/03/04/flutter-provider-best-practices-youre-probably-missing/#the-read-inside-build-bug" class="hash-link" aria-label="Direct link to the-read-inside-build-bug" title="Direct link to the-read-inside-build-bug" translate="no">​</a></h3>
<p>This is what <a class="" href="https://dcm.dev/docs/rules/provider/avoid-read-inside-build/"><code>avoid-read-inside-build</code></a> catches.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: Widget won't update when counter changes!</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CounterDisplay</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CounterDisplay</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// 💥 Using read inside build — no subscription!</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> counter </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token generic-function" style="color:#87aff4">read</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Counter</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Count: </span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">${</span><span class="token string-literal interpolation expression">counter</span><span class="token string-literal interpolation expression operator" style="color:#00bff9">?</span><span class="token string-literal interpolation expression number" style="color:#8dec95">.</span><span class="token string-literal interpolation expression">value </span><span class="token string-literal interpolation expression operator" style="color:#00bff9">?</span><span class="token string-literal interpolation expression operator" style="color:#00bff9">?</span><span class="token string-literal interpolation expression"> </span><span class="token string-literal interpolation expression number" style="color:#8dec95">0</span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">}</span><span class="token string-literal string" style="color:#e1ffe4">'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>The problem: <code>read</code> doesn't subscribe. When <code>Counter</code> calls <code>notifyListeners()</code>, this widget <strong>won't rebuild</strong>. The display shows stale data.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Widget updates when counter changes</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CounterDisplay</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CounterDisplay</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// ✅ Using watch inside build — subscribed to changes!</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> counter </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token generic-function" style="color:#87aff4">watch</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Counter</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Count: </span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">${</span><span class="token string-literal interpolation expression">counter</span><span class="token string-literal interpolation expression operator" style="color:#00bff9">?</span><span class="token string-literal interpolation expression number" style="color:#8dec95">.</span><span class="token string-literal interpolation expression">value </span><span class="token string-literal interpolation expression operator" style="color:#00bff9">?</span><span class="token string-literal interpolation expression operator" style="color:#00bff9">?</span><span class="token string-literal interpolation expression"> </span><span class="token string-literal interpolation expression number" style="color:#8dec95">0</span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">}</span><span class="token string-literal string" style="color:#e1ffe4">'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-watch-outside-build-bug">The <code>watch</code> Outside <code>build</code> Bug<a href="https://dcm.dev/blog/2026/03/04/flutter-provider-best-practices-youre-probably-missing/#the-watch-outside-build-bug" class="hash-link" aria-label="Direct link to the-watch-outside-build-bug" title="Direct link to the-watch-outside-build-bug" translate="no">​</a></h3>
<p>The flip side is equally problematic. This is what <a class="" href="https://dcm.dev/docs/rules/provider/avoid-watch-outside-build/"><code>avoid-watch-outside-build</code></a> catches.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: Subscribing where it doesn't make sense</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyHomePage</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_handleTap</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// 💥 Using watch outside build — wasteful and potentially buggy!</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> counter </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token generic-function" style="color:#87aff4">watch</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Counter</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    counter</span><span class="token operator" style="color:#00bff9">?</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">increment</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ElevatedButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      onPressed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_handleTap</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Increment'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>When you use <code>watch</code> in a callback, you're creating a subscription that won't trigger any meaningful rebuild (the callback already finished). Use <code>read</code> instead for one-time access:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Read for event handlers</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyHomePage</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_handleTap</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// ✅ Using read in callback — no unnecessary subscription</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> counter </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token generic-function" style="color:#87aff4">read</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Counter</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    counter</span><span class="token operator" style="color:#00bff9">?</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">increment</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ElevatedButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      onPressed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_handleTap</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Increment'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p><strong>The rule of thumb:</strong></p>
<ul>
<li class=""><strong>Inside <code>build</code></strong>: Use <code>watch</code> to subscribe to changes</li>
<li class=""><strong>Outside <code>build</code></strong> (callbacks, initState, etc.): Use <code>read</code> to get the value once</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-selector-rebuild-logic">The <code>Selector</code> Rebuild Logic<a href="https://dcm.dev/blog/2026/03/04/flutter-provider-best-practices-youre-probably-missing/#the-selector-rebuild-logic" class="hash-link" aria-label="Direct link to the-selector-rebuild-logic" title="Direct link to the-selector-rebuild-logic" translate="no">​</a></h2>
<p>Let's look at how <a href="https://github.com/rrousselGit/provider/blob/558bdcd26ddb2b922bec06e3fa0d91bc59479baf/packages/provider/lib/src/selector.dart#L68" target="_blank" rel="noopener noreferrer" class=""><code>Selector</code></a> optimizes rebuilds:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">From provider/lib/src/selector.dart</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_Selector0State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SingleChildState</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Selector0</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">T</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> value</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> cache</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> oldWidget</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">buildWithChild</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> selected </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> widget</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">selector</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> shouldInvalidateCache </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> oldWidget </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> widget </span><span class="token operator" style="color:#00bff9">||</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">widget</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">_shouldRebuild </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            widget</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">_shouldRebuild</span><span class="token operator" style="color:#00bff9">!</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">value </span><span class="token operator" style="color:#00bff9">as</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">T</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> selected</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">||</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">widget</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">_shouldRebuild </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token operator" style="color:#00bff9">!</span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DeepCollectionEquality</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">equals</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> selected</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// 👈 Deep equality check!</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">shouldInvalidateCache</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      value </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> selected</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      oldWidget </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> widget</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      cache </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Builder</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        builder</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> widget</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">builder</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          context</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          selected</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          child</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> cache</span><span class="token operator" style="color:#00bff9">!</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// 👈 Returns cached widget if nothing changed</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>Key insight: <code>Selector</code> uses <a href="https://api.flutter.dev/flutter/package-collection_collection/DeepCollectionEquality-class.html" target="_blank" rel="noopener noreferrer" class=""><code>DeepCollectionEquality</code></a> from the package <a href="https://api.flutter.dev/flutter/package-collection_collection/" target="_blank" rel="noopener noreferrer" class=""><code>collection</code></a>, by default to compare the old and new selected values. If they're equal, <strong>the builder won't be called</strong>, and the cached widget is returned.</p>
<p>But here's the catch: <strong>the selected value must be immutable</strong>. If you return a mutable object from the selector, <code>Selector</code> might think nothing changed (same reference) even though the contents did change.</p>
<p>This is what <a class="" href="https://dcm.dev/docs/rules/provider/prefer-immutable-selector-value/"><code>prefer-immutable-selector-value</code></a> catches.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: Mutable value may cause skipped or incorrect rebuilds</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token class-name" style="color:#7fdbca">Selector</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">UserModel</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">UserProfile</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  selector</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> user</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> user</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">profile</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// 💥 If UserProfile is mutable, bad things happen</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  builder</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> profile</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">profile</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">UserProfile</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> name</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// 🚨 Mutable field!</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>If <code>UserProfile</code> is mutable and someone changes <code>profile.name</code> directly (without creating a new <code>UserProfile</code> instance), the <code>Selector</code> might not detect the change because the reference is the same.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Immutable value ensures correct rebuilds</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Selector</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">UserModel</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">UserProfile</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  selector</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> user</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> user</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">profile</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  builder</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> profile</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">profile</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@immutable</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">UserProfile</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> name</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// ✅ Final field</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">UserProfile</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">operator</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">==</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Object</span><span class="token plain"> other</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token function" style="color:#87aff4">identical</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> other</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">||</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      other </span><span class="token operator" style="color:#00bff9">is</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">UserProfile</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          runtimeType </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> other</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">runtimeType </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          name </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> other</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">get</span><span class="token plain"> hashCode </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> name</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">hashCode</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="handling-missing-providers-gracefully">Handling Missing Providers Gracefully<a href="https://dcm.dev/blog/2026/03/04/flutter-provider-best-practices-youre-probably-missing/#handling-missing-providers-gracefully" class="hash-link" aria-label="Direct link to Handling Missing Providers Gracefully" title="Direct link to Handling Missing Providers Gracefully" translate="no">​</a></h2>
<p>Let's look at how <a href="https://github.com/rrousselGit/provider/blob/558bdcd26ddb2b922bec06e3fa0d91bc59479baf/packages/provider/lib/src/provider.dart#L349" target="_blank" rel="noopener noreferrer" class="">Provider</a> handles the case when no matching provider is found:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">From provider/lib/src/provider.dart</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">static</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_InheritedProviderScopeElement</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> _inheritedElementOf</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// ... assertions ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> inheritedElement </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token generic-function" style="color:#87aff4">getElementForInheritedWidgetOfExactType</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token generics">      </span><span class="token generics class-name" style="color:#7fdbca">_InheritedProviderScope</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">as</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_InheritedProviderScopeElement</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token operator" style="color:#00bff9">?</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">inheritedElement </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">is!</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">T</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">throw</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ProviderNotFoundException</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">T</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">widget</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">runtimeType</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> inheritedElement</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>Notice this line: <code>if (inheritedElement == null &amp;&amp; null is! T)</code>. If the type <code>T</code> is nullable (like <code>Model?</code>), Provider returns <code>null</code> instead of throwing. If <code>T</code> is non-nullable (like <code>Model</code>), it throws <code>ProviderNotFoundException</code>.</p>
<p>This is what <a class="" href="https://dcm.dev/docs/rules/provider/prefer-nullable-provider-types/"><code>prefer-nullable-provider-types</code></a> leverages.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: Crashes if provider is missing</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ReusableWidget</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// 💥 Throws ProviderNotFoundException if used outside provider scope!</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> model </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token generic-function" style="color:#87aff4">watch</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">UserModel</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">model</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>If this widget is used somewhere without a <code>UserModel</code> provider above it in the tree, your app crashes. For reusable widgets, consider making the type nullable:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Handles missing provider gracefully</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ReusableWidget</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ReusableWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// ✅ Returns null if provider is missing</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> model </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token generic-function" style="color:#87aff4">watch</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">UserModel</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">model </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'No user'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">model</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Use this rule if you rely on conditionally provided values and deal with unhandled missing value cases.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="code-style-rules">Code Style Rules<a href="https://dcm.dev/blog/2026/03/04/flutter-provider-best-practices-youre-probably-missing/#code-style-rules" class="hash-link" aria-label="Direct link to Code Style Rules" title="Direct link to Code Style Rules" translate="no">​</a></h2>
<p>These rules don't prevent bugs, but they make your codebase more consistent and easier to maintain.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="multiple-providers">Multiple Providers<a href="https://dcm.dev/blog/2026/03/04/flutter-provider-best-practices-youre-probably-missing/#multiple-providers" class="hash-link" aria-label="Direct link to Multiple Providers" title="Direct link to Multiple Providers" translate="no">​</a></h3>
<p>When you need multiple providers at the same level, nesting them creates an indentation nightmare. Let's look at how <a href="https://github.com/rrousselGit/provider/blob/558bdcd26ddb2b922bec06e3fa0d91bc59479baf/packages/provider/lib/src/provider.dart#L61" target="_blank" rel="noopener noreferrer" class=""><code>MultiProvider</code></a> solves this:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">From provider/lib/src/provider.dart</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MultiProvider</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Nested</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">/// Build a tree of providers from a list of [SingleChildWidget].</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">MultiProvider</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Key</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> key</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">SingleChildWidget</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> providers</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">TransitionBuilder</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> builder</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">super</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          key</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> key</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_collapseProviders</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">providers</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> builder </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Builder</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  builder</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">builder</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p><code>MultiProvider</code> is essentially syntactic sugar that flattens nested providers. The behavior is identical, but the code is much more readable. That's where the <a class="" href="https://dcm.dev/docs/rules/provider/prefer-multi-provider/"><code>prefer-multi-provider</code></a> rule can catch and prevent this situation.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: Nesting hell</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token class-name" style="color:#7fdbca">Provider</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">AuthService</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  create</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AuthService</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Provider</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">ApiClient</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    create</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ApiClient</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ChangeNotifierProvider</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">UserModel</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      create</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">UserModel</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ChangeNotifierProvider</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">SettingsModel</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        create</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SettingsModel</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// 4 levels deep!</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>Use <code>MultiProvider</code> to keep things flat:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Flat and readable</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token class-name" style="color:#7fdbca">MultiProvider</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  providers</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Provider</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">AuthService</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">create</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AuthService</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Provider</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">ApiClient</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">create</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ApiClient</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">ChangeNotifierProvider</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">UserModel</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">create</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">UserModel</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">ChangeNotifierProvider</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">SettingsModel</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">create</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SettingsModel</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-extension-methods">The Extension Methods<a href="https://dcm.dev/blog/2026/03/04/flutter-provider-best-practices-youre-probably-missing/#the-extension-methods" class="hash-link" aria-label="Direct link to The Extension Methods" title="Direct link to The Extension Methods" translate="no">​</a></h3>
<p>Use <code>context.read&lt;T&gt;()</code> and <code>context.watch&lt;T&gt;()</code> instead of <code>Provider.of&lt;T&gt;(context)</code>. The extension methods are shorter, and make it harder to forget <code>listen: false</code> when you need read semantics.</p>
<p>That's where <a class="" href="https://dcm.dev/docs/rules/provider/prefer-provider-extensions/"><code>prefer-provider-extensions</code></a> rule can catch this.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">❌ Bad: Verbose and easy to forget listen parameter</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// Have to remember listen: true is default (watch behavior)</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> model </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Provider</span><span class="token number" style="color:#8dec95">.</span><span class="token generic-function" style="color:#87aff4">of</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">UserModel</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// Easy to forget listen: false when you need read</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> model </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Provider</span><span class="token number" style="color:#8dec95">.</span><span class="token generic-function" style="color:#87aff4">of</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">UserModel</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> listen</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>The extension methods make intent explicit:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">✅ Good: Clear intent, shorter code</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// Watch (rebuilds when value changes)</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> model </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token generic-function" style="color:#87aff4">watch</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">UserModel</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// Read once (doesn't rebuild on changes)</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> model </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token generic-function" style="color:#87aff4">read</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">UserModel</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// Select a specific part</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> name </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">select</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">UserModel</span><span class="token plain"> m</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> m</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="design-patterns-in-provider">Design Patterns in Provider<a href="https://dcm.dev/blog/2026/03/04/flutter-provider-best-practices-youre-probably-missing/#design-patterns-in-provider" class="hash-link" aria-label="Direct link to Design Patterns in Provider" title="Direct link to Design Patterns in Provider" translate="no">​</a></h2>
<p>When you look at the Provider source code, you can spot several design patterns at work:</p>
<table><thead><tr><th style="text-align:left">Pattern</th><th style="text-align:left">Where It Appears</th><th style="text-align:left">Purpose</th></tr></thead><tbody><tr><td style="text-align:left"><strong>Dependency Injection</strong></td><td style="text-align:left"><code>Provider</code>, <code>InheritedProvider</code></td><td style="text-align:left">Decouple object creation from object usage</td></tr><tr><td style="text-align:left"><strong>Composite</strong></td><td style="text-align:left"><code>MultiProvider</code>, <code>Nested</code></td><td style="text-align:left">Treat multiple providers as a single unit</td></tr><tr><td style="text-align:left"><strong>Observer</strong></td><td style="text-align:left"><code>ChangeNotifier</code>, <code>ListenableProvider</code></td><td style="text-align:left">React to state changes without tight coupling</td></tr><tr><td style="text-align:left"><strong>Strategy</strong></td><td style="text-align:left"><code>Selector.shouldRebuild</code></td><td style="text-align:left">Swap comparison strategies for rebuilds</td></tr><tr><td style="text-align:left"><strong>Lazy Initialization</strong></td><td style="text-align:left"><code>lazy: true</code> (default)</td><td style="text-align:left">Create objects only when first accessed</td></tr><tr><td style="text-align:left"><strong>Immutable Value Object</strong></td><td style="text-align:left"><code>context.select()</code> results</td><td style="text-align:left">Ensure predictable, comparable state</td></tr></tbody></table>
<p>Understanding these patterns explains <em>why</em> the Provider architecture works and why breaking its contracts (lifecycle mismanagement, mutable selectors) causes problems.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Are you interested in reading and learning more about these design patterns? Write an email to us and ask to elaborate more with a new blog post allocated to this topic.</p></div></div>
<p>Moreover, in my book <a href="https://flutterengineering.io/" target="_blank" rel="noopener noreferrer" class="">"Flutter Engineering"</a> I have dedicated a full chapter to design patterns using Flutter source code and examples.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="recommended-configuration">Recommended Configuration<a href="https://dcm.dev/blog/2026/03/04/flutter-provider-best-practices-youre-probably-missing/#recommended-configuration" class="hash-link" aria-label="Direct link to Recommended Configuration" title="Direct link to Recommended Configuration" translate="no">​</a></h2>
<p>Here's a starting <code>analysis_options.yaml</code> configuration that enables all Provider rules with sensible defaults:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">analysis_options.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">rules</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:#999999"># Lifecycle &amp; memory leak prevention</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> avoid</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">instantiating</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">in</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">provider</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> dispose</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">providers</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:#999999"># Rebuild correctness</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> avoid</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">read</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">inside</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">build</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> avoid</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">watch</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">outside</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">build</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> prefer</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">immutable</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">selector</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">value</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:#999999"># Defensive coding</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> prefer</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">nullable</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">provider</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">types</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:#999999"># Code style &amp; readability</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> prefer</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">multi</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">provider</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> prefer</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">provider</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">extensions</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://dcm.dev/blog/2026/03/04/flutter-provider-best-practices-youre-probably-missing/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Reading the <code>Provider</code> source code reveals a thoughtfully designed system with clear lifecycle management, subscription semantics, and optimization strategies.</p>
<p>The DCM rules map directly to those choices (lifecycle, rebuild semantics, selector immutability, and style) to help avoid leaks, missed updates, and confusing code.</p>
<p>Happy coding and make your Flutter app <code>Provider</code> production-ready!</p>
<div class="formWrapper_FeQU"><p class="formTitle_o9oT">Enjoying this article?</p><p>Subscribe to get our latest articles and product updates by email.</p><form class="footerForm_u4Zn"><input class="trialInput_rT6u" type="email" placeholder="Email address" name="blogEmail"><button type="submit" class="button button--primary button--sm formButton_cuTv">Subscribe</button></form></div>]]></content>
        <author>
            <name>Majid Hajian</name>
            <uri>https://dcm.dev</uri>
        </author>
        <category label="blog" term="blog"/>
        <category label="Provider" term="Provider"/>
        <category label="Flutter" term="Flutter"/>
        <category label="State Management" term="State Management"/>
        <category label="Dependency Injection" term="Dependency Injection"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[DCM 2025: Year in Review]]></title>
        <id>https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/</id>
        <link href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/"/>
        <updated>2026-01-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[2025 was a transformative year for DCM. From DCM Dashboards to massive memory optimizations, 81 new rules, MCP Server integration, and baseline maturity, here are the highlights!]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="Cover" src="https://dcm.dev/assets/images/2026-01-15-cover-8be090ed21a3596b6ce8e342b487d2a5.jpg" width="1400" height="736" class="img_ev3q"></p>
<p>2025 was an exciting year for DCM. From <strong>1.26.0</strong> (January) to <strong>1.34.0</strong> (December), we shipped <strong>8 releases</strong> packed with most-requested and practical features and continued our mission to help Dart and Flutter teams write better and higher quality code.</p>
<p>Here's a quick snapshot of what we accomplished:</p>
<ul>
<li class=""><strong>93 new rules</strong> added (now <a href="https://dcm.dev/docs/rules/" target="_blank" rel="noopener noreferrer" class=""><strong>478 total</strong></a>)<!-- -->
<ul>
<li class="">Common: +64</li>
<li class="">Flutter: +12</li>
<li class="">Riverpod: +7</li>
<li class="">Pub: +6</li>
<li class="">Provider: +2</li>
<li class="">Equatable: +1</li>
<li class="">Easy Localization: +1</li>
</ul>
</li>
<li class=""><strong>200+ fixes and rules improved</strong> with better accuracy, new cases and new fixes including over 50 fixes for existing rules that have been added and 146 unique rules improved.</li>
<li class=""><strong>Up to 91% memory reduction</strong> when running CLI commands on large repos (4GB → 350MB)</li>
<li class=""><strong>44 new rules</strong> added to the <a href="https://dcm.dev/docs/rules/?presets=recommended" target="_blank" rel="noopener noreferrer" class="">recommended preset</a> which makes it in total 181 rules</li>
<li class=""><strong>Metrics improved</strong> with now show line-level attribution in HTML reports, support advanced configuration per path, include a new <code>dcm init metrics-preview</code> command and many improvements along.</li>
<li class=""><strong>43+ rules</strong> added to the Free tier (now has 100 rules)</li>
<li class=""><strong>Dot shorthands support</strong> added within a short time of releasing that feature in Dart. A <a href="https://dcm.dev/blog/2025/11/17/deeper-look-darts-dot-shorthand-hidden-complexity/" target="_blank" rel="noopener noreferrer" class="">comprehensive blog</a> was released as well.</li>
<li class=""><strong>DCM Dashboards</strong> went from closed beta to GA</li>
<li class=""><strong>MCP Server integration</strong> for IDE-agnostic tooling and tighter integration with AI assisted tooling</li>
<li class=""><strong>Baseline support</strong> expanded to all code quality commands</li>
</ul>
<p>This year, our enterprise-grade linting tool helps you focus on building your apps with high standards, quality and less-friction.</p>
<p>Let's take a look back at the highlights!</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-dcm-dashboards">1. DCM Dashboards<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#1-dcm-dashboards" class="hash-link" aria-label="Direct link to 1. DCM Dashboards" title="Direct link to 1. DCM Dashboards" translate="no">​</a></h2>
<p>One of our biggest launches this year was <a href="https://dcm.dev/docs/dashboards/" target="_blank" rel="noopener noreferrer" class=""><strong>DCM Dashboards</strong></a>, a new part of our product that helps you get a clear view of all open issues and metrics, and how the numbers change over time.</p>
<p>We started with a <a href="https://dcm.dev/blog/2025/02/11/announcing-dcm-dashboards/" target="_blank" rel="noopener noreferrer" class="">closed beta in February</a> (1.27.0) and made it <strong>generally available in April</strong> (1.28.0) to all Teams and Enterprise users.</p>
<p><img decoding="async" loading="lazy" alt="Projects Overview" src="https://dcm.dev/assets/images/add-project-e3eadd4bfb580389fa9ad69328bb0c96.webp" width="2560" height="1552" class="img_ev3q"></p>
<p>The key Dashboard features include:</p>
<ul>
<li class=""><strong>Projects Overview</strong>: High-level summary of all active projects, whether single packages or full monorepos</li>
<li class=""><strong>Issues Overview</strong>: Breakdown of issues grouped by categories with estimated time to fix</li>
<li class=""><strong>Open Issues Over Time</strong>: A chart showing how open issues change over time for different intervals (e.g. 7 days, 30 days, etc)</li>
<li class=""><strong>Metrics</strong>: Summary view of all enabled metrics</li>
<li class=""><strong>Printable Reports</strong>: Export dashboards as PDF for sharing with stakeholders</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Issues Overview" src="https://dcm.dev/assets/images/issues-overview-7c206ea0a7164925d072ac4181739429.webp" width="2048" height="2160" class="img_ev3q"></p>
<p>Throughout the year, we continued to enhance Dashboards:</p>
<ul>
<li class=""><strong>New summary views</strong> replacing detailed views for better usability (1.30.0)</li>
<li class=""><strong>Issues/metric violations change display</strong> Added support for displaying how the number of issues/metric violations changed compared to the previous interval. For the issues overview section, the default interval is 7 days (1.31.0)</li>
<li class=""><strong>"View Selected" role</strong> for granular project access control (1.32.0)</li>
<li class=""><strong>Updated billing page</strong> with better seat selection UX (1.32.0)</li>
<li class=""><strong>Automatic project creation</strong> based on monorepo structure via <code>--scaffold</code> (1.33.0)</li>
<li class=""><strong>Project tagging system</strong> for better organization (1.33.0)</li>
<li class=""><strong>External user invites</strong> with "View Selected" role (1.33.0)</li>
<li class=""><strong>Redesigned Dashboards page</strong> (1.33.0)</li>
</ul>
<p>These improvements made the dashboard a powerful companion for teams who want more control and observability, especially important in this era of AI-generated code.</p>
<video width="100%" controls="" autoplay="" loop="" playsinline=""><source src="/video/open-issues.mp4"></video>
<p>For setup and day-to-day usage, these docs are a great starting point:</p>
<ul>
<li class=""><a href="https://dcm.dev/docs/dashboards/" target="_blank" rel="noopener noreferrer" class="">Dashboards documentation</a></li>
<li class=""><a href="https://dcm.dev/docs/guides/uploading-data-to-dashboards/" target="_blank" rel="noopener noreferrer" class="">Guide: Uploading data to Dashboards</a></li>
</ul>
<p>Want to dive deeper? Read the dedicated posts: <a class="" href="https://dcm.dev/blog/2025/02/11/announcing-dcm-dashboards/">Announcing DCM Dashboards (Closed Beta)</a> and <a class="" href="https://dcm.dev/blog/2025/04/23/announcing-general-availability-dcm-dashboards/">DCM Dashboards GA</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-rules">2. Rules<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#2-rules" class="hash-link" aria-label="Direct link to 2. Rules" title="Direct link to 2. Rules" translate="no">​</a></h2>
<p>This year we added <strong>93 new rules</strong> and improved <strong>50+ existing rules</strong> with better accuracy and new cases. Here's the breakdown by category:</p>
<table><thead><tr><th>Category</th><th>New Rules</th></tr></thead><tbody><tr><td>Common</td><td>67</td></tr><tr><td>Flutter</td><td>12</td></tr><tr><td>Riverpod</td><td>7</td></tr><tr><td>Pub</td><td>6</td></tr><tr><td>Provider</td><td>2</td></tr><tr><td>Equatable</td><td>1</td></tr><tr><td>Easy Localization</td><td>1</td></tr></tbody></table>
<p>In addition to new rules, we shipped <strong>206 individual improvements</strong> in which <strong>54 new fixes</strong>, 32 bundled with the new rules and <strong>22 added to existing rules</strong> and also improved <strong>146 unique rules</strong> with better accuracy, fewer false positives and support for new cases.</p>
<p>Among these rules, we also brought to you a support to latest Dart and Flutter features.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dot-shorthands-rules-1330">Dot Shorthands Rules (1.33.0)<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#dot-shorthands-rules-1330" class="hash-link" aria-label="Direct link to Dot Shorthands Rules (1.33.0)" title="Direct link to Dot Shorthands Rules (1.33.0)" translate="no">​</a></h3>
<p>One of our rule updates was <strong>comprehensive Dot Shorthands support</strong>, which was released right after Dart 3.10 Dot Shorthands feature release in Nov 2025.</p>
<p>We added <strong>5 dedicated rules</strong>:</p>
<ul>
<li class=""><a href="https://dcm.dev/docs/rules/common/prefer-returning-shorthands/" target="_blank" rel="noopener noreferrer" class="">prefer-returning-shorthands</a></li>
<li class=""><a href="https://dcm.dev/docs/rules/common/prefer-shorthands-with-static-fields/" target="_blank" rel="noopener noreferrer" class="">prefer-shorthands-with-static-fields</a></li>
<li class=""><a href="https://dcm.dev/docs/rules/common/prefer-shorthands-with-enums/" target="_blank" rel="noopener noreferrer" class="">prefer-shorthands-with-enums</a></li>
<li class=""><a href="https://dcm.dev/docs/rules/common/avoid-nested-shorthands/" target="_blank" rel="noopener noreferrer" class="">avoid-nested-shorthands</a></li>
<li class=""><a href="https://dcm.dev/docs/rules/common/prefer-shorthands-with-constructors/" target="_blank" rel="noopener noreferrer" class="">prefer-shorthands-with-constructors</a></li>
</ul>
<p>Plus, we updated <strong>50+ existing rules</strong> to properly handle dot shorthands, from <code>arguments-ordering</code> to <code>prefer-specifying-future-value-type</code>.</p>
<p>In addition to these rules we also have published a comprehensive blog post <a href="https://dcm.dev/blog/2025/11/17/deeper-look-darts-dot-shorthand-hidden-complexity/" target="_blank" rel="noopener noreferrer" class="">A Deeper Look at Dart's Dot Shorthands (and Their Hidden Complexity For Your Flutter Projects)
</a></p>
<p><a href="https://dcm.dev/blog/2025/11/17/deeper-look-darts-dot-shorthand-hidden-complexity/" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" src="https://dcm.dev/assets/images/2025-11-17-cover-682a30385a7fbffa4432b0ddc53c7160.jpg" alt="Dot Shorthands" class="img_ev3q"></a></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="rule-tags--discovery">Rule Tags &amp; Discovery<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#rule-tags--discovery" class="hash-link" aria-label="Direct link to Rule Tags &amp; Discovery" title="Direct link to Rule Tags &amp; Discovery" translate="no">​</a></h3>
<p>In 1.26.0, we introduced new <a href="https://dcm.dev/docs/rules/" target="_blank" rel="noopener noreferrer" class="">rule tags</a> to help you discover relevant rules faster:</p>
<ul>
<li class=""><code>collections</code>, <code>async</code>, <code>conditions</code>, <code>control-flow</code>, <code>testing</code>, <code>naming</code>, <code>nullability</code>, <code>error-handling</code>, <code>abstractions</code>, and more</li>
</ul>
<p><img decoding="async" loading="lazy" alt="New Tags" src="https://dcm.dev/assets/images/new-tags-preview-bd78abe605352e5369d1cf8a6b6208a9.png" width="1686" height="1752" class="img_ev3q"></p>
<p>All rule tags are also available as <strong>built-in presets</strong> (1.27.0):</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">analysis_options.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">extends</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> async</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> collections</span><br></span></code></pre></div></div>
<p>Read more about this feature in our <a class="" href="https://dcm.dev/blog/2025/02/19/whats-new-in-dcm-1-27-0/#new-built-in-presets">1.27.0 release blog post</a></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="free--starter-plans-expansion">Free &amp; Starter Plans Expansion<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#free--starter-plans-expansion" class="hash-link" aria-label="Direct link to Free &amp; Starter Plans Expansion" title="Direct link to Free &amp; Starter Plans Expansion" translate="no">​</a></h3>
<p>We significantly expanded access to rules throughout the year:</p>
<ul>
<li class=""><a href="https://dcm.dev/docs/rules/?plan=free" target="_blank" rel="noopener noreferrer" class=""><strong>Free plan</strong></a>: +43 additional rules which makes a total of 100 rules for Free plan.</li>
<li class=""><a href="https://dcm.dev/docs/rules/?plan=starter" target="_blank" rel="noopener noreferrer" class=""><strong>Starter plan</strong></a>: +53 additional rules + dot shorthand rules which makes a total of 243 rules for Starter plan.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-memory-optimization-4gb--350mb">3. Memory Optimization: 4GB → 350MB<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#3-memory-optimization-4gb--350mb" class="hash-link" aria-label="Direct link to 3. Memory Optimization: 4GB → 350MB" title="Direct link to 3. Memory Optimization: 4GB → 350MB" translate="no">​</a></h2>
<p>In <strong>1.31.0</strong>, we shipped one of our most impactful performance improvements ever, <strong>dramatically reducing memory consumption</strong> for code quality commands.</p>
<p>Our measurements on the <a href="https://github.com/flame-engine/flame" target="_blank" rel="noopener noreferrer" class="">Flame repository</a> showed a reduction from <strong>~4GB to ~350MB</strong> when running from the repo root, a <strong>91% improvement</strong>!</p>
<img src="https://dcm.dev/blog/2025-08-18/memory-flame-light.webp" alt="Memory Consumption Charts (Flame Repository)" class="themedComponent_mlkZ themedComponent--light_NVdE" width="2689" height="862" style="margin-bottom:20px;height:auto"><img src="https://dcm.dev/blog/2025-08-18/memory-flame-dark.webp" alt="Memory Consumption Charts (Flame Repository)" class="themedComponent_mlkZ themedComponent--dark_xIcU" width="2689" height="862" style="margin-bottom:20px;height:auto">
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="optimized-commands">Optimized Commands<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#optimized-commands" class="hash-link" aria-label="Direct link to Optimized Commands" title="Direct link to Optimized Commands" translate="no">​</a></h3>
<p>In addition to general optimization, we also optimized quality checks commands:</p>
<ul>
<li class=""><code>dcm check-unused-code</code></li>
<li class=""><code>dcm check-unused-files</code></li>
<li class=""><code>dcm check-exports-completeness</code></li>
<li class=""><code>dcm check-code-duplication</code></li>
<li class=""><code>dcm check-unused-l10n</code></li>
<li class=""><code>dcm analyze-widgets</code> (1.32.0)</li>
<li class=""><code>dcm check-parameters</code> (1.32.0)</li>
</ul>
<p>This optimization affects both individual commands and <code>dcm run</code>, making DCM viable for even the largest monorepos.</p>
<p>To learn more (including the original benchmark context and details), see the <a class="" href="https://dcm.dev/blog/2025/08/18/whats-new-in-dcm-1-31-0/#memory-usage-improvements">1.31.0 release notes: Memory Usage Improvements</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="--all-flag"><code>--all</code> Flag<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#--all-flag" class="hash-link" aria-label="Direct link to --all-flag" title="Direct link to --all-flag" translate="no">​</a></h3>
<p>Run all DCM commands at once became possible with <code>--all</code> flag as of 1.28.0 release:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token builtin class-name" style="color:#7fdbca">dcm</span><span class="token plain"> run --all </span><span class="token function" style="color:#87aff4">lib</span><br></span></code></pre></div></div>
<p>In addition to <code>--all</code>, there are several new flags:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">Usage: dcm run [arguments] &lt;directories&gt;</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    --all                                          Run all dcm commands.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    --analyze                                      Run dcm analyze.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    --metrics                                      Run dcm calculate-metrics.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    --analyze-widgets                              Run dcm analyze-widgets.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    --analyze-assets                               Run dcm analyze-assets.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    --code-duplication                             Run dcm check-code-duplication.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    --unused-code                                  Run dcm check-unused-code.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    --unused-files                                 Run dcm check-unused-files.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    --unused-l10n                                  Run dcm check-unused-l10n.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    --dependencies                                 Run dcm check-dependencies.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    --parameters                                   Run dcm check-parameters.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    --exports-completeness                         Run dcm check-exports-completeness.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Upload:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    --upload                                       Upload the output to DCM Dashboards.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    --preview-upload                               Preview the uploaded result.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    --project                                      The project key.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    --upload-date="year-month-day"                 Override upload date to any previous date (for example, 2025-01-30).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    --with-details                                 Include detailed reports into the uploaded result.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-metrics-improvement">4. Metrics Improvement<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#4-metrics-improvement" class="hash-link" aria-label="Direct link to 4. Metrics Improvement" title="Direct link to 4. Metrics Improvement" translate="no">​</a></h2>
<p>Metrics received significant attention this year with new commands, better reports, and powerful configuration options.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-command-dcm-init-metrics-preview-1300">New Command: <code>dcm init metrics-preview</code> (1.30.0)<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#new-command-dcm-init-metrics-preview-1300" class="hash-link" aria-label="Direct link to new-command-dcm-init-metrics-preview-1300" title="Direct link to new-command-dcm-init-metrics-preview-1300" translate="no">​</a></h3>
<p>Similar to <code>dcm init lints-preview</code>, we added a new command to preview metric values across your codebase before enabling them:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">dcm init metrics-preview lib</span><br></span></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="Metrics Preview Output (Console)" src="https://dcm.dev/assets/images/metrics-preview-console-1cb10018b6892f021f5bd49ade2be637.webp" width="3150" height="1500" class="img_ev3q"></p>
<p>This command supports:</p>
<ul>
<li class="">JSON and CSV export (1.31.0)</li>
<li class="">Filter by metric types</li>
<li class="">Show only violations or all metrics</li>
</ul>
<p>To learn more, see the <a class="" href="https://dcm.dev/blog/2025/07/08/whats-new-in-dcm-1-30-0/#new-command-for-previewing-metric-values">1.30.0 release notes: New Command for Previewing Metric Values</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="line-level-attribution-1340">Line-Level Attribution (1.34.0)<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#line-level-attribution-1340" class="hash-link" aria-label="Direct link to Line-Level Attribution (1.34.0)" title="Direct link to Line-Level Attribution (1.34.0)" translate="no">​</a></h3>
<p>One of the most requested features, the HTML report now shows <strong>which lines contribute to a particular metric</strong>:</p>
<blockquote>
<p>"HTML report now shows which lines contribute to a particular metric (can be toggled for each metric separately)"</p>
</blockquote>
<p>This transforms metrics from abstract numbers into actionable insights.</p>
<video width="100%" controls="" autoplay="" loop="" playsinline=""><source src="/video/lines.mp4"></video>
<p>To learn more, see the <a class="" href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#understanding-what-contributes-to-the-metric-value">1.34.0 release notes: Understanding What Contributes to the Metric Value</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="updated-metrics-1340">Updated Metrics (1.34.0)<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#updated-metrics-1340" class="hash-link" aria-label="Direct link to Updated Metrics (1.34.0)" title="Direct link to Updated Metrics (1.34.0)" translate="no">​</a></h3>
<p>In addition to line-level attribution, 1.34.0 brought full Dart feature support (including dot shorthands), improved HTML report UX, and accuracy fixes and calculate improvements across 9 individual metrics including <code>number-of-used-widgets</code>, <code>widgets-nesting-level</code>, <code>number-of-overridden-methods</code>, <code>number-of-parameters</code>, <code>maximum-nesting-level</code>, <code>number-of-added-methods</code>, <code>number-of-external-imports</code>, <code>number-of-implemented-interfaces</code>, <code>cyclomatic-complexity</code> and <code>coupling-between-object-classes</code>.</p>
<p>To learn more, see the <a class="" href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#metric-improvements">1.34.0 release notes: Metric Improvements</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="multi-threshold-configuration-1320">Multi-Threshold Configuration (1.32.0)<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#multi-threshold-configuration-1320" class="hash-link" aria-label="Direct link to Multi-Threshold Configuration (1.32.0)" title="Direct link to Multi-Threshold Configuration (1.32.0)" translate="no">​</a></h3>
<p>Each metric now supports configuring <strong>multiple thresholds for different paths</strong>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">analysis_options.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">metrics</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">cyclomatic-complexity</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule" style="color:#6dbdfa">threshold</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">20</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule" style="color:#6dbdfa">entries</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">threshold</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">10</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token key atrule" style="color:#6dbdfa">paths</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">'.*some_folder.*'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">'.*some_file.dart'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">threshold</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">15</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token key atrule" style="color:#6dbdfa">paths</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">'.*another_folder'</span><br></span></code></pre></div></div>
<p>For the example above, all files and folders that match <code>.*some_folder.*</code> or <code>.*some_file.dart</code> will have the cyclomatic complexity threshold equal to <code>10</code>, the ones that match <code>.*another_folder</code> will have it equal to <code>15</code>, and for all other files the threshold will be <code>20</code>.</p>
<p>Plus, we added the <code>unset</code> threshold option for collecting values without violations.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">analysis_options.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">metrics</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">cyclomatic-complexity</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule" style="color:#6dbdfa">threshold</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">20</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule" style="color:#6dbdfa">entries</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">threshold</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">10</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token key atrule" style="color:#6dbdfa">paths</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">'.*some_folder.*'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">'.*some_file.dart'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">threshold</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> unset</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token key atrule" style="color:#6dbdfa">paths</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">'.*another_folder'</span><br></span></code></pre></div></div>
<p>To learn more, see the <a class="" href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/#multiple-threshold">1.32.0 release notes: Multiple Threshold</a> and <a class="" href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/#unset-threshold">"unset" Threshold</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="reworked-console-reporter-1270">Reworked Console Reporter (1.27.0)<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#reworked-console-reporter-1270" class="hash-link" aria-label="Direct link to Reworked Console Reporter (1.27.0)" title="Direct link to Reworked Console Reporter (1.27.0)" translate="no">​</a></h3>
<p>The metrics console reporter was completely redesigned to show each violation separately with its threshold:</p>
<p><img decoding="async" loading="lazy" alt="Metrics output report in console" src="https://dcm.dev/assets/images/metrics-console-report-faa42880e61908393d13b18a57c0a5cc.webp" width="2100" height="1358" class="img_ev3q"></p>
<p>This makes it much easier to understand why a particular file was flagged and what threshold was applied.</p>
<p>To learn more, see the <a class="" href="https://dcm.dev/blog/2025/02/19/whats-new-in-dcm-1-27-0/#reworked-metrics-console-reporter">1.27.0 release notes: Reworked Metrics Console Reporter</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="html-report-improvements">HTML Report Improvements<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#html-report-improvements" class="hash-link" aria-label="Direct link to HTML Report Improvements" title="Direct link to HTML Report Improvements" translate="no">​</a></h3>
<p>The metrics HTML report also improved throughout the year, turning "numbers" into something you can act on:</p>
<ul>
<li class=""><strong>Link to open files in VS Code</strong> (1.32.0)</li>
<li class=""><strong>Thresholds displayed per folder/file</strong> (1.32.0)</li>
<li class=""><strong>Metric summary on all pages</strong> (1.32.0)</li>
<li class=""><strong>Tooltip with full metric names</strong> (1.34.0)</li>
<li class=""><strong>Support for latest Dart features including dot shorthands</strong> (1.34.0)</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Updated HTML Reporter" src="https://dcm.dev/assets/images/updated-html-reporter-eec1d37f7d3094bccc62bc79733fa848.webp" width="2790" height="1706" class="img_ev3q"></p>
<p>To learn more, see the <a class="" href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/#improved-html-reports">1.32.0 release notes: Improved HTML Reports</a> and the <a class="" href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#metric-improvements">1.34.0 release notes: Metric Improvements</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-mcp-server--tooling-integration">5. MCP Server &amp; Tooling Integration<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#5-mcp-server--tooling-integration" class="hash-link" aria-label="Direct link to 5. MCP Server &amp; Tooling Integration" title="Direct link to 5. MCP Server &amp; Tooling Integration" translate="no">​</a></h2>
<p>We introduced <strong>DCM MCP Server integration</strong> in 1.31.0 release for all clients that support MCP (Model Context Protocol):</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token builtin class-name" style="color:#7fdbca">dcm</span><span class="token plain"> start-mcp-server</span><br></span></code></pre></div></div>
<p>This enables IDE-agnostic tooling and opens up DCM to new integrations. We also added <code>--force-roots-fallback</code> for IDEs like Cursor that don't correctly update the list of roots.</p>
<img src="https://dcm.dev/blog/2025-08-25/mcp-flow-light.webp" alt="DCM MCP Server flow" class="themedComponent_mlkZ themedComponent--light_NVdE" width="2689" height="862" style="margin-bottom:20px;height:auto"><img src="https://dcm.dev/blog/2025-08-25/mcp-flow-dark.webp" alt="DCM MCP Server flow" class="themedComponent_mlkZ themedComponent--dark_xIcU" width="2689" height="862" style="margin-bottom:20px;height:auto">
<p>If you're building (or adopting) an agentic workflow for Dart/Flutter, see the deep dive on <a class="" href="https://dcm.dev/blog/2025/08/25/agentic-code-quality-dcm-mcp/">Let Your AI Assistant Tame Your Tech Debt (with Dart, Flutter and DCM MCP Servers)</a> and the full documentation for <a href="https://dcm.dev/docs/ide-integrations/mcp-server/" target="_blank" rel="noopener noreferrer" class="">DCM MCP Server</a>.</p>
<video width="100%" controls="" autoplay="" playsinline=""><source src="/video/09-custom-agent.mp4"></video>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ides-improvement">IDEs Improvement<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#ides-improvement" class="hash-link" aria-label="Direct link to IDEs Improvement" title="Direct link to IDEs Improvement" translate="no">​</a></h3>
<p>In <strong>1.26.0</strong>, we added configuration autocompletion for IntelliJ/Android Studio:</p>
<video width="100%" controls="" autoplay="" loop="" playsinline=""><source src="/video/intellij-completion.mp4"></video>
<p>VS Code already had this, and we also added <strong>metrics configuration autocompletion</strong> in 1.28.0.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cdci">CD/CI<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#cdci" class="hash-link" aria-label="Direct link to CD/CI" title="Direct link to CD/CI" translate="no">​</a></h3>
<p>DCM GitHub Actions now supports running <code>dcm run</code> with all DCM commands as of 1.26.0 release:</p>
<p>To learn more, see the <a class="" href="https://dcm.dev/blog/2025/01/09/whats-new-in-dcm-1-26-0/#support-for-dcm-run-in-github-actions">1.26.0 release notes: Support for "dcm run" in GitHub Actions</a>.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> Run DCM</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">uses</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> CQLabs/dcm</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">action@v2</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">with</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">github-token</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"> secrets.GITHUB_TOKEN </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">ci-key</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"> secrets.DCM_CI_KEY </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">email</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"> secrets.DCM_EMAIL </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">analyze</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#8dec95">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">analyze-assets</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#8dec95">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">check-unused-code</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#8dec95">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">folders</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> lib</span><br></span></code></pre></div></div>
<p>To learn more, see the <a class="" href="https://dcm.dev/blog/2025/04/15/whats-new-in-dcm-1-28-0/#run">1.28.0 release notes: Run</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-baseline-improvements">6. Baseline Improvements<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#6-baseline-improvements" class="hash-link" aria-label="Direct link to 6. Baseline Improvements" title="Direct link to 6. Baseline Improvements" translate="no">​</a></h2>
<p>Baseline received major upgrades throughout 2025, making gradual DCM adoption easier than ever.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="sensitivity-levels-1300">Sensitivity Levels (1.30.0)<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#sensitivity-levels-1300" class="hash-link" aria-label="Direct link to Sensitivity Levels (1.30.0)" title="Direct link to Sensitivity Levels (1.30.0)" translate="no">​</a></h3>
<p>Choose how strict your baseline matching should be:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token builtin class-name" style="color:#7fdbca">dcm</span><span class="token plain"> init baseline --type=exact </span><span class="token function" style="color:#87aff4">lib</span><span class="token plain">   </span><span class="token comment" style="color:#999999"># Match exact location</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token builtin class-name" style="color:#7fdbca">dcm</span><span class="token plain"> init baseline --type=line </span><span class="token function" style="color:#87aff4">lib</span><span class="token plain">    </span><span class="token comment" style="color:#999999"># Match by line number</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token builtin class-name" style="color:#7fdbca">dcm</span><span class="token plain"> init baseline --type=file </span><span class="token function" style="color:#87aff4">lib</span><span class="token plain">    </span><span class="token comment" style="color:#999999"># Match by file only</span><br></span></code></pre></div></div>
<p>To learn more, see the <a class="" href="https://dcm.dev/blog/2025/07/08/whats-new-in-dcm-1-30-0/#flag-to-configure-baseline-sensitivity">1.30.0 release notes: Flag to Configure Baseline Sensitivity</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="universal-command-support-1300">Universal Command Support (1.30.0)<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#universal-command-support-1300" class="hash-link" aria-label="Direct link to Universal Command Support (1.30.0)" title="Direct link to Universal Command Support (1.30.0)" translate="no">​</a></h3>
<p>Baseline now works with <strong>all</strong> code quality commands:</p>
<ul>
<li class=""><code>check-unused-code</code></li>
<li class=""><code>check-unused-files</code></li>
<li class=""><code>check-code-duplication</code></li>
<li class=""><code>check-unused-l10n</code></li>
<li class=""><code>check-dependencies</code></li>
<li class=""><code>analyze-assets</code></li>
<li class=""><code>check-exports-completeness</code></li>
<li class=""><code>check-parameters</code> (1.31.0)</li>
</ul>
<p>To learn more, see the <a class="" href="https://dcm.dev/blog/2025/07/08/whats-new-in-dcm-1-30-0/#support-for-additional-commands">1.30.0 release notes: Support for Additional Commands</a> and the <a class="" href="https://dcm.dev/blog/2025/08/18/whats-new-in-dcm-1-31-0/#baseline-support">1.31.0 release notes: Baseline Support</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="merge-mode-1340">Merge Mode (1.34.0)<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#merge-mode-1340" class="hash-link" aria-label="Direct link to Merge Mode (1.34.0)" title="Direct link to Merge Mode (1.34.0)" translate="no">​</a></h3>
<p>The new <code>--merge</code> flag allows updating only a section of the existing baseline:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token builtin class-name" style="color:#7fdbca">dcm</span><span class="token plain"> init baseline --merge --only-rules=avoid-unused-parameters </span><span class="token function" style="color:#87aff4">lib</span><br></span></code></pre></div></div>
<p>This adds issues from the specified rules to the "analyze" section while keeping other sections intact, perfect for incremental rule adoption.</p>
<p>To learn more, see the <a class="" href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#flag-to-update-only-a-particular-section">1.34.0 release notes: Flag to Update Only a Particular Section</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-other-improvements">7. Other Improvements<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#7-other-improvements" class="hash-link" aria-label="Direct link to 7. Other Improvements" title="Direct link to 7. Other Improvements" translate="no">​</a></h2>
<ul>
<li class=""><strong>Support for disabling ignore comments per rule</strong> (1.27.0) — <a class="" href="https://dcm.dev/blog/2025/02/19/whats-new-in-dcm-1-27-0/#support-for-disabling-ignore-comments-per-rule">release notes</a></li>
<li class=""><strong>Hint when <code>--update</code> is used with more commands than initial baseline</strong> (1.34.0) — <a class="" href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#new-hint-on-incorrect-update-usages">release notes</a></li>
<li class=""><strong>Windows line endings support</strong> (1.30.0) — <a class="" href="https://dcm.dev/blog/2025/07/08/whats-new-in-dcm-1-30-0/#windows-line-endings">release notes</a></li>
</ul>
<p><img decoding="async" loading="lazy" alt="Example hint when --update is used incorrectly" src="https://dcm.dev/assets/images/update-hint-10a9a4df69255b68a2ba9f6b65673deb.png" width="1554" height="428" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="documentation-improvements">Documentation Improvements<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#documentation-improvements" class="hash-link" aria-label="Direct link to Documentation Improvements" title="Direct link to Documentation Improvements" translate="no">​</a></h3>
<p>Last but not least, big improvements and updates to our documentation including:</p>
<ul>
<li class=""><strong>Completely reworked Getting Started section</strong> (1.33.0)</li>
<li class=""><strong>New badges for IDE and CLI fixes</strong> (1.32.0)</li>
<li class=""><strong>Last updated date on all documentation pages</strong> (1.26.0)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="8-whats-coming-in-2026">8. What's Coming in 2026<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#8-whats-coming-in-2026" class="hash-link" aria-label="Direct link to 8. What's Coming in 2026" title="Direct link to 8. What's Coming in 2026" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="security-oriented-rules-and-a-new-command">Security-oriented Rules and a New Command<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#security-oriented-rules-and-a-new-command" class="hash-link" aria-label="Direct link to Security-oriented Rules and a New Command" title="Direct link to Security-oriented Rules and a New Command" translate="no">​</a></h3>
<p>While the tool already has a lot of lint rules (almost 500!), the main focus of those rules is in detecting bugs and style issues which can be detected by other developers or tests (though with greater effort).</p>
<p>However, when it comes to security rules, most developers don't think about security at all and typically lack the necessary skills to quickly detect such issues. Therefore, in 2026, we plan to add a new type of rules that will help identify security issues.</p>
<p>On top of that, we will introduce a new command for detecting inline secrets in your code.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-command-for-building-a-complete-code-quality-report-of-your-codebase">New Command for Building a Complete Code Quality Report of Your Codebase<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#new-command-for-building-a-complete-code-quality-report-of-your-codebase" class="hash-link" aria-label="Direct link to New Command for Building a Complete Code Quality Report of Your Codebase" title="Direct link to New Command for Building a Complete Code Quality Report of Your Codebase" translate="no">​</a></h3>
<p>Although the tool contains a variety of commands and checks to identify code quality issues, it currently lacks the ability to generate a comprehensive report on the overall state of the codebase.</p>
<p>One of the upcoming commands will offer a way to generate such a report.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-metrics">New Metrics<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#new-metrics" class="hash-link" aria-label="Direct link to New Metrics" title="Direct link to New Metrics" translate="no">​</a></h3>
<p>We've put a lot of effort in improving metrics in the past releases and plan to add more useful metrics in 2026.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="improved-dashboards">Improved Dashboards<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#improved-dashboards" class="hash-link" aria-label="Direct link to Improved Dashboards" title="Direct link to Improved Dashboards" translate="no">​</a></h3>
<p>There are still a lot of feature we'd like to see in the Dashboards (for example, a way to view the quality of Flutter widget for each project, advisory on which rules are missing or can be automatically fixed, upload history with ability to switch between different uploads, self-hosting and more). Stay tuned for further announcements!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="performance-improvements">Performance Improvements<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#performance-improvements" class="hash-link" aria-label="Direct link to Performance Improvements" title="Direct link to Performance Improvements" translate="no">​</a></h3>
<p>Regarding performance, while we significantly improved the tool in 2025, there's still room for improvement, particularly in terms of IDE integration. We plan to address these issues in 2026.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="support-for-background-agents">Support for Background Agents<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#support-for-background-agents" class="hash-link" aria-label="Direct link to Support for Background Agents" title="Direct link to Support for Background Agents" translate="no">​</a></h3>
<p>While you can have a local agent that is running the tool's commands, there is currently no way for a remote background agent to run the tool. One of the upcoming releases will add support for such scenarios.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="thank-you">Thank You!<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#thank-you" class="hash-link" aria-label="Direct link to Thank You!" title="Direct link to Thank You!" translate="no">​</a></h2>
<p>2025 was an incredible year, and none of it would have been possible without our amazing community. Thank you for your feedback, bug reports, feature requests, and continued support.</p>
<p>Here's to an even better 2026! 🎉</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sharing-your-feedback">Sharing Your Feedback<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#sharing-your-feedback" class="hash-link" aria-label="Direct link to Sharing Your Feedback" title="Direct link to Sharing Your Feedback" translate="no">​</a></h2>
<p>If there is something you miss from DCM right now, want us to make something better, or have any general feedback, <a href="https://discord.gg/Vzjprgk4sb" target="_blank" rel="noopener noreferrer" class="">join our Discord server</a>! We'd love to hear from you.</p>
<p>And to stay updated on our latest releases and tips, subscribe to our <a href="https://www.youtube.com/@DCMAnalyzer" target="_blank" rel="noopener noreferrer" class="">YouTube Channel</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="all-2025-releases">All 2025 Releases<a href="https://dcm.dev/blog/2026/01/15/dcm-2025-year-in-review/#all-2025-releases" class="hash-link" aria-label="Direct link to All 2025 Releases" title="Direct link to All 2025 Releases" translate="no">​</a></h2>
<p>Here are links to all our 2025 release notes and the full changelog:</p>
<table><thead><tr><th>Version</th><th>Release Date</th><th>Blog Post</th></tr></thead><tbody><tr><td>1.34.0</td><td>December 11, 2025</td><td><a class="" href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/">What's new in DCM 1.34.0</a></td></tr><tr><td>1.33.0</td><td>November 17, 2025</td><td><a class="" href="https://dcm.dev/blog/2025/11/20/whats-new-in-dcm-1-33-0/">What's new in DCM 1.33.0</a></td></tr><tr><td>1.32.0</td><td>October 7, 2025</td><td><a class="" href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/">What's new in DCM 1.32.0</a></td></tr><tr><td>1.31.0</td><td>August 18, 2025</td><td><a class="" href="https://dcm.dev/blog/2025/08/18/whats-new-in-dcm-1-31-0/">What's new in DCM 1.31.0</a></td></tr><tr><td>1.30.0</td><td>July 7, 2025</td><td><a class="" href="https://dcm.dev/blog/2025/07/08/whats-new-in-dcm-1-30-0/">What's new in DCM 1.30.0</a></td></tr><tr><td>1.29.0</td><td>May 30, 2025</td><td>-</td></tr><tr><td>1.28.0</td><td>April 15, 2025</td><td><a class="" href="https://dcm.dev/blog/2025/04/15/whats-new-in-dcm-1-28-0/">What's new in DCM 1.28.0</a></td></tr><tr><td>1.27.0</td><td>February 17, 2025</td><td><a class="" href="https://dcm.dev/blog/2025/02/19/whats-new-in-dcm-1-27-0/">What's new in DCM 1.27.0</a></td></tr><tr><td>1.26.0</td><td>January 8, 2025</td><td><a class="" href="https://dcm.dev/blog/2025/01/09/whats-new-in-dcm-1-26-0/">What's new in DCM 1.26.0</a></td></tr></tbody></table>
<p>📋 <strong>Full Changelog</strong>: <a href="https://dcm.dev/changelog/" target="_blank" rel="noopener noreferrer" class="">dcm.dev/changelog</a></p>
<p>🗺️ <strong>Public Roadmap</strong>: <a href="https://dcm.featurebase.app/roadmap" target="_blank" rel="noopener noreferrer" class="">dcm.featurebase.app/roadmap</a></p>]]></content>
        <author>
            <name>Dmitry Zhifarsky</name>
            <uri>https://dcm.dev</uri>
        </author>
        <author>
            <name>Majid Hajian</name>
            <uri>https://dcm.dev</uri>
        </author>
        <category label="product-update" term="product-update"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Flutter Conferences & Community Highlights 2025]]></title>
        <id>https://dcm.dev/blog/2025/12/26/flutter-2025-conferences-and-community-highlights/</id>
        <link href="https://dcm.dev/blog/2025/12/26/flutter-2025-conferences-and-community-highlights/"/>
        <updated>2025-12-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[A recap of Flutter conferences in 2025, highlighting presentations and key technical insights from across the globe.]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="Cover" src="https://dcm.dev/assets/images/2025-12-26-cover-b37fff396ec287ad39aa70c2b4e393ac.jpg" width="1050" height="561" class="img_ev3q"></p>
<p>I love attending Flutter events. As someone deeply involved in the Flutter and DCM community, I take every opportunity to connect with fellow developers at conferences around the world.</p>
<p>We, at DCM team, decided to write our recap of the Flutter conferences that defined 2025. Even though we have not attended all of these events in person, still worth to mention them and add all of our highlights from those that we have attended personally.</p>
<p>Let's get started!</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="flutter-heroes-turin-italy-march-12-2025">Flutter Heroes, Turin, Italy, March 12, 2025<a href="https://dcm.dev/blog/2025/12/26/flutter-2025-conferences-and-community-highlights/#flutter-heroes-turin-italy-march-12-2025" class="hash-link" aria-label="Direct link to Flutter Heroes, Turin, Italy, March 12, 2025" title="Direct link to Flutter Heroes, Turin, Italy, March 12, 2025" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Flutter Heroes 2025" src="https://dcm.dev/assets/images/flutter-heroes-3d00e31efe73559e1ab99de7c909c0d4.webp" width="4877" height="1218" class="img_ev3q"></p>
<p>Flutter Heroes is an annual event held in Turin, Italy. The choice of a cinema created a theater-like atmosphere with a big screen, ensuring that code snippets were readable and talks had real impact. This single-track event covered dependency management strategies, Firebase GenKit workflows for local AI testing, and architectural defensive coding patterns.</p>
<ul>
<li class="">Area: UCI Cinema, Turin Lingotto</li>
<li class="">Link: <a href="https://flutterheroes.com/2025/" target="_blank" rel="noopener noreferrer" class="">Flutter Heroes Event</a></li>
<li class="">Social Media: <a href="https://twitter.com/flutterheroes" target="_blank" rel="noopener noreferrer" class="">@FlutterHeroes on X</a></li>
<li class="">Recordings: <a href="https://www.youtube.com/playlist?list=PLNhLS5SCDDFTBP8aJR9hAHFOxpyikZqoV" target="_blank" rel="noopener noreferrer" class="">Videos of 2025 talks</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="recommended-talks">Recommended Talks<a href="https://dcm.dev/blog/2025/12/26/flutter-2025-conferences-and-community-highlights/#recommended-talks" class="hash-link" aria-label="Direct link to Recommended Talks" title="Direct link to Recommended Talks" translate="no">​</a></h3>
<p>Among all great talks, two stood out, huge shout out to the speakers for both sessions.</p>
<p><strong>Flutter GenAI revolution is here — no internet, no limits</strong> (Sasha Denisov)</p>
<p>Sasha Denisov shows how Gemma runs fully on-device or in-browser, no cloud bills, no privacy tradeoffs. He walks through fine-tuning, hosting options, Gemma 2/3 updates, and practical use cases for CodeGemma/PaliGemma. Perfect if you want GenAI in Flutter without servers.</p>
<div style="max-width:800px;aspect-ratio:16 / 9;border-radius:10px;overflow:hidden;margin-bottom:30px;width:100%;height:auto"></div>
<p><strong>Own your app code: throw dependencies out of the ring</strong> (Vadym Pinchuk)</p>
<p>Vadym Pinchuk walks through pushing fragile packages to the edges with ports-and-adapters, better package selection, and fakes. Great primer on avoiding the dependency trap, keeping tests stable, and owning your architecture.</p>
<div style="max-width:800px;aspect-ratio:16 / 9;border-radius:10px;overflow:hidden;margin-bottom:30px;width:100%;height:auto"></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="flutter-connection-paris-france-april-34-2025">Flutter Connection, Paris, France, April 3–4, 2025<a href="https://dcm.dev/blog/2025/12/26/flutter-2025-conferences-and-community-highlights/#flutter-connection-paris-france-april-34-2025" class="hash-link" aria-label="Direct link to Flutter Connection, Paris, France, April 3–4, 2025" title="Direct link to Flutter Connection, Paris, France, April 3–4, 2025" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Flutter Connection 2025" src="https://dcm.dev/assets/images/flutter-connection-2025-f067900c539206a1e44893bf085475f0.webp" width="1030" height="358" class="img_ev3q"></p>
<p>Flutter Connection is the French conference entirely dedicated to Flutter developers. What makes it unique is its strict filtering rule: <strong>no marketing talks, no beginner content</strong>. Pure technical depth.</p>
<p>With 250 advanced developers and 20+ talks, topics leaned into internals like memory leak detection, terminal UI rendering using Flutter, and advanced scrolling behavior with Slivers.</p>
<ul>
<li class="">Area: Pan Piper, 2-4 Impasse Lamier, Paris</li>
<li class="">Link: <a href="https://flutterconnection.io/" target="_blank" rel="noopener noreferrer" class="">Flutter Connection Event</a></li>
<li class="">Social Media: <a href="https://twitter.com/Flutter_Connect" target="_blank" rel="noopener noreferrer" class="">@Flutter_Connect on X</a></li>
<li class="">Videos: <a href="https://async.techconnection.io/flutter-connection/" target="_blank" rel="noopener noreferrer" class="">Recordings</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="recommended-talks-1">Recommended Talks<a href="https://dcm.dev/blog/2025/12/26/flutter-2025-conferences-and-community-highlights/#recommended-talks-1" class="hash-link" aria-label="Direct link to Recommended Talks" title="Direct link to Recommended Talks" translate="no">​</a></h3>
<p>There were so many great talks in this conference, but I personally recommend you to watch these two from great speakers.</p>
<p><strong>Flutter-inspired Terminal UIs</strong> (Alois Deniel)</p>
<p>a Flutter-style framework for Terminal UIs, reuse your Flutter mental model to build rich TUIs without the usual hacks. Great walkthrough of layout, interaction, and the state of terminal tooling in Dart.</p>
<div style="max-width:800px;aspect-ratio:16 / 9;border-radius:10px;overflow:hidden;margin-bottom:30px;width:100%;height:auto"></div>
<p><strong>Listening to Users: Feedback and A/B Testing in Flutter</strong> (Alicja Ogonowska)</p>
<p>Why watch: concrete patterns for in-app feedback prompts plus A/B testing flows—how to design prompts, run experiments, interpret results, and turn signals into product decisions.</p>
<div style="max-width:800px;aspect-ratio:16 / 9;border-radius:10px;overflow:hidden;margin-bottom:30px;width:100%;height:auto"></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dcm-at-flutter-connection">DCM at Flutter Connection<a href="https://dcm.dev/blog/2025/12/26/flutter-2025-conferences-and-community-highlights/#dcm-at-flutter-connection" class="hash-link" aria-label="Direct link to DCM at Flutter Connection" title="Direct link to DCM at Flutter Connection" translate="no">​</a></h3>
<p>Our Developer Advocate, <strong>Majid Hajian</strong>, was present at Flutter Connection and delivered a talk on <a href="https://www.youtube.com/watch?v=5q6jR94pxhE&amp;t=11s" target="_blank" rel="noopener noreferrer" class=""><strong>"Let's Talk About Memory Leaks In Dart And Flutter"</strong></a>.</p>
<div style="max-width:800px;aspect-ratio:16 / 9;border-radius:10px;overflow:hidden;margin-bottom:30px;width:100%;height:auto"></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="flutteristas-conference-online-april-5-2025">Flutteristas Conference, Online, April 5, 2025<a href="https://dcm.dev/blog/2025/12/26/flutter-2025-conferences-and-community-highlights/#flutteristas-conference-online-april-5-2025" class="hash-link" aria-label="Direct link to Flutteristas Conference, Online, April 5, 2025" title="Direct link to Flutteristas Conference, Online, April 5, 2025" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Flutteristas Conference 2025" src="https://dcm.dev/assets/images/flutteristas-6cec5ea6726a422b7529c32d9167a847.webp" width="1280" height="390" class="img_ev3q"></p>
<p>A 12-hour online conference celebrating the Flutteristas community (women and non-binary folks in Flutter). Talks covered animations, internationalization, accessibility, and practical topics like API key management. Inclusive, global, and highly practical.</p>
<ul>
<li class="">Link: <a href="https://flutteristas.org/" target="_blank" rel="noopener noreferrer" class="">Flutteristas Conference</a></li>
<li class="">Social Media: <a href="https://twitter.com/Flutteristas" target="_blank" rel="noopener noreferrer" class="">@Flutteristas on X</a></li>
<li class="">Videos: <a href="https://www.youtube.com/watch?v=ftTXXAx8AxM" target="_blank" rel="noopener noreferrer" class="">Recordings</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dcm-at-flutteristas-conference">DCM at Flutteristas Conference<a href="https://dcm.dev/blog/2025/12/26/flutter-2025-conferences-and-community-highlights/#dcm-at-flutteristas-conference" class="hash-link" aria-label="Direct link to DCM at Flutteristas Conference" title="Direct link to DCM at Flutteristas Conference" translate="no">​</a></h3>
<p>DCM and <strong>Majid Hajian</strong> were proud to support the production of this inclusive event, helping bring together voices from the Flutteristas community for a full day of technical content and collaboration.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="flutter-ninjas-tokyo-japan-may-2930-2025">Flutter Ninjas, Tokyo, Japan, May 29–30, 2025<a href="https://dcm.dev/blog/2025/12/26/flutter-2025-conferences-and-community-highlights/#flutter-ninjas-tokyo-japan-may-2930-2025" class="hash-link" aria-label="Direct link to Flutter Ninjas, Tokyo, Japan, May 29–30, 2025" title="Direct link to Flutter Ninjas, Tokyo, Japan, May 29–30, 2025" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Flutter Ninjas 2025" src="https://dcm.dev/assets/images/flutterninjas-4deabeaa4708690f1dec6a677390114b.webp" width="1140" height="380" class="img_ev3q"></p>
<p>FlutterNinjas is the Flutter conference for English speakers in Tokyo, Japan. Japan has a massive Flutter community, but language barriers often isolate it from global discourse.</p>
<p>This event solved that with a fully English-speaking format, highlighting Japan's technical strengths in pixel-perfect UI, advanced text rendering for Japanese typographic systems, and GPU-level optimization.</p>
<p>This event became the bridge between Japanese engineering excellence and the global ecosystem.</p>
<ul>
<li class="">Area: Docomo R&amp;D Open Lab, Odaiba, Tokyo</li>
<li class="">Link: <a href="https://flutterninjas.dev/" target="_blank" rel="noopener noreferrer" class="">Flutter Ninjas Event</a></li>
<li class="">Social Media: <a href="https://twitter.com/FlutterNinjas" target="_blank" rel="noopener noreferrer" class="">@FlutterNinjas on X</a></li>
<li class="">Videos: <a href="https://www.youtube.com/hashtag/flutterninjas2025" target="_blank" rel="noopener noreferrer" class="">Recordings</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dcm-at-flutter-ninjas">DCM at Flutter Ninjas<a href="https://dcm.dev/blog/2025/12/26/flutter-2025-conferences-and-community-highlights/#dcm-at-flutter-ninjas" class="hash-link" aria-label="Direct link to DCM at Flutter Ninjas" title="Direct link to DCM at Flutter Ninjas" translate="no">​</a></h3>
<p>DCM was proud to be a <strong>Silver Sponsor</strong> of Flutter Ninjas 2025, supporting one of the most technically focused Flutter events in Asia.</p>
<p><img decoding="async" loading="lazy" alt="FlutterNinjas Group photo" src="https://dcm.dev/assets/images/flutterninja-group-9a6c3767541b5f42d887f383bf14a798.webp" width="1191" height="366" class="img_ev3q"></p>
<p>Our Developer Advocate, <strong>Majid Hajian</strong>, was present at the conference and delivered a talk on <a href="https://www.youtube.com/watch?v=UJDR4OfjiaY&amp;t" target="_blank" rel="noopener noreferrer" class=""><strong>"Let's Talk About Memory Leaks in Dart and Flutter"</strong></a>. The session explored practical strategies for detecting, analyzing, and preventing memory leaks in production Flutter applications, a critical topic for enterprise-scale development.</p>
<p>We were also excited to see <strong>Csongor Vogel</strong> from <strong>Talabat</strong>, one of our valued customers, present <a href="https://www.youtube.com/watch?v=xqMfyShtEig&amp;t=17s" target="_blank" rel="noopener noreferrer" class=""><strong>"KonMari your Flutter code using DCM"</strong></a>. Inspired by Marie Kondo's KonMari Method, Csongor demonstrated how to organize and maintain Flutter codebases using DCM by eliminating unnecessary code, optimizing widgets, managing assets, and addressing code smells. His talk showcased real-world applications of DCM's capabilities in cleaning up technical debt and maintaining code quality at scale.</p>
<p><a href="https://speakerdeck.com/gerfalcon/konmari-your-flutter-code-using-dcm" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" alt="Watch Talabat DCM Talk" src="https://dcm.dev/assets/images/talabatdcm-6b95f8d5bcd73c0393634975bb748b10.webp" width="2328" height="1264" class="img_ev3q"></a></p>
<div style="max-width:800px;aspect-ratio:16 / 9;border-radius:10px;overflow:hidden;margin-bottom:30px;width:100%;height:auto"></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="one-more-talk">One More Talk<a href="https://dcm.dev/blog/2025/12/26/flutter-2025-conferences-and-community-highlights/#one-more-talk" class="hash-link" aria-label="Direct link to One More Talk" title="Direct link to One More Talk" translate="no">​</a></h3>
<p>I also recommend you to watch Remi's talk, he pointed out important points that worth watch:</p>
<p>Remi Rousselet is well-known Flutter and Dart Expert and author of packages such as Riverpod and Provider.</p>
<div style="max-width:800px;aspect-ratio:16 / 9;border-radius:10px;overflow:hidden;margin-bottom:30px;width:100%;height:auto"></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="fluttercon-usa-nyc-usa-june-2526-2025">FlutterCon USA, NYC, USA, June 25–26, 2025<a href="https://dcm.dev/blog/2025/12/26/flutter-2025-conferences-and-community-highlights/#fluttercon-usa-nyc-usa-june-2526-2025" class="hash-link" aria-label="Direct link to FlutterCon USA, NYC, USA, June 25–26, 2025" title="Direct link to FlutterCon USA, NYC, USA, June 25–26, 2025" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="FlutterCon USA 2025" src="https://dcm.dev/assets/images/flutterconusa-c6328cc62187984f22fffdbaf5fc161b.webp" width="1274" height="294" class="img_ev3q"></p>
<p>FlutterCon USA brings Flutter developers from around the globe to New York City. The 2025 edition was defined by one concept: <strong>agentive apps</strong>. With 500+ attendees and 60+ talks, Andrew Brogdon's keynote "Agentive Experiences With Flutter" reframed what modern UI means, AI determines the next UI state and Flutter renders it.</p>
<p>The Flutter AI Toolkit was announced as a provider-agnostic wrapper around OpenAI, Gemini, and other LLMs. Firebase + RAG patterns for intelligent support bots also featured prominently.</p>
<p>Additional event: During FlutterCon USA in the same area, there is another tech conference, <a href="https://nyc.droidcon.com/" target="_blank" rel="noopener noreferrer" class="">Droidcon NYC</a>.</p>
<ul>
<li class="">Link: <a href="https://flutterconusa.dev/" target="_blank" rel="noopener noreferrer" class="">FlutterCon USA Event</a></li>
<li class="">Social Media: <a href="https://twitter.com/FlutterconWorld" target="_blank" rel="noopener noreferrer" class="">@FlutterconWorld on X</a></li>
<li class="">Videos: <a href="https://www.droidcon.com/content/?filter_postyear=2025&amp;filter_post_event_tag=fluttercon-usa" target="_blank" rel="noopener noreferrer" class="">Recordings</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="recommended-talks-2">Recommended Talks<a href="https://dcm.dev/blog/2025/12/26/flutter-2025-conferences-and-community-highlights/#recommended-talks-2" class="hash-link" aria-label="Direct link to Recommended Talks" title="Direct link to Recommended Talks" translate="no">​</a></h3>
<p>There were so many great talks in this conference, I could not watch them all but the ones that I could watch and liked are as follow:</p>
<ul>
<li class=""><a href="https://www.droidcon.com/2025/07/31/flutter-the-last-ui-framework/" target="_blank" rel="noopener noreferrer" class="">Flutter: The Last UI Framework</a> — Chris Sells on where Flutter is heading and why it keeps expanding beyond mobile.</li>
<li class=""><a href="https://www.droidcon.com/2025/07/27/more-flutter-and-dart-and-ai-oh-my/" target="_blank" rel="noopener noreferrer" class="">More Flutter and Dart and AI, Oh My!</a> — Chris Sells explores fast-moving AI changes and how they intersect with Flutter and Dart.</li>
<li class=""><a href="https://www.droidcon.com/2025/07/24/when-maps-think-geotriggers-spatial-awareness-with-arcgis-maps-sdk-for-flutter/" target="_blank" rel="noopener noreferrer" class="">When Maps Think: Geotriggers &amp; Spatial Awareness with ArcGIS Maps SDK for Flutter</a> — Martino Yovo shows how to build location-aware experiences with geotriggers.</li>
<li class=""><a href="https://www.droidcon.com/2025/07/24/writing-better-tests-with-less-work/" target="_blank" rel="noopener noreferrer" class="">Writing Better Tests with Less Work</a> — Greg Price on making tests effective without slowing delivery.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="flutter--friends-stockholm-sweden-august-31--september-2-2025">Flutter &amp; Friends, Stockholm, Sweden, August 31 – September 2, 2025<a href="https://dcm.dev/blog/2025/12/26/flutter-2025-conferences-and-community-highlights/#flutter--friends-stockholm-sweden-august-31--september-2-2025" class="hash-link" aria-label="Direct link to Flutter &amp; Friends, Stockholm, Sweden, August 31 – September 2, 2025" title="Direct link to Flutter &amp; Friends, Stockholm, Sweden, August 31 – September 2, 2025" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Flutter &amp;amp; Friends 2025" src="https://dcm.dev/assets/images/flutterfriends-b1968ae8fbb3fffe560969d3b5405740.webp" width="2576" height="656" class="img_ev3q"></p>
<p>Flutter &amp; Friends is a conference for the community by the community. It became known as one of the most fun Flutter conferences due to the many social activities pre-conference including bike tours, museum visits, and the famous "Dinner With Strangers" that pairs developers who've never met.</p>
<p>Technical highlights included the flame_3d launch by Luan Nico, shader post-processing demos, and enterprise efficiency patterns for standardizing components across dozens of production apps.</p>
<ul>
<li class="">Area: Kulturhuset Stadsteatern, Sergels Torg Norrmalm, Stockholm</li>
<li class="">Link: <a href="https://www.flutterfriends.dev/" target="_blank" rel="noopener noreferrer" class="">Flutter &amp; Friends Event</a></li>
<li class="">Social Media: <a href="https://twitter.com/FlutterNFriends" target="_blank" rel="noopener noreferrer" class="">@FlutterNFriends on X</a></li>
<li class="">Videos: <a href="https://www.youtube.com/@FlutterNFriends/streams" target="_blank" rel="noopener noreferrer" class="">Streams</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="recommended-talks-3">Recommended Talks<a href="https://dcm.dev/blog/2025/12/26/flutter-2025-conferences-and-community-highlights/#recommended-talks-3" class="hash-link" aria-label="Direct link to Recommended Talks" title="Direct link to Recommended Talks" translate="no">​</a></h3>
<p>A list of great topics from this conference which I could not watch them all, but I strongly recommend you Filip and Slava talks which are super interesting and and expert level.</p>
<ul>
<li class=""><a href="https://www.youtube.com/watch?v=Z9jPRD5JcEM&amp;t=675s" target="_blank" rel="noopener noreferrer" class="">The Boring Keynote</a> — Filip Hracek kicks things off with a playful, idea-packed keynote.</li>
<li class=""><a href="https://www.youtube.com/watch?v=Z9jPRD5JcEM&amp;t=2940s" target="_blank" rel="noopener noreferrer" class="">What is an Isolate anyway?</a> — Slava Egorov demystifies isolates and why they matter for performance.</li>
<li class=""><a href="https://www.youtube.com/watch?v=Z9jPRD5JcEM&amp;t=11782s" target="_blank" rel="noopener noreferrer" class="">State management is hard. Here's why.</a> — Remi Rousselet on the real trade-offs behind state solutions.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="flutterconf-latam-quito-ecuador-september-17-2025">FlutterConf LATAM, Quito, Ecuador, September 17, 2025<a href="https://dcm.dev/blog/2025/12/26/flutter-2025-conferences-and-community-highlights/#flutterconf-latam-quito-ecuador-september-17-2025" class="hash-link" aria-label="Direct link to FlutterConf LATAM, Quito, Ecuador, September 17, 2025" title="Direct link to FlutterConf LATAM, Quito, Ecuador, September 17, 2025" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="FlutterConf LATAM 2025" src="https://dcm.dev/assets/images/flutterlatam-aacbb8a59b205066dfd8ee780aea5f74.webp" width="820" height="312" class="img_ev3q"></p>
<p>FlutterConf LATAM brought together 250 attendees from 6+ countries in a multi-language format (Spanish/English).</p>
<p>I personally attended FlutterLATAM2024 and I have to admit that Flutter Latam is one of the best and warmest events you can ever attend.</p>
<p><strong>2026 Announcement:</strong> The next edition moves to Cancún, Mexico, signaling continental ambitions to bridge LATAM and North American ecosystems. Will DCM present at the upcoming event? you guess!</p>
<ul>
<li class="">Link: <a href="https://flutterconflatam.dev/" target="_blank" rel="noopener noreferrer" class="">FlutterConf LATAM Event</a></li>
<li class="">Social Media: <a href="https://twitter.com/FlutterConfLAT" target="_blank" rel="noopener noreferrer" class="">@FlutterConfLAT on X</a></li>
<li class="">Videos: <a href="https://www.youtube.com/@FlutterConfLatam/streams" target="_blank" rel="noopener noreferrer" class="">Streams</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="fluttercon-europe-berlin-germany-september-2426-2025">FlutterCon Europe, Berlin, Germany, September 24–26, 2025<a href="https://dcm.dev/blog/2025/12/26/flutter-2025-conferences-and-community-highlights/#fluttercon-europe-berlin-germany-september-2426-2025" class="hash-link" aria-label="Direct link to FlutterCon Europe, Berlin, Germany, September 24–26, 2025" title="Direct link to FlutterCon Europe, Berlin, Germany, September 24–26, 2025" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="FlutterCon Europe 2025" src="https://dcm.dev/assets/images/flutterberlin-d4022750025c979d1534a6732bb21382.webp" width="761" height="400" class="img_ev3q"></p>
<p>FlutterCon Europe is the biggest Flutter conference. If there's only one Flutter conference you want to attend, this is definitely a good choice. With over 1,000 attendees and 60+ talks across 8 tracks, Berlin is where the global Flutter community aligns its compass. The "hallway track", informal conversations between sessions, sets the tone for how the ecosystem thinks about problems.</p>
<ul>
<li class="">Area: CityCube Berlin, Messedamm 26, Berlin</li>
<li class="">Link: <a href="https://fluttercon.dev/" target="_blank" rel="noopener noreferrer" class="">FlutterCon Event</a></li>
<li class="">Social Media: <a href="https://twitter.com/FlutterconWorld" target="_blank" rel="noopener noreferrer" class="">@FlutterconWorld on X</a></li>
<li class="">Videos: <a href="https://www.youtube.com/playlist?list=PL9Pfzam3fFdd9B9H_VO90jyJ0OZKXHaGk" target="_blank" rel="noopener noreferrer" class="">Recordings</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dcm-at-fluttercon-europe">DCM at FlutterCon Europe<a href="https://dcm.dev/blog/2025/12/26/flutter-2025-conferences-and-community-highlights/#dcm-at-fluttercon-europe" class="hash-link" aria-label="Direct link to DCM at FlutterCon Europe" title="Direct link to DCM at FlutterCon Europe" translate="no">​</a></h3>
<p>DCM was proud to sponsor the <strong>lanyards</strong> at FlutterCon Europe 2025, ensuring every attendee carried a piece of DCM throughout the event.</p>
<p>Our Developer Advocate, <strong>Majid Hajian</strong>, delivered two technical talks at the conference:</p>
<ol>
<li class="">
<p><a href="https://www.youtube.com/watch?v=pLSJMPpgPts&amp;list=PL9Pfzam3fFdd9B9H_VO90jyJ0OZKXHaGk&amp;index=63" target="_blank" rel="noopener noreferrer" class=""><strong>"8 More Flutter Widgets You're Probably Not Using (But Should Be)"</strong></a> - A deep dive into underutilized Flutter widgets that can significantly improve your app's functionality and user experience. Read the accompanying article: <a href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/" target="_blank" rel="noopener noreferrer" class="">8 More Flutter Widgets You're Probably Not Using (But Should Be)</a>.</p>
<div style="max-width:800px;aspect-ratio:16 / 9;border-radius:10px;overflow:hidden;margin-bottom:30px;width:100%;height:auto"></div>
</li>
<li class="">
<p><a href="https://www.youtube.com/watch?v=Vca0NipZWdA&amp;list=PL9Pfzam3fFdd9B9H_VO90jyJ0OZKXHaGk&amp;index=3" target="_blank" rel="noopener noreferrer" class=""><strong>"Let's Talk About Memory Leaks in Dart and Flutter"</strong></a> - Exploring practical strategies for detecting, analyzing, and preventing memory leaks in production Flutter applications.</p>
</li>
</ol>
<p>We were also thrilled to see <strong>Casey Rogers</strong> from <strong>Betterment</strong>, one of our valued customers, present <a href="https://www.youtube.com/watch?v=UUxTFv3qzvM&amp;list=PL9Pfzam3fFdd9B9H_VO90jyJ0OZKXHaGk&amp;index=41" target="_blank" rel="noopener noreferrer" class=""><strong>"Accelerating the Dev Loop with DCM Lints at Betterment"</strong></a>.</p>
<p><a href="https://x.com/caseycrogers" target="_blank" rel="noopener noreferrer" class="">Casey</a> demonstrated how <a href="https://www.betterment.com/" target="_blank" rel="noopener noreferrer" class="">Betterment</a> leverages DCM's built-in and custom lints to move bugs earlier into the development loop, specifically to the IDE layer where errors are caught through static analysis and lint warnings. By shifting error detection left, Betterment achieved:</p>
<ul>
<li class=""><strong>Faster shipping</strong> with reduced development cycles</li>
<li class=""><strong>Higher quality</strong> code with fewer production issues</li>
<li class=""><strong>Less reliance</strong> on manual testing and QA processes</li>
</ul>
<p>The talk explored how errors caught at different stages of the development loop impact developer productivity. The further into the loop an error gets, from IDE warnings to runtime errors, tests, code review, QA, and finally production, the more developer time is wasted and the slower feature velocity becomes.</p>
<p><a href="https://x.com/caseycrogers" target="_blank" rel="noopener noreferrer" class="">Casey</a> presented several case studies showing how DCM lints help catch errors at the earliest possible stage, directly improving business outcomes by preventing user-facing issues.</p>
<div style="max-width:800px;aspect-ratio:16 / 9;border-radius:10px;overflow:hidden;margin-bottom:30px;width:100%;height:auto"></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="recommended-talks-4">Recommended Talks<a href="https://dcm.dev/blog/2025/12/26/flutter-2025-conferences-and-community-highlights/#recommended-talks-4" class="hash-link" aria-label="Direct link to Recommended Talks" title="Direct link to Recommended Talks" translate="no">​</a></h3>
<p>With over 60 talks across 8 tracks, picking just the top talks is tough. However, I recommend you to least watch the keynotes:</p>
<div style="max-width:800px;aspect-ratio:16 / 9;border-radius:10px;overflow:hidden;margin-bottom:30px;width:100%;height:auto"></div>
<div style="max-width:800px;aspect-ratio:16 / 9;border-radius:10px;overflow:hidden;margin-bottom:30px;width:100%;height:auto"></div>
<p>And live code by Simon Lightfoot who built a Custom Widgets. This is great to see how far you can go with Flutter.</p>
<div style="max-width:800px;aspect-ratio:16 / 9;border-radius:10px;overflow:hidden;margin-bottom:30px;width:100%;height:auto"></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="flutterbytes-conference-lagos-nigeria-october-31--november-1-2025">FlutterBytes Conference, Lagos, Nigeria, October 31 – November 1, 2025<a href="https://dcm.dev/blog/2025/12/26/flutter-2025-conferences-and-community-highlights/#flutterbytes-conference-lagos-nigeria-october-31--november-1-2025" class="hash-link" aria-label="Direct link to FlutterBytes Conference, Lagos, Nigeria, October 31 – November 1, 2025" title="Direct link to FlutterBytes Conference, Lagos, Nigeria, October 31 – November 1, 2025" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="FlutterBytes 2025" src="https://dcm.dev/assets/images/flutterbytes-431b253615de90e1cfc471a06b9c70a5.webp" width="2630" height="792" class="img_ev3q"></p>
<p>FlutterBytes Conference is Africa's largest Flutter event, bringing together developers, enthusiasts, and industry leaders. With 1,000+ attendees, Lagos brought scale, energy, and authentic community.</p>
<ul>
<li class="">Link: <a href="https://www.flutterbytesconf.com/" target="_blank" rel="noopener noreferrer" class="">FlutterBytes Conference</a></li>
<li class="">Social Media: <a href="https://twitter.com/FlutterBytesNG" target="_blank" rel="noopener noreferrer" class="">@FlutterBytesNG on X</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="fluttercon-kenya-nairobi-kenya-november-57-2025">FlutterCon Kenya, Nairobi, Kenya, November 5–7, 2025<a href="https://dcm.dev/blog/2025/12/26/flutter-2025-conferences-and-community-highlights/#fluttercon-kenya-nairobi-kenya-november-57-2025" class="hash-link" aria-label="Direct link to FlutterCon Kenya, Nairobi, Kenya, November 5–7, 2025" title="Direct link to FlutterCon Kenya, Nairobi, Kenya, November 5–7, 2025" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="FlutterCon Kenya 2025" src="https://dcm.dev/assets/images/flutterkenya-5fe7a97ad8e11ec2e089d44fcefb03c4.webp" width="1500" height="500" class="img_ev3q"></p>
<p>The first official FlutterCon in Africa with 50+ speakers and 37+ sessions co-located with Droidcon Kenya, organizers exposed native Android developers to Flutter's value while leveraging existing infrastructure.</p>
<p>This conference showed that Flutter's problems are not universal—they're context-dependent.</p>
<ul>
<li class="">Link: <a href="https://flutterconkenya.com/" target="_blank" rel="noopener noreferrer" class="">FlutterCon Kenya</a></li>
<li class="">Co-located Event: Droidcon Kenya</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="flutter-conf-india-bengaluru-india-december-14-2025">Flutter Conf India, Bengaluru, India, December 14, 2025<a href="https://dcm.dev/blog/2025/12/26/flutter-2025-conferences-and-community-highlights/#flutter-conf-india-bengaluru-india-december-14-2025" class="hash-link" aria-label="Direct link to Flutter Conf India, Bengaluru, India, December 14, 2025" title="Direct link to Flutter Conf India, Bengaluru, India, December 14, 2025" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Flutter Conf India 2025" src="https://dcm.dev/assets/images/flutterconfindia-ab9d425886f777243c03b615164f71b1.webp" width="2561" height="1281" class="img_ev3q"></p>
<p>India remains the volume engine of Flutter development, hosting the largest concentration of Flutter developers globally. The 2025 edition focused on enterprise scale: managing codebases with millions of lines of code, coordinating teams of 50–200 developers, and architectural patterns for distributed, large-scale delivery.</p>
<ul>
<li class="">Link: <a href="https://flutterconfindia.com/" target="_blank" rel="noopener noreferrer" class="">Flutter Conf India</a></li>
<li class="">Location: Bengaluru, India</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="summing-up">Summing Up<a href="https://dcm.dev/blog/2025/12/26/flutter-2025-conferences-and-community-highlights/#summing-up" class="hash-link" aria-label="Direct link to Summing Up" title="Direct link to Summing Up" translate="no">​</a></h2>
<p>2025 was a remarkable year for Flutter conferences. These gatherings are not just about learning; they're great for boosting skills, making connections, and staying ahead of the curve in Flutter development.</p>
<p>We hope to see many of you at these conferences in 2026.</p>
<p>Subscribe to our newsletter, we'll announce the 2026 conferences and keep the list updated as dates are confirmed.</p>
<div class="formWrapper_FeQU"><p class="formTitle_o9oT">Enjoying this article?</p><p>Subscribe to get our latest articles and product updates by email.</p><form class="footerForm_u4Zn"><input class="trialInput_rT6u" type="email" placeholder="Email address" name="blogEmail"><button type="submit" class="button button--primary button--sm formButton_cuTv">Subscribe</button></form></div>]]></content>
        <author>
            <name>Majid Hajian</name>
            <uri>https://dcm.dev</uri>
        </author>
        <category label="blog" term="blog"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Best Flutter Features in 2025]]></title>
        <id>https://dcm.dev/blog/2025/12/23/top-flutter-features-2025/</id>
        <link href="https://dcm.dev/blog/2025/12/23/top-flutter-features-2025/"/>
        <updated>2025-12-23T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Explore the top Flutter features released in 2025. From the elimination of shader jank with Impeller and the arrival of stateful hot reload on the web to new widget previews and AI integrations, discover what's new and how these additions can improve your Flutter development workflow.]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="Cover" src="https://dcm.dev/assets/images/2025-12-23-cover-f98162bd0d5ba136db0999403f2f1fcc.jpg" width="1050" height="561" class="img_ev3q"></p>
<p>2025 was a big year for Flutter. Between February and November, the team shipped four stable releases (3.29 through 3.38), and each one brought meaningful improvements to how we build apps.</p>
<p>These weren't just minor updates. The team tackled real problems: shader jank on mobile, slow web development cycles, widget preview workflows, and AI coding assistance.</p>
<p>In this article, I'll walk you through the features that actually mattered in 2025. Some are stable and ready to use. Others are experimental but worth watching.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-year-of-polish-and-performance-for-flutter-2025">A Year of Polish and Performance for Flutter 2025<a href="https://dcm.dev/blog/2025/12/23/top-flutter-features-2025/#a-year-of-polish-and-performance-for-flutter-2025" class="hash-link" aria-label="Direct link to A Year of Polish and Performance for Flutter 2025" title="Direct link to A Year of Polish and Performance for Flutter 2025" translate="no">​</a></h2>
<p>Before diving into the major features, it's worth noting that 2025 wasn't just about big changes. Every release brought meaningful refinements across <code>Cupertino</code>, <code>Material</code>, performance, and developer tools.</p>
<p>Huge kudos to the Flutter team who shipped <strong>825 commits in 3.38 alone</strong>, with hundreds more across 3.29, 3.32, and 3.35. I personally thanks the team and appreciate their great work!</p>
<p>Let's explore the highlights.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dot-shorthands-for-easier-to-read-flutter-code">Dot Shorthands for Easier-to-read Flutter Code<a href="https://dcm.dev/blog/2025/12/23/top-flutter-features-2025/#dot-shorthands-for-easier-to-read-flutter-code" class="hash-link" aria-label="Direct link to Dot Shorthands for Easier-to-read Flutter Code" title="Direct link to Dot Shorthands for Easier-to-read Flutter Code" translate="no">​</a></h2>
<p>If you've built Flutter UIs, you know the repetitive pain: typing <code>MainAxisAlignment.center</code>, <code>CrossAxisAlignment.end</code>, <code>Colors.blue</code>, <code>EdgeInsets.all(8)</code> over and over. Across a whole codebase, this becomes visual noise that makes widget trees harder to scan.</p>
<p><a href="https://blog.flutter.dev/whats-new-in-flutter-3-38-3f7b258f7228" target="_blank" rel="noopener noreferrer" class="">Dart 3.10 (bundled with Flutter 3.38)</a> introduced dot shorthands, a syntax feature that lets you write <code>.center</code> instead of <code>MainAxisAlignment.center</code> whenever Dart can infer the type from context.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// Before: Verbose type repetition</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Column</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  mainAxisAlignment</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MainAxisAlignment</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">center</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Container</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      padding</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">EdgeInsets</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">8</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">blue</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// After: Clean and concise with dot shorthands</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Column</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  mainAxisAlignment</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">center</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Container</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      padding</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">8</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">blue</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>Dart uses the expected type from context to resolve what <code>.something</code> refers to. Variable declarations, function parameters, and return types all provide this context.</p>
<blockquote>
<p>No context means the shorthand fails, Dart doesn't guess.</p>
</blockquote>
<p>Dot shorthands shine in specific scenarios:</p>
<ul>
<li class=""><strong>Enums</strong>: <code>case .warning:</code> instead of <code>case LogLevel.warning:</code></li>
<li class=""><strong>Widget parameters</strong>: <code>mainAxisAlignment: .center</code>, <code>alignment: .bottomCenter</code></li>
<li class=""><strong>Static constants</strong>: <code>Duration timeout = .zero;</code> instead of <code>Duration.zero</code></li>
<li class=""><strong>Constructors</strong>: <code>EdgeInsets padding = .all(8);</code> instead of <code>EdgeInsets.all(8)</code></li>
</ul>
<p>These use cases make widget trees significantly easier to read.</p>
<p><strong>Why It's Also Not Good (Hidden Complexity):</strong></p>
<p>While powerful, dot shorthands introduce real challenges:</p>
<ol>
<li class="">
<p><strong>Nested shorthands are unreadable:</strong> Code like <code>.new(.new(version: .new('val')))</code> becomes a puzzle. You lose all visual type anchors, making debugging and code reviews extremely difficult.</p>
</li>
<li class="">
<p><strong>Team disagreements emerge:</strong> Some developers love the conciseness, others argue it hides too much information. Junior developers may struggle to infer missing types without IDE support.</p>
</li>
<li class="">
<p><strong>Context dependency:</strong> Shorthands only work when types are explicit. Using <code>var</code> instead of explicit types breaks the feature entirely.</p>
</li>
<li class="">
<p><strong>Inconsistent adoption:</strong> Without guidelines, codebases become a mix of old and new syntax, creating cognitive overhead when reading code.</p>
</li>
</ol>
<p><strong>What We Can Do to Make Fewer Mistakes:</strong></p>
<p>The solution isn't to avoid shorthands, it's to enforce consistent, safe usage patterns. This is where automated lint rules become essential. Without enforcement, teams waste time in code reviews debating style choices instead of reviewing logic.</p>
<blockquote>
<p>For a comprehensive exploration of dot shorthand edge cases, compiler behavior, tricky scenarios, and detailed configuration examples, read our <a href="https://dcm.dev/blog/2025/11/17/deeper-look-darts-dot-shorthand-hidden-complexity/" target="_blank" rel="noopener noreferrer" class="">deep dive on Dart's dot shorthands and their hidden complexity</a>.</p>
</blockquote>
<p><a href="https://dcm.dev/blog/2025/11/17/deeper-look-darts-dot-shorthand-hidden-complexity/" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" src="https://dcm.dev/assets/images/2025-11-17-cover-682a30385a7fbffa4432b0ddc53c7160.jpg" alt="A Deeper Look at Dart's Dot Shorthands (and Their Hidden Complexity For Your Flutter Projects)" class="img_ev3q"></a></p>
<p>DCM provides specific rules to prevent common pitfalls and maintain consistency:</p>
<ul>
<li class=""><strong><a href="https://dcm.dev/docs/rules/common/avoid-nested-shorthands" target="_blank" rel="noopener noreferrer" class="">avoid-nested-shorthands</a></strong>: Flags deeply nested shorthands like <code>.new(.new(.new()))</code> that hurt comprehension. Forces you to keep outer calls as shorthands while inner calls remain explicit and readable.</li>
<li class=""><strong><a href="https://dcm.dev/docs/rules/common/prefer-shorthands-with-enums" target="_blank" rel="noopener noreferrer" class="">prefer-shorthands-with-enums</a></strong>: Ensures everyone on the team writes <code>case .warning:</code> instead of mixing <code>case LogLevel.warning:</code> and <code>.warning</code> randomly throughout the codebase.</li>
<li class=""><strong><a href="https://dcm.dev/docs/rules/common/prefer-shorthands-with-constructors" target="_blank" rel="noopener noreferrer" class="">prefer-shorthands-with-constructors</a></strong>: Suggests shorthands for constructor calls when types are explicit. Configure it to match your preferences (e.g., only apply to <code>EdgeInsets</code>, <code>BorderRadius</code>, <code>Border</code>).</li>
<li class=""><strong><a href="https://dcm.dev/docs/rules/common/prefer-shorthands-with-static-fields" target="_blank" rel="noopener noreferrer" class="">prefer-shorthands-with-static-fields</a></strong>: Enforces consistent usage for static fields like <code>Duration.zero</code> → <code>.zero</code> across your entire project.</li>
<li class=""><strong><a href="https://dcm.dev/docs/rules/common/prefer-returning-shorthands" target="_blank" rel="noopener noreferrer" class="">prefer-returning-shorthands</a></strong>: Ensures return statements use shorthands when return types are explicit: <code>Color getColor() =&gt; .red;</code></li>
</ul>
<p>Most rules come with quick fixes and CLI support, meaning you can automatically apply best practices across your entire codebase in seconds. This eliminates style debates, speeds up code reviews, and makes onboarding new developers smoother, they see one consistent pattern instead of a mix of styles.</p>
<p><a href="https://dcm.dev/docs/cli/formatting/fix/" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" src="https://i3.ytimg.com/vi/zn-_45yntzQ/maxresdefault.jpg" alt="DCM Fix" class="img_ev3q"></a></p>
<div class="wrapper_plzk"><p>DCM is a code quality tool that helps your team move faster by reducing the time spent on code reviews, finding tricky bugs, identifying complex code, and unifying code style.</p><div class="heroButtons_DVKJ"><a class="button button--primary button--md" href="https://dcm.dev/pricing/">Start for Free</a><a class="button button--secondary button--md demo-button" href="https://dcm.dev/demo/"><svg width="12" height="17" viewBox="0 0 12 17" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M11.4742 7.67501C12.054 8.0722 12.054 8.92781 11.4742 9.32499L1.60147 16.0881C0.937832 16.5427 0.0363247 16.0675 0.0363247 15.2631L0.0363253 1.73691C0.0363253 0.932494 0.937834 0.457306 1.60147 0.911917L11.4742 7.67501Z" fill="#000"></path></svg>Watch Demo</a></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="stateful-hot-reload-on-the-web">Stateful Hot Reload on the Web<a href="https://dcm.dev/blog/2025/12/23/top-flutter-features-2025/#stateful-hot-reload-on-the-web" class="hash-link" aria-label="Direct link to Stateful Hot Reload on the Web" title="Direct link to Stateful Hot Reload on the Web" translate="no">​</a></h2>
<p>Hot reload has been one of Flutter's superpowers on mobile and desktop for years. In 2025, it finally came to the web, a highly-requested feature that transforms the web development experience.</p>
<p>Flutter 3.32 introduced stateful hot reload for web as an experimental feature (requiring the <code>--web-experimental-hot-reload</code> flag).</p>
<p>This dramatically shortens the development feedback loop for web work. By <a href="https://blog.flutter.dev/whats-new-in-flutter-3-35-c58ef72e3766" target="_blank" rel="noopener noreferrer" class="">Flutter 3.35</a>, it became stable and <strong>enabled by default</strong>. No more flags needed; When hot reload is enabled, you can reload your application by pressing <code>r</code> in the running terminal, or <code>R</code> to hot restart.</p>
<p>Widget tree state survives hot reload, which means:</p>
<ul>
<li class="">Form input values remain intact</li>
<li class="">Scroll positions don't reset</li>
<li class="">Navigation stack is maintained</li>
<li class="">StatefulWidget data persists</li>
</ul>
<p>However, app-level state outside the widget tree (like global variables) can still be lost. This is why architecture matters:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// ✅ Good: State preserved during hot reload</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Counter</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatefulWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Counter</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">createState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_CounterState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_CounterState</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Counter</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> count </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// Hot reload preserves this</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Column</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Count: </span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">$</span><span class="token string-literal interpolation expression">count</span><span class="token string-literal string" style="color:#e1ffe4">'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token class-name" style="color:#7fdbca">ElevatedButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          onPressed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">setState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> count</span><span class="token operator" style="color:#00bff9">++</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Increment'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// ❌ Avoid: Global state gets reset on hot reload</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> globalCount </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// Lost on hot reload!</span><br></span></code></pre></div></div>
<p>To catch and prevent this pattern early, enable DCM’s <a href="https://dcm.dev/docs/rules/common/avoid-global-state/" target="_blank" rel="noopener noreferrer" class="">avoid-global-state</a> rule; it flags global state so hot reload doesn’t silently reset critical values.</p>
<p><a href="https://www.youtube.com/watch?v=-ok5BrI2OkM" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" src="https://i3.ytimg.com/vi/-ok5BrI2OkM/maxresdefault.jpg" alt="avoid-global-state" class="img_ev3q"></a></p>
<p>With this milestone, web development feels dramatically closer to the mobile/desktop workflow.</p>
<p>Oh, and did I mention DartPad? Even <a href="https://dartpad.dev/" target="_blank" rel="noopener noreferrer" class="">DartPad</a> got a web hot reload button now! 2025 truly spoiled Flutter web devs.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="webassembly-previews-preparing-for-wasm">WebAssembly Previews (Preparing for Wasm)<a href="https://dcm.dev/blog/2025/12/23/top-flutter-features-2025/#webassembly-previews-preparing-for-wasm" class="hash-link" aria-label="Direct link to WebAssembly Previews (Preparing for Wasm)" title="Direct link to WebAssembly Previews (Preparing for Wasm)" translate="no">​</a></h2>
<p>WebAssembly is coming to Flutter web as the default compilation target, and <a href="https://blog.flutter.dev/whats-new-in-flutter-3-35-c58ef72e3766" target="_blank" rel="noopener noreferrer" class="">Flutter 3.35</a> started preparing developers for this transition with Wasm dry-run builds. This feature can be toggled with the <code>--(no-)wasm-dry-run</code> flag.</p>
<p>Starting in <a href="https://blog.flutter.dev/whats-new-in-flutter-3-35-c58ef72e3766" target="_blank" rel="noopener noreferrer" class="">Flutter 3.35</a>, every JavaScript build also performs a trial WebAssembly compilation in parallel. If your app isn't Wasm-compatible, you'll see warnings during the build, giving you time to fix issues before Wasm becomes mandatory.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">flutter build web</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999"># Output includes:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999"># Building with sound null safety</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999"># Compiling lib/main.dart for the Web...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999"># [Wasm dry-run] Found 2 potential compatibility issues</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999"># Warning: Package 'dart:html' is not supported in Wasm</span><br></span></code></pre></div></div>
<p>WebAssembly delivers significant performance improvements over JavaScript:</p>
<ul>
<li class=""><strong>2-3x faster execution</strong> for compute-intensive operations</li>
<li class=""><strong>Smaller bundle sizes</strong> due to more efficient compilation</li>
<li class=""><strong>Better memory management</strong> with linear memory model</li>
<li class=""><strong>Near-native performance</strong> for graphics-heavy apps</li>
</ul>
<p>However, not all Dart/Flutter code is automatically Wasm-compatible. The most common issues:</p>
<ol>
<li class="">
<p><strong><code>dart:html</code> usage</strong>: Direct browser API access doesn't work in Wasm. Use <code>package:web</code> instead, which provides a unified API for both JS and Wasm targets.</p>
</li>
<li class="">
<p><strong>JS interop</strong>: Code using <code>@JS()</code> annotations or <code>dart:js_util</code> needs migration to <code>dart:js_interop</code> (the new unified FFI).</p>
</li>
<li class="">
<p><strong>Dynamic HTML manipulation</strong>: Direct DOM manipulation should be replaced with Flutter's widget-based approach or the new <code>package:web</code> APIs.</p>
</li>
</ol>
<p>But how do you prepare your app? Let's take a quick look. We will come with a comprehensive guide on this topic in 2026 on the DCM blog, so stay tuned!</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// ❌ Old: Won't work in Wasm</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'dart:html'</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">as</span><span class="token plain"> html</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">openLink</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  html</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">window</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">open</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'https://dcm.dev'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'_blank'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// ✅ New: Wasm-compatible</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:web/web.dart'</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">as</span><span class="token plain"> web</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">openLink</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  web</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">window</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">open</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'https://dcm.dev'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'_blank'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<blockquote>
<p>Dart's <code>package:web</code> exposes access to browser APIs, enabling interop between Dart applications and the web. Check out <a href="https://dart.dev/interop/js-interop/package-web" target="_blank" rel="noopener noreferrer" class="">Migrate to package<!-- -->:web</a></p>
</blockquote>
<p>For JS interop:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// ❌ Old: Legacy JS interop</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@JS</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">library</span><span class="token plain"> analytics</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:js/js.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@JS</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'gtag'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">external</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">gtag</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> event</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> action</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Object</span><span class="token plain"> params</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// ✅ New: Unified JS interop for Wasm</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'dart:js_interop'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@JS</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'gtag'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">external</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">gtag</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> event</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> action</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">JSAny</span><span class="token plain"> params</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>You can disable the Wasm compatibility check if needed:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">flutter build web --no-wasm-dry-run</span><br></span></code></pre></div></div>
<p>But I recommend keeping it enabled. Catching incompatibilities early, before Wasm becomes the default, saves you from emergency migrations later.</p>
<p>While Flutter hasn't announced an exact date for Wasm to become the default, the dry-run feature signals it's approaching. Starting your migration now means you'll be ready when the switch happens, and you might even opt into Wasm mode early to unlock those performance benefits.</p>
<blockquote>
<p>Look at the official doc page: <a href="https://docs.flutter.dev/platform-integration/web/wasm" target="_blank" rel="noopener noreferrer" class="">Flutter WASM</a>.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-material-3-and-cupertino-widgets">New Material 3 and Cupertino Widgets<a href="https://dcm.dev/blog/2025/12/23/top-flutter-features-2025/#new-material-3-and-cupertino-widgets" class="hash-link" aria-label="Direct link to New Material 3 and Cupertino Widgets" title="Direct link to New Material 3 and Cupertino Widgets" translate="no">​</a></h2>
<p>Flutter 2025 brought several practical widget additions across <code>Material</code> and <code>Cupertino</code> libraries, making common UI patterns simpler.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="material-3-additions">Material 3 Additions<a href="https://dcm.dev/blog/2025/12/23/top-flutter-features-2025/#material-3-additions" class="hash-link" aria-label="Direct link to Material 3 Additions" title="Direct link to Material 3 Additions" translate="no">​</a></h3>
<p><strong>DropdownMenuFormField</strong> (Flutter 3.35): Native form support for dropdowns. No more wrapping <code>DropdownButton</code> in custom <code>FormField</code> widgets.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">DropdownMenuFormField</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  initialValue</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'option1'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  dropdownMenuEntries</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">DropdownMenuEntry</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'option1'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> label</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Option 1'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">DropdownMenuEntry</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'option2'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> label</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Option 2'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  onChanged</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Selected: </span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">$</span><span class="token string-literal interpolation expression">value</span><span class="token string-literal string" style="color:#e1ffe4">'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  label</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Choose an option'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><br></span></code></pre></div></div>
<p><strong>SearchAnchor &amp; SearchBar</strong> (Flutter 3.32): Material 3 search components with built-in support for leading/trailing icons, callbacks, and suggestion handling. Replaces custom text field workarounds for search patterns.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">SearchAnchor</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  builder</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> controller</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SearchBar</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      controller</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> controller</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      hintText</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Search products...'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      leading</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Icon</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Icons</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">search</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      onTap</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> controller</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">openView</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      onChanged</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> controller</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">openView</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  suggestionsBuilder</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> controller</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> keyword </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> controller</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">text</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">ListTile</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">generate</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">5</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">index</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> item </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Result </span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">$</span><span class="token string-literal interpolation expression">index</span><span class="token string-literal string" style="color:#e1ffe4"> for "</span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">$</span><span class="token string-literal interpolation expression">keyword</span><span class="token string-literal string" style="color:#e1ffe4">"'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ListTile</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        title</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">item</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        onTap</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          controller</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">closeView</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">item</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token comment" style="color:#999999">// Handle selection</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><br></span></code></pre></div></div>
<p><img decoding="async" loading="lazy" src="https://miro.medium.com/v2/resize:fit:1280/0*H9mW79LCQEJBJ_i2" alt="SearchAnchor Demo" class="img_ev3q"></p>
<p><strong>SegmentedButton</strong> (Flutter 3.35): Material 3 segmented control for exclusive selection. Perfect for filtering, view switching, or multi-state toggles without radio buttons.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">enum</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ViewMode</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"> grid</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> list </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">SegmentedButton</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">ViewMode</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  segments</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">ButtonSegment</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      value</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ViewMode</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">grid</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      label</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Grid'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      icon</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Icon</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Icons</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">grid_view</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">ButtonSegment</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      value</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ViewMode</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">list</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      label</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'List'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      icon</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Icon</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Icons</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">view_list</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  selected</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain">_viewMode</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  onSelectionChanged</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">newSelection</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token function" style="color:#87aff4">setState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> _viewMode </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> newSelection</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><br></span></code></pre></div></div>
<p><strong>Badge</strong> (Flutter 3.32): Native badge widget for notifications, counts, or status indicators. Eliminates custom stacked containers for notification dots on navigation items.</p>
<p><strong>MenuAnchor &amp; MenuBar</strong> (Flutter 3.32): Desktop-first menu system supporting both context menus and application menus. RawMenuAnchor provides an unstyled foundation for custom menu designs.</p>
<p><strong>Carousel Improvements</strong> (Flutter 3.32): New <code>CarouselController</code> with <code>animateToIndex</code> method for smooth navigation in carousels with fixed or dynamic-sized items.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> _carouselController </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CarouselController</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">CarouselView</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  controller</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _carouselController</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  itemExtent</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">300</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">List</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">generate</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">10</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">index</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Card</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Center</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Item </span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">$</span><span class="token string-literal interpolation expression">index</span><span class="token string-literal string" style="color:#e1ffe4">'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// Navigate programmatically</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">ElevatedButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  onPressed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> _carouselController</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">animateToIndex</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token number" style="color:#8dec95">5</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    duration</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Duration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">milliseconds</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">500</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    curve</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Curves</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">easeInOut</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Jump to Item 5'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><br></span></code></pre></div></div>
<p><img decoding="async" loading="lazy" src="https://miro.medium.com/v2/resize:fit:1280/0*nT-5bpsRVyZELaTq" alt="Carousel Controller Demo" class="img_ev3q"></p>
<p><strong>Scrollable NavigationRail</strong> (Flutter 3.32): Handle apps with many sections gracefully. When destinations exceed vertical space, the rail becomes scrollable instead of overflowing.</p>
<p><strong>NavigationDrawer Header &amp; Footer</strong> (Flutter 3.35): Built-in slots for branding and persistent actions. Add user profiles at the top and logout buttons at the bottom without custom layouts.</p>
<p><strong>Slider &amp; TabBar Enhancements</strong> (Flutter 3.32 &amp; 3.38): Sliders now support always-visible value indicators and custom thumb hover states. TabBar gained onHover and onFocusChange callbacks for better state control.</p>
<p><strong>CalendarDatePicker Customization</strong> (Flutter 3.32): New <code>calendarDelegate</code> parameter enables integration of custom calendar systems beyond the Gregorian Calendar.</p>
<p><img decoding="async" loading="lazy" src="https://miro.medium.com/v2/resize:fit:1280/0*uqbdwtRR2oryyhJy" alt="CalendarDatePicker Custom Delegate" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cupertino-enhancements">Cupertino Enhancements<a href="https://dcm.dev/blog/2025/12/23/top-flutter-features-2025/#cupertino-enhancements" class="hash-link" aria-label="Direct link to Cupertino Enhancements" title="Direct link to Cupertino Enhancements" translate="no">​</a></h3>
<p><strong>CupertinoExpansionTile</strong>: iOS-style expandable list items. Built on the new <code>Expansible</code> core widget, matching Apple's design language.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">CupertinoListSection</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">CupertinoExpansionTile</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      title</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Expandable Section'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Item 1'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Item 2'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><br></span></code></pre></div></div>
<p><img decoding="async" loading="lazy" src="https://miro.medium.com/v2/resize:fit:1400/format:webp/1*Npm3gOKVmU1hMq4ujCPxCg.gif" alt="CupertinoExpansionTile" class="img_ev3q"></p>
<p><strong>Squircle Shapes</strong>: Flutter 3.32 introduced Apple's rounded superellipse shape for <code>CupertinoAlertDialog</code> and <code>CupertinoActionSheet</code>. By 3.35, more Cupertino widgets adopted this pixel-perfect iOS aesthetic.</p>
<p><img decoding="async" loading="lazy" src="https://miro.medium.com/v2/resize:fit:1308/format:webp/0*NIsvxkNdRcbgtLdk" alt="Squircle Shapes" class="img_ev3q"></p>
<p><strong>Haptic Feedback</strong>: Native-feeling vibrations added to pickers and sliders, matching iOS interaction patterns.</p>
<p>These widgets reduce dependency on third-party packages and custom implementations.</p>
<p>Flutter's built-in components now cover more real-world UI patterns out of the box.</p>
<blockquote>
<p>There are other improvements with other widgets that I did not mention to keep the blog short!</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="decoupling-the-material--cupertino-libraries">Decoupling the Material &amp; Cupertino Libraries<a href="https://dcm.dev/blog/2025/12/23/top-flutter-features-2025/#decoupling-the-material--cupertino-libraries" class="hash-link" aria-label="Direct link to Decoupling the Material &amp; Cupertino Libraries" title="Direct link to Decoupling the Material &amp; Cupertino Libraries" translate="no">​</a></h2>
<p>One of 2025's most significant architectural decisions: Flutter announced plans to <a href="https://medium.com/flutter/whats-new-in-flutter-3-38-3f7b258f7228" target="_blank" rel="noopener noreferrer" class="">decouple Material and Cupertino libraries</a> from the core framework.</p>
<blockquote>
<p>First hinted at throughout the year in <a href="https://docs.google.com/document/d/189AbzVGpxhQczTcdfJd13o_EL36t-M5jOEt1hgBIh7w/edit?tab=t.0" target="_blank" rel="noopener noreferrer" class="">design documents</a>, this was formally announced in the <a href="https://blog.flutter.dev/whats-new-in-flutter-3-35-c58ef72e3766" target="_blank" rel="noopener noreferrer" class="">Flutter 3.35 release</a>. Also, you can join the <a href="https://github.com/flutter/flutter/issues/101479" target="_blank" rel="noopener noreferrer" class="">Github Discussion on this topic</a>.</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-changing">What's Changing?<a href="https://dcm.dev/blog/2025/12/23/top-flutter-features-2025/#whats-changing" class="hash-link" aria-label="Direct link to What's Changing?" title="Direct link to What's Changing?" translate="no">​</a></h3>
<p>Material and Cupertino will become separate first-party packages, versioned and released independently from Flutter's core framework. The core widgets library stays lightweight and design-agnostic.</p>
<p><strong>Progress in 2025:</strong></p>
<ul>
<li class="">
<p><strong>New foundation widgets</strong>: <a href="https://api.flutter.dev/flutter/widgets/Expansible-class.html" target="_blank" rel="noopener noreferrer" class=""><code>Expansible</code></a> (As mentioned above) serves as the base for both <code>ExpansionTile</code> and <code>CupertinoExpansionTile</code>. Similarly, <a href="https://api.flutter.dev/flutter/widgets/RawMenuAnchor-class.html" target="_blank" rel="noopener noreferrer" class=""><code>RawMenuAnchor</code></a> provides design-agnostic menu functionality.</p>
</li>
<li class="">
<p><strong>Cross-library reuse</strong>: <code>CupertinoExpansionTile</code> (As mentioned above) uses the same <code>Expansible</code> core as Material, proving the decoupling strategy works.</p>
</li>
<li class="">
<p><strong>Release strategy</strong>: The team published <a href="https://docs.google.com/document/d/1y38TN9AUTyd0eTbu4kx4FiNgfsLDPvWvi92Fv5HWFjQ/edit?tab=t.0#heading=h.pub7jnop54q0" target="_blank" rel="noopener noreferrer" class="">design docs on Color theming</a> and adopted a batch release strategy, allowing Material/Cupertino to update faster than Flutter's quarterly releases.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-it-matters">Why It Matters<a href="https://dcm.dev/blog/2025/12/23/top-flutter-features-2025/#why-it-matters" class="hash-link" aria-label="Direct link to Why It Matters" title="Direct link to Why It Matters" translate="no">​</a></h3>
<ul>
<li class="">
<p><strong>Faster innovation</strong>: Material Design updates won't wait for Flutter SDK releases.</p>
</li>
<li class="">
<p><strong>Leaner apps</strong>: Eventually, exclude unused design systems from your bundle.</p>
</li>
<li class="">
<p><strong>Ecosystem growth</strong>: Opens doors for alternative design libraries (Fluent, custom systems) alongside Material and Cupertino.</p>
<blockquote>
<p>For example, recently <a href="https://pub.dev/packages/sketchy_design_lang" target="_blank" rel="noopener noreferrer" class="">Sketchy Design Language for Flutter</a> was published by former <a href="https://sellsbrothers.com/" target="_blank" rel="noopener noreferrer" class="">Flutter Product Manager</a></p>
</blockquote>
<p><img decoding="async" loading="lazy" src="https://raw.githubusercontent.com/csells/sketchy_design_lang/refs/heads/main/readme/design-system.gif" alt="Sketchy" class="img_ev3q"></p>
</li>
<li class="">
<p><strong>No action needed</strong>: This is a gradual migration,everything works as before. But in a couple of years, <code>flutter create</code> might prompt you to choose which UI package to add. It's modularity by design.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="flutter-widget-previews">Flutter Widget Previews<a href="https://dcm.dev/blog/2025/12/23/top-flutter-features-2025/#flutter-widget-previews" class="hash-link" aria-label="Direct link to Flutter Widget Previews" title="Direct link to Flutter Widget Previews" translate="no">​</a></h2>
<p><a href="https://blog.flutter.dev/whats-new-in-flutter-3-35-c58ef72e3766" target="_blank" rel="noopener noreferrer" class="">Flutter 3.35</a> introduced Widget Previews, letting you visualize widgets in isolation without running a full app. If you've used SwiftUI previews or Jetpack Compose preview, you'll feel right at home.</p>
<p>Add the <code>@Preview</code> annotation to any widget or widget, returning function:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/widget_previews.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/material.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@Preview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Custom Button'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">previewButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ElevatedButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    onPressed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Click Me'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>Run the previewer:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">flutter widget-preview start</span><br></span></code></pre></div></div>
<p>This launches a live web UI showing your widget. Changes update instantly as you save.</p>
<p>By <a href="https://blog.flutter.dev/whats-new-in-flutter-3-38-3f7b258f7228" target="_blank" rel="noopener noreferrer" class="">Flutter 3.38</a>, VS Code and Android Studio auto-start the previewer in a dedicated tool window, you see renders side-by-side with your code.</p>
<p>Widget previews excel at:</p>
<ul>
<li class=""><strong>Rapid iteration</strong>: Test multiple states (loading, error, success) without navigating through your app</li>
<li class=""><strong>Edge case testing</strong>: Verify long text, empty states, different screen sizes</li>
<li class=""><strong>Design system development</strong>: Build component libraries with visual documentation built-in</li>
<li class=""><strong>Theme validation</strong>: Toggle light/dark mode instantly to catch contrast issues</li>
</ul>
<blockquote>
<p>For advanced patterns, configuration tips, and real-world examples, we're writing a <strong>Comprehensive Guide to Flutter Widget Previews</strong> on the <a href="https://dcm.dev/blog" target="_blank" rel="noopener noreferrer" class="">DCM blog</a>.</p>
</blockquote>
<p>While previews help you see widgets, DCM helps you maintain their quality:</p>
<ul>
<li class=""><strong><a href="https://dcm.dev/docs/cli/analysis/analyze-widgets/" target="_blank" rel="noopener noreferrer" class=""><code>dcm analyze-widgets</code></a></strong>: Reports the quality and usage of your widgets.</li>
</ul>
<p><img decoding="async" loading="lazy" src="https://dcm.dev/img/features/widgets-example.webp" alt="Analyze" class="img_ev3q"></p>
<ul>
<li class=""><strong><a href="https://dcm.dev/docs/metrics/" target="_blank" rel="noopener noreferrer" class="">DCM Metrics</a></strong>: Use metrics to measure the complexity of your code and identify areas that may be difficult to maintain or test.</li>
</ul>
<p><img decoding="async" loading="lazy" src="https://dcm.dev/img/features/metrics-example.webp" alt="Metrics" class="img_ev3q"></p>
<p>Check the official <a href="https://docs.flutter.dev/tools/widget-previewer" target="_blank" rel="noopener noreferrer" class="">Flutter Widget Previewer documentation</a> to get started today.</p>
<div class="wrapper_plzk"><p>DCM is a code quality tool that helps your team move faster by reducing the time spent on code reviews, finding tricky bugs, identifying complex code, and unifying code style.</p><div class="heroButtons_DVKJ"><a class="button button--primary button--md" href="https://dcm.dev/pricing/">Start for Free</a><a class="button button--secondary button--md demo-button" href="https://dcm.dev/demo/"><svg width="12" height="17" viewBox="0 0 12 17" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M11.4742 7.67501C12.054 8.0722 12.054 8.92781 11.4742 9.32499L1.60147 16.0881C0.937832 16.5427 0.0363247 16.0675 0.0363247 15.2631L0.0363253 1.73691C0.0363253 0.932494 0.937834 0.457306 1.60147 0.911917L11.4742 7.67501Z" fill="#000"></path></svg>Watch Demo</a></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="performance-gains-with-impeller">Performance Gains with Impeller<a href="https://dcm.dev/blog/2025/12/23/top-flutter-features-2025/#performance-gains-with-impeller" class="hash-link" aria-label="Direct link to Performance Gains with Impeller" title="Direct link to Performance Gains with Impeller" translate="no">​</a></h2>
<p>Flutter's new rendering engine, Impeller, became the default on both iOS and Android in 2025.</p>
<p>Impeller eliminates shader compilation jank by using precompiled shaders, making complex animations and first-run interactions significantly smoother.</p>
<p>There were many improvements but the key ones across 3.29-3.35:</p>
<ul>
<li class=""><strong>Faster text rendering</strong>: Higher-resolution glyph caching eliminates hitches in text animations</li>
<li class=""><strong>Efficient blur effects</strong>: Backdrop filters and transparent effects now avoid redundant layers</li>
<li class=""><strong>Better memory management</strong>: Optimized partial repaints reduce garbage collection pressure</li>
<li class=""><strong>Broader GPU support</strong>: Added support for Vivante GPUs and improved Vulkan/OpenGL stability</li>
<li class=""><strong>Faster engine startup</strong>: Background thread initialization reduces app launch time</li>
</ul>
<p>All of these changes in 2025 made real-world impact (mentioned in the release notes and benchmarks by the Flutter team) as:</p>
<ul>
<li class="">30-50% reduction in jank frames during complex animations</li>
<li class="">20-40% improvement in text rendering performance</li>
<li class="">Smoother interactions with backdrop filters and shader effects</li>
</ul>
<p>Impeller is now rock-solid for production apps. If you use custom rendering code or unusual <a href="https://api.flutter.dev/flutter/dart-ui/BlendMode.html" target="_blank" rel="noopener noreferrer" class=""><code>BlendMode</code></a> combinations, test on Flutter 3.29+ to verify everything renders correctly.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ios--android-polish">iOS &amp; Android Polish<a href="https://dcm.dev/blog/2025/12/23/top-flutter-features-2025/#ios--android-polish" class="hash-link" aria-label="Direct link to iOS &amp; Android Polish" title="Direct link to iOS &amp; Android Polish" translate="no">​</a></h2>
<p>Flutter 3.29 brought meaningful improvements to platform-specific widgets.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cupertino-ios-styled-modal">Cupertino iOS-styled Modal<a href="https://dcm.dev/blog/2025/12/23/top-flutter-features-2025/#cupertino-ios-styled-modal" class="hash-link" aria-label="Direct link to Cupertino iOS-styled Modal" title="Direct link to Cupertino iOS-styled Modal" translate="no">​</a></h3>
<p><strong>CupertinoSheetRoute</strong>: A new iOS-styled modal sheet that supports the native drag-to-dismiss gesture, replacing custom sheet implementations:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/cupertino.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">/// Flutter code sample for [showCupertinoSheet].</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">main</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token function" style="color:#87aff4">runApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CupertinoSheetApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CupertinoSheetApp</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CupertinoSheetApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CupertinoApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">title</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Cupertino Sheet'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> home</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">HomePage</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">HomePage</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">HomePage</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CupertinoPageScaffold</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      navigationBar</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CupertinoNavigationBar</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        middle</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Sheet Example'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        automaticBackgroundVisibility</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Center</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Column</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          mainAxisAlignment</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MainAxisAlignment</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">center</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Widget</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token class-name" style="color:#7fdbca">CupertinoButton</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">filled</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              onPressed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token generic-function" style="color:#87aff4">showCupertinoSheet</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics keyword" style="color:#00bff9">void</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  context</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  useNestedNavigation</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  pageBuilder</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_SheetScaffold</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Open Bottom Sheet'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_SheetScaffold</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_SheetScaffold</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CupertinoPageScaffold</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_SheetBody</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">title</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'CupertinoSheetRoute'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_SheetBody</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_SheetBody</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">title</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> title</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Center</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Column</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        mainAxisAlignment</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MainAxisAlignment</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">center</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Widget</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">title</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token class-name" style="color:#7fdbca">CupertinoButton</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">filled</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            onPressed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token class-name" style="color:#7fdbca">Navigator</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">of</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">maybePop</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Go Back'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token class-name" style="color:#7fdbca">CupertinoButton</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">filled</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            onPressed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token class-name" style="color:#7fdbca">CupertinoSheetRoute</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">popSheet</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Pop Whole Sheet'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token class-name" style="color:#7fdbca">CupertinoButton</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">filled</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            onPressed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token class-name" style="color:#7fdbca">Navigator</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">of</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">push</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token class-name" style="color:#7fdbca">CupertinoPageRoute</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics keyword" style="color:#00bff9">void</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">builder</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_SheetNextPage</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Push Nested Page'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token class-name" style="color:#7fdbca">CupertinoButton</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">filled</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            onPressed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token generic-function" style="color:#87aff4">showCupertinoSheet</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics keyword" style="color:#00bff9">void</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                context</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                useNestedNavigation</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                pageBuilder</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_SheetScaffold</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Push Another Sheet'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_SheetNextPage</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_SheetNextPage</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CupertinoPageScaffold</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      backgroundColor</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CupertinoColors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">activeOrange</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_SheetBody</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">title</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Next Page'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p><img decoding="async" loading="lazy" src="https://miro.medium.com/v2/resize:fit:442/0*wkUFtSuMJHMV7VBJ" alt="CupertinoSheetRoute Demo" class="img_ev3q"></p>
<p>Other improvements: <code>CupertinoNavigationBar</code> now supports bottom widgets, dark mode enhancements for alert dialogs, and refined text selection handling on iOS.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="material-refinements">Material Refinements<a href="https://dcm.dev/blog/2025/12/23/top-flutter-features-2025/#material-refinements" class="hash-link" aria-label="Direct link to Material Refinements" title="Direct link to Material Refinements" translate="no">​</a></h3>
<p><strong>FadeForwardsPageTransitionsBuilder</strong>: Material 3 now uses a fade-through page transition instead of zoom, matching Android's latest native behavior.</p>
<p><img decoding="async" loading="lazy" src="https://miro.medium.com/v2/resize:fit:1400/0*4UHEVkh3Lnmhzzfa" alt="FadeForwardsPageTransitionsBuilder Comparison" class="img_ev3q"></p>
<p>Progress indicators and sliders received visual refinements as well.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="framework-architecture-changes">Framework Architecture Changes<a href="https://dcm.dev/blog/2025/12/23/top-flutter-features-2025/#framework-architecture-changes" class="hash-link" aria-label="Direct link to Framework Architecture Changes" title="Direct link to Framework Architecture Changes" translate="no">​</a></h3>
<p><strong>Backdrop Filter Optimizations with BackdropGroup</strong>: Flutter 3.29 introduced <code>BackdropGroup</code>, a new widget that batches multiple <code>BackdropFilter</code> widgets into a single render layer. Previously, each <code>BackdropFilter</code> was its own layer, which could cause performance issues in complex UIs with many filters (think frosted glass effects on multiple cards). Now:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">BackdropGroup</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">BackdropFilter</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      filter</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ImageFilter</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">blur</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">sigmaX</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">4</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> sigmaY</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">4</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Container</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">white</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">withOpacity</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">0.1</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">BackdropFilter</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      filter</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ImageFilter</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">blur</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">sigmaX</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> sigmaY</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AnotherWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><br></span></code></pre></div></div>
<p>This single change can reduce GPU overhead significantly in apps with heavy filter usage.</p>
<p><strong>What are the use cases?</strong></p>
<p>Dashboard apps with many frosted glass panels, Instagram-like story overlays, or chat apps with blurred background notifications.</p>
<p><strong><code>ImageFilter.shader</code> for Custom Effects</strong>: Want a custom shader applied as a filter? Flutter 3.29 added <code>ImageFilter.shader</code>, letting you supply a fragment shader to the <code>BackdropFilter</code>. This unlocks effects that plain blur/color filters can't achieve, displacement maps, custom gradients, HDR effects, etc. Example:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">BackdropFilter</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  filter</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ImageFilter</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">shader</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    shader</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> shader</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// Your compiled fragment shader</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    size</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Size</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">200</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">200</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Container</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    width</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">200</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">200</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Custom shader effect'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><br></span></code></pre></div></div>
<p>This is for advanced use cases, but it's a game-changer for apps that need pixel-perfect custom rendering.</p>
<p><strong>OverlayPortal Improvements</strong>: The <code>OverlayPortal</code> API, introduced in Flutter 3.5, got significant enhancements in 3.29. You can now nest portals, control z-order explicitly, and detect when a portal is shown/hidden via callbacks. This is the recommended way to build floating UI elements (tooltips, popovers, menus) without managing a separate overlay stack.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">OverlayPortal</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  controller</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _portalController</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  overlayChildBuilder</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Positioned</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    top</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _tooltipPos</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">dy</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    left</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _tooltipPos</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">dx</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Tooltip</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">message</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Hello'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">GestureDetector</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    onTapDown</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> _portalController</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token keyword" style="color:#00bff9">show</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    onLongPress</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> _portalController</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token keyword" style="color:#00bff9">hide</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Tap me'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><br></span></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="OverlayPortal" src="https://dcm.dev/assets/images/overlayportal-950d3088ea03f3fd7ad4673c4feb64dc.webp" width="2002" height="1124" class="img_ev3q"></p>
<p>From Flutter 3.8+, The <code>OverlayPortal.targetsRootOverlay</code> constructor is deprecated. Use the default constructor with <code>overlayLocation</code> to choose where the overlay renders (e.g., <code>OverlayChildLocation.rootOverlay</code>).</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// Before</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">OverlayPortal</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">targetsRootOverlay</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  controller</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> myController</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  overlayChildBuilder</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _builder</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> myChild</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// After</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">OverlayPortal</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  overlayLocation</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">OverlayChildLocation</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">rootOverlay</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  controller</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> myController</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  overlayChildBuilder</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _builder</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> myChild</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p><strong>Dart Threading Model on Mobile</strong>: One of the more under-the-hood but important changes was moving the Dart VM to the main thread on iOS and Android.</p>
<p>Previously, Dart ran on its own thread, with complicated synchronization to the platform thread for native calls.</p>
<p>Now, Dart runs on the platform's main thread directly. <strong>What does this mean for you?</strong></p>
<ul>
<li class="">Fewer thread switches = lower latency for platform channel calls</li>
<li class="">Native code can now safely access Dart state without expensive marshaling</li>
<li class="">Simpler debugging experience; no more thread boundary crossings to trace</li>
<li class="">Slightly easier integration with platform libraries that expect main-thread execution</li>
</ul>
<p>This was a deep architectural change that required coordinating with both the Dart and Flutter runtimes, but it unlocks cleaner native interop down the line.</p>
<p>If you use platform channels heavily (camera, location, payments, etc.), you'll benefit from lower overhead.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="accessibility--developer-tooling">Accessibility &amp; Developer Tooling<a href="https://dcm.dev/blog/2025/12/23/top-flutter-features-2025/#accessibility--developer-tooling" class="hash-link" aria-label="Direct link to Accessibility &amp; Developer Tooling" title="Direct link to Accessibility &amp; Developer Tooling" translate="no">​</a></h2>
<p><a href="https://blog.flutter.dev/whats-new-in-flutter-3-35-c58ef72e3766" target="_blank" rel="noopener noreferrer" class="">Flutter 3.35</a> focused on accessibility improvements and analysis performance.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="accessibility-enhancements">Accessibility Enhancements<a href="https://dcm.dev/blog/2025/12/23/top-flutter-features-2025/#accessibility-enhancements" class="hash-link" aria-label="Direct link to Accessibility Enhancements" title="Direct link to Accessibility Enhancements" translate="no">​</a></h3>
<p><strong>SelectionListener &amp; SelectableRegionSelectionStatusScope</strong> provide granular control over text selection, useful for formatting toolbars.</p>
<p><strong>Improved VoiceOver &amp; TalkBack support</strong> makes semantic annotations more robust.</p>
<p><strong>Live region support</strong> allows announcements to be read by screen readers even when unfocused.</p>
<p>And of course, <code>CupertinoExpansionTile</code> brings iOS-native expansion tiles using the <code>Expansible</code> core, proving the decoupling effort works.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="analysis-server-speed-boosts">Analysis Server Speed Boosts<a href="https://dcm.dev/blog/2025/12/23/top-flutter-features-2025/#analysis-server-speed-boosts" class="hash-link" aria-label="Direct link to Analysis Server Speed Boosts" title="Direct link to Analysis Server Speed Boosts" translate="no">​</a></h3>
<p>The Dart analysis server got significant performance improvements, large projects now analyze in under 2 seconds instead of 5+.</p>
<p>Error messages became more contextual, and refactoring tools (extract method, rename) now understand nullable types better.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-assisted-development-and-features">AI-Assisted Development and Features<a href="https://dcm.dev/blog/2025/12/23/top-flutter-features-2025/#ai-assisted-development-and-features" class="hash-link" aria-label="Direct link to AI-Assisted Development and Features" title="Direct link to AI-Assisted Development and Features" translate="no">​</a></h2>
<p>2025 was the year Flutter embraced AI in a big way, both for developers' workflow and in-app capabilities.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dart--flutter-mcp-server">Dart &amp; Flutter MCP Server<a href="https://dcm.dev/blog/2025/12/23/top-flutter-features-2025/#dart--flutter-mcp-server" class="hash-link" aria-label="Direct link to Dart &amp; Flutter MCP Server" title="Direct link to Dart &amp; Flutter MCP Server" translate="no">​</a></h3>
<p>Dart 3.9 introduced the <a href="https://dcm.dev/docs/ide-integrations/mcp-server/" target="_blank" rel="noopener noreferrer" class="">Model Context Protocol (MCP) server</a>, an AI bridge that gives code assistants deep knowledge of your Flutter project.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">dart mcp  </span><span class="token comment" style="color:#999999"># Exposes project structure, dependencies, and analysis to AI tools</span><br></span></code></pre></div></div>
<p>This powers Gemini Code Assist, GitHub Copilot and similar AI assistants, enabling them to understand Flutter context, navigate your codebase, and handle multi-step refactors like adding screens and updating navigation.</p>
<blockquote>
<p>For production-grade AI-assisted development, combine MCP with automated code quality. Read our guide on <a href="https://dcm.dev/blog/2025/08/25/agentic-code-quality-dcm-mcp/" target="_blank" rel="noopener noreferrer" class="">Agentic Code Quality with Dart and DCM MCP</a> to learn how DCM's lint rules and metrics catch issues AI assistants might introduce.</p>
</blockquote>
<p><a href="https://dcm.dev/blog/2025/08/25/agentic-code-quality-dcm-mcp/" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" src="https://dcm.dev/assets/images/2025-08-25-cover-9a5834cdda1628282a61f9f17616adba.jpg" alt="Agentic Code Quality with Dart and DCM MCP" class="img_ev3q"></a></p>
<div class="wrapper_plzk"><p>DCM is a code quality tool that helps your team move faster by reducing the time spent on code reviews, finding tricky bugs, identifying complex code, and unifying code style.</p><div class="heroButtons_DVKJ"><a class="button button--primary button--md" href="https://dcm.dev/pricing/">Start for Free</a><a class="button button--secondary button--md demo-button" href="https://dcm.dev/demo/"><svg width="12" height="17" viewBox="0 0 12 17" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M11.4742 7.67501C12.054 8.0722 12.054 8.92781 11.4742 9.32499L1.60147 16.0881C0.937832 16.5427 0.0363247 16.0675 0.0363247 15.2631L0.0363253 1.73691C0.0363253 0.932494 0.937834 0.457306 1.60147 0.911917L11.4742 7.67501Z" fill="#000"></path></svg>Watch Demo</a></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="firebase-ai-integration">Firebase AI Integration<a href="https://dcm.dev/blog/2025/12/23/top-flutter-features-2025/#firebase-ai-integration" class="hash-link" aria-label="Direct link to Firebase AI Integration" title="Direct link to Firebase AI Integration" translate="no">​</a></h3>
<p>Flutter 3.32/3.35 coincided with Firebase launching the revamped <a href="https://pub.dev/packages/firebase_ai" target="_blank" rel="noopener noreferrer" class=""><code>firebase_ai</code></a> SDK (formerly <code>firebase_vertexai</code>) to access Gemini models and Imagen.</p>
<p>You get chat/completion, image generation, and safety settings without hand-rolling HTTP/auth.</p>
<p>The official <a href="https://flutter.dev/ai" target="_blank" rel="noopener noreferrer" class="">Flutter AI</a> website is also up and running now.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="other-noteworthy-improvements">Other Noteworthy Improvements<a href="https://dcm.dev/blog/2025/12/23/top-flutter-features-2025/#other-noteworthy-improvements" class="hash-link" aria-label="Direct link to Other Noteworthy Improvements" title="Direct link to Other Noteworthy Improvements" translate="no">​</a></h2>
<p>There are a few more updates that I thought it's nice to bookmark them here to reference as what has happened in 2025:</p>
<ul>
<li class=""><strong>Privacy/Safety</strong>: <code>SensitiveContent</code> widget (Android 14+) obscures UI during screen recording. I have written about this widget on this blog <a href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/#sensitivecontent" target="_blank" rel="noopener noreferrer" class="">8 More Flutter Widgets You’re Probably Not Using (But Should Be)</a>
<a href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/#sensitivecontent" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" src="https://dcm.dev/assets/images/2025-10-30-cover-d0a6d98e9248fabdee28f295d15b39d2.jpg" alt="8 Widgets" class="img_ev3q"></a></li>
<li class=""><strong>Accessibility</strong>: <code>SemanticsLabelBuilder</code>, <code>SliverSemantics</code>, and more robust screen reader behavior. Audit with <a href="https://dcm.dev/docs/rules?tags=accessibility" target="_blank" rel="noopener noreferrer" class="">DCM accessibility rules</a>. You can also read our deep dive article.
<a href="http://localhost:3000/blog/2025/06/30/accessibility-flutter-practical-tips-tools-code-youll-actually-use/" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" src="http://localhost:3000/assets/images/2025-06-30-cover-2bcc6bcc0022ed8ccadc4ded10931fc8.jpg" alt="accessibility" class="img_ev3q"></a></li>
<li class=""><strong>DevTools/Analyzer</strong>: Faster AOT analysis, redesigned inspector, metadata-aware logging, and better refactors.</li>
<li class=""><strong>Platform readiness</strong>: iOS 17/Xcode 15 support, Android 14 polish, and multi-window via the iPad <strong>UIScene</strong> lifecycle (3.38) with automatic migration.</li>
<li class=""><strong>UI polish</strong>: Predictive back (Android 14), improved text editing on iOS, <code>form onReset</code>, scrolling/gesture fixes, <code>OverlayPortal</code> improvements.</li>
<li class=""><strong>Material 3</strong>: Refined progress indicators/sliders, DropdownMenu keyboard fixes, TabBar animations, RangeSlider alignment, Chip/Tooltip <code>mouseCursor</code>, Badge, MenuAnchor/MenuBar, Carousel, scrollable NavigationRail, NavigationDrawer slots, BottomSheet dynamic heights.</li>
<li class=""><strong>Cupertino</strong>: NavigationBar bottom widget, dark-mode alert tweaks, better text selection handles, haptics across pickers/sliders.</li>
<li class=""><strong>Android 16KB pages</strong>: Play requires 16KB page support; Flutter 3.38+ is compliant. <code>flutter build appbundle --target-platform android-arm64</code> is enough, verify any custom native libs.</li>
<li class=""><strong>Build toolchain</strong>: Java 17+ now required for Android builds; ensure CI uses the new JDK.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes--deprecations">Breaking Changes &amp; Deprecations<a href="https://dcm.dev/blog/2025/12/23/top-flutter-features-2025/#breaking-changes--deprecations" class="hash-link" aria-label="Direct link to Breaking Changes &amp; Deprecations" title="Direct link to Breaking Changes &amp; Deprecations" translate="no">​</a></h3>
<p>A few things to be aware of if you're upgrading from 3.35 to 3.38:</p>
<ul>
<li class=""><strong>Older iOS versions</strong>: Support for iOS 11 and 12 was dropped; minimum is now iOS 12.2 (effectively 12.2+). Apps targeting iOS 11 won't compile with Flutter 3.38.</li>
<li class=""><strong>Android API 20 (Android 4.3)</strong>: Officially dropped. If you need to support very old devices, stay on Flutter 3.35 or earlier.</li>
<li class=""><strong>Dart 3.9 null safety</strong>: All packages must be null-safe; if you depend on an unmaintained package, you may hit dependency issues. Consider forking or switching packages.</li>
<li class=""><strong>Platform channels</strong>: The migration from the old <code>MethodChannel</code> to the new <code>StandardMessageCodec</code> is mostly transparent, but if you have complex custom serialization, test thoroughly.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="further-reading-and-references">Further Reading and References<a href="https://dcm.dev/blog/2025/12/23/top-flutter-features-2025/#further-reading-and-references" class="hash-link" aria-label="Direct link to Further Reading and References" title="Direct link to Further Reading and References" translate="no">​</a></h2>
<p>If you want to dive deeper into any of the topics above, I highly recommend the official release announcements and docs:</p>
<ul>
<li class="">
<p><a href="https://blog.flutter.dev/whats-new-in-flutter-3-29-f90c380c2317" target="_blank" rel="noopener noreferrer" class="">Flutter 3.29 Release Blog (Feb 2025)</a>: Impeller on Android, rendering improvements</p>
</li>
<li class="">
<p><a href="https://blog.flutter.dev/whats-new-in-flutter-3-32-40c1086bab6e" target="_blank" rel="noopener noreferrer" class="">Flutter 3.32 Release Blog (May 2025)</a>: Hot reload on web, Cupertino superellipses, and more</p>
</li>
<li class="">
<p><a href="https://blog.flutter.dev/whats-new-in-flutter-3-35-c58ef72e3766" target="_blank" rel="noopener noreferrer" class="">Flutter 3.35 Release Blog (Aug 2025)</a>: Web hot reload stable, Widget Previewer, new widgets</p>
</li>
<li class="">
<p><a href="https://blog.flutter.dev/whats-new-in-flutter-3-38-3f7b258f7228" target="_blank" rel="noopener noreferrer" class="">Flutter 3.38 Release Blog (Nov 2025)</a>: Dot shorthands, performance updates, UI polish, AI integrations</p>
</li>
<li class="">
<p><a href="https://docs.flutter.dev/tools/widget-previewer" target="_blank" rel="noopener noreferrer" class="">Flutter Widget Previewer Documentation</a>: Guide to using <code>@Preview</code> and the preview tool</p>
</li>
<li class="">
<p><a href="https://dcm.dev/blog" target="_blank" rel="noopener noreferrer" class="">Comprehensive Guide on Flutter Widget Previewer</a>: Guide to using <code>@Preview</code> and the preview tool with practical examples and edge cases.</p>
</li>
<li class="">
<p><a href="https://firebase.google.com/docs/ml/flutter" target="_blank" rel="noopener noreferrer" class="">Firebase Generative AI for Flutter</a>: Official Firebase AI SDK documentation for integrating Gemini models</p>
</li>
<li class="">
<p><a href="https://dcm.dev/blog/2025/08/25/agentic-code-quality-dcm-mcp/" target="_blank" rel="noopener noreferrer" class="">Let Your AI Assistant Tame Your Tech Debt (with Dart, Flutter and DCM MCP Servers)</a></p>
</li>
<li class="">
<p><a href="https://docs.flutter.dev/release/breaking-changes" target="_blank" rel="noopener noreferrer" class="">Breaking Changes in Flutter 2025</a>: Official list of deprecated APIs and migrations (useful if you encounter warnings or new deprecations).</p>
</li>
</ul>
<p>Each of these resources provides more technical details and examples.</p>
<p>As Flutter developers, we have a lot to celebrate from 2025's progress, our apps are not only easier to write and faster to build, but they are also ready to do some really clever things.</p>
<p>Here's to an even more productive (and fun) 2026!</p>
<p>Happy coding!</p>
<div class="formWrapper_FeQU"><p class="formTitle_o9oT">Enjoying this article?</p><p>Subscribe to get our latest articles and product updates by email.</p><form class="footerForm_u4Zn"><input class="trialInput_rT6u" type="email" placeholder="Email address" name="blogEmail"><button type="submit" class="button button--primary button--sm formButton_cuTv">Subscribe</button></form></div>]]></content>
        <author>
            <name>Majid Hajian</name>
            <uri>https://dcm.dev</uri>
        </author>
        <category label="blog" term="blog"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Best Dart Features to Highlight in 2025]]></title>
        <id>https://dcm.dev/blog/2025/12/20/top-dart-features-2025-years/</id>
        <link href="https://dcm.dev/blog/2025/12/20/top-dart-features-2025-years/"/>
        <updated>2025-12-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Explore the top Dart features released in 2025. From dot shorthands and null-aware collections to stateful hot reload on web and AI-assisted coding with MCP Server, discover what's new and how to use these features effectively in your projects.]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="Cover" src="https://dcm.dev/assets/images/2025-12-20-cover-1cd18feaee9b3edb0d1524ad0b2e01a4.jpg" width="1050" height="561" class="img_ev3q"></p>
<p>2025 was a milestone year for the Dart programming language. Between February and November, the Dart team shipped four stable releases (3.7 through 3.10), and each one quietly changed how thousands of us write code every day.</p>
<p>The cool part? These weren't just incremental tweaks. They were thoughtful additions that addressed real pain points, from reducing boilerplate in Flutter widget trees to making web development feel as smooth as mobile, to giving AI assistants actual knowledge of your project structure.</p>
<p>In this article, I'll walk you through the features that actually matter in 2025, with the context of why they were needed and what they mean for your workflow.</p>
<p>Here’s what we’ll cover in this article:</p>
<ul>
<li class="">Dot Shorthands</li>
<li class="">Null-Aware Collection Elements</li>
<li class="">New Analyzer Plugin API</li>
<li class="">Dart &amp; Flutter MCP Server</li>
<li class="">Build Hooks for Native Code Integration</li>
<li class="">Granular Deprecation Annotations</li>
<li class="">Documentation Imports with <code>@docImport</code></li>
<li class="">Wildcard Variables with <code>_</code></li>
<li class="">Other Noteworthy Improvements</li>
<li class="">Further Reading and References</li>
</ul>
<p>Let's get started.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dot-shorthands">Dot Shorthands<a href="https://dcm.dev/blog/2025/12/20/top-dart-features-2025-years/#dot-shorthands" class="hash-link" aria-label="Direct link to Dot Shorthands" title="Direct link to Dot Shorthands" translate="no">​</a></h2>
<p>If you've worked with Flutter at all, you know the pain. <code>Enum</code> after enum, you type <code>MainAxisAlignment.center</code>, <code>CrossAxisAlignment.end</code>, <code>LogLevel.warning</code>. It's not a huge deal on its own, but across a codebase of thousands of lines, it becomes visual noise.</p>
<p><a href="https://blog.dart.dev/announcing-dart-3-10-ea8b952b6088" target="_blank" rel="noopener noreferrer" class="">Dart 3.10</a> introduced dot shorthands, a feature that sounds simple but genuinely changes how your code <em>feels</em> when you're writing it.</p>
<p>The first time I refactored a widget tree to use them, my eyes actually felt less tired. The repetition was gone. The intent was clearer. But and this is important, this feature carries hidden complexity that catches teams off guard if they're not careful.</p>
<p>I've written <a href="https://dcm.dev/blog/2025/11/17/deeper-look-darts-dot-shorthand-hidden-complexity/" target="_blank" rel="noopener noreferrer" class="">a deeper dive into dot shorthands</a> that explores the hidden complexity, edge cases, and practical guidelines for teams, definitely worth reading if you want to understand this feature thoroughly.</p>
<p><a href="https://dcm.dev/blog/2025/11/17/deeper-look-darts-dot-shorthand-hidden-complexity/" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" src="https://dcm.dev/assets/images/2025-11-17-cover-682a30385a7fbffa4432b0ddc53c7160.jpg" alt="A Deeper Look at Dart's Dot Shorthands (and Their Hidden Complexity For Your Flutter Projects)" class="img_ev3q"></a></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-dot-shorthands-works">How Dot Shorthands Works<a href="https://dcm.dev/blog/2025/12/20/top-dart-features-2025-years/#how-dot-shorthands-works" class="hash-link" aria-label="Direct link to How Dot Shorthands Works" title="Direct link to How Dot Shorthands Works" translate="no">​</a></h3>
<p>Dart has a straightforward rule here: <strong>it looks at the expected type from context and infers the shorthand from that.</strong> That's it.</p>
<p>Instead of writing:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">enum</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">LogLevel</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"> info</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> warning</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> error</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> debug </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">LogLevel</span><span class="token plain"> level </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">LogLevel</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">info</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>You can now write:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">LogLevel</span><span class="token plain"> level </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">info</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain">  </span><span class="token comment" style="color:#999999">// Dart knows you mean LogLevel.info</span><br></span></code></pre></div></div>
<p>The compiler doesn't guess. It doesn't search around. It simply takes the expected type (<code>LogLevel</code> from the variable declaration) and resolves the shorthand.</p>
<p>Context is everything.</p>
<p>This works in four main places in your code:</p>
<p><strong>1. Enums</strong> Where the biggest wins happen:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// Before</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Column</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">mainAxisAlignment</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MainAxisAlignment</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">center</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// After</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Column</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">mainAxisAlignment</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">center</span><span class="token punctuation" style="color:#a7dbf7">)</span><br></span></code></pre></div></div>
<p>In a typical <code>build</code> method, this feels <em>dramatically</em> easier to read. You're no longer repeating type names; you're just picking the value.</p>
<p><strong>2. Static Methods &amp; Fields:</strong></p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">Duration</span><span class="token plain"> timeout </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">zero</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain">  </span><span class="token comment" style="color:#999999">// Instead of Duration.zero</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> port </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">parse</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'8080'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain">  </span><span class="token comment" style="color:#999999">// Instead of int.parse('8080')</span><br></span></code></pre></div></div>
<p>This one is contentious. Some developers love the conciseness; others find it confusing because <code>.parse</code> doesn't visually connect to <code>int</code>. Use your team's best judgment.</p>
<p><strong>3. Named Constructors:</strong></p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">Point</span><span class="token plain"> p </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">fromList</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain">  </span><span class="token comment" style="color:#999999">// Instead of Point.fromList([1, 2])</span><br></span></code></pre></div></div>
<p>This surprised me how much better it reads. Rewriting a file with these changes made the code feel more consistent.</p>
<p><strong>4. Default Constructors (<code>.new</code>):</strong></p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_State</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Page</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">late</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AnimationController</span><span class="token plain"> _ac </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token keyword" style="color:#00bff9">new</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">vsync</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ScrollController</span><span class="token plain"> _sc </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token keyword" style="color:#00bff9">new</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">GlobalKey</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">ScaffoldMessengerState</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> messengerKey </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token keyword" style="color:#00bff9">new</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>This is where shorthands truly shine in Flutter state classes. The boilerplate drops significantly.</p>
<p><strong>5. Generics:</strong></p>
<p>One of my favorite discoveries was how well this works with generics. I genuinely thought this wouldn't compile:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// The context is the *entire* generic type.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Map</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> matrix </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">from</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>There are important limitations though, let's not go deeper and instead read my deep dive article <a href="https://dcm.dev/blog/2025/11/17/deeper-look-darts-dot-shorthand-hidden-complexity/" target="_blank" rel="noopener noreferrer" class="">a deeper dive into dot shorthands</a> to understand more.</p>
<p>However, let's point out some complexities.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-it-gets-tricky-the-hidden-complexity">Where It Gets Tricky (The Hidden Complexity)<a href="https://dcm.dev/blog/2025/12/20/top-dart-features-2025-years/#where-it-gets-tricky-the-hidden-complexity" class="hash-link" aria-label="Direct link to Where It Gets Tricky (The Hidden Complexity)" title="Direct link to Where It Gets Tricky (The Hidden Complexity)" translate="no">​</a></h3>
<p>This is where you need to be cautious. After using shorthands in real projects, here are the pitfalls:</p>
<p><strong>Nested shorthands are a readability nightmare.</strong> Avoid this at all costs:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Version</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> name</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Version</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">WidgetConfig</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Version</span><span class="token plain"> version</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">WidgetConfig</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">version</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CustomWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">WidgetConfig</span><span class="token plain"> config</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CustomWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">config</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// ⛔️ DON'T DO THIS</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CustomWidget</span><span class="token plain"> x </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token keyword" style="color:#00bff9">new</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">.</span><span class="token keyword" style="color:#00bff9">new</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">version</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token keyword" style="color:#00bff9">new</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'val'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>This isn't clever. This is a puzzle. The cognitive load is extreme, no visual type anchors, the nesting depth becomes invisible, and debugging requires constantly checking type definitions.</p>
<p>Fortunately, DCM provides the <a href="https://dcm.dev/docs/rules/common/avoid-nested-shorthands" target="_blank" rel="noopener noreferrer" class="">avoid-nested-shorthands</a> rule to flag this automatically.</p>
<p><strong>Expression statements can't start with a dot.</strong> This will fail:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// ❌ ERROR: No context</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">log</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Hello'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain">  </span><span class="token comment" style="color:#999999">// Dart doesn't know what type .log refers to</span><br></span></code></pre></div></div>
<p>But this works:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// ✅ OK: Variable type provides context</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Logger</span><span class="token plain"> log </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">log</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Hello'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p><strong>Equality comparisons are asymmetric.</strong> Shorthands only work on the right side of <code>==</code>:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">Color</span><span class="token plain"> myColor </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Color</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">red</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// ✅ This is allowed:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">myColor </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">green</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"> </span><span class="token comment" style="color:#999999">/* ... */</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">myColor </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">blue</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain">  </span><span class="token comment" style="color:#999999">// OK</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// ⛔️ This is not allowed:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// ERROR: Shorthand must be on right side</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">red </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> myColor</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// ERROR: Cannot use complex expressions on right side</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">myColor </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">condition </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">green </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">blue</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// ERROR: Type context lost by casting</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">myColor </span><span class="token operator" style="color:#00bff9">as</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Object</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">green</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p><strong>Teams will naturally disagree.</strong> Some developers love the conciseness. Others find it hides information. New team members might struggle inferring the types.</p>
<p>This is why lint rules become essential.</p>
<p>To enforce consistency across your team, DCM provides rules like:</p>
<ul>
<li class=""><a href="https://dcm.dev/docs/rules/common/prefer-shorthands-with-enums" target="_blank" rel="noopener noreferrer" class="">prefer-shorthands-with-enums</a></li>
<li class=""><a href="https://dcm.dev/docs/rules/common/prefer-shorthands-with-constructors" target="_blank" rel="noopener noreferrer" class="">prefer-shorthands-with-constructors</a></li>
<li class=""><a href="https://dcm.dev/docs/rules/common/prefer-shorthands-with-static-fields" target="_blank" rel="noopener noreferrer" class="">prefer-shorthands-with-static-fields</a></li>
<li class=""><a href="https://dcm.dev/docs/rules/common/prefer-returning-shorthands" target="_blank" rel="noopener noreferrer" class="">prefer-returning-shorthands</a></li>
<li class=""><a href="https://dcm.dev/docs/rules/common/avoid-nested-shorthands" target="_blank" rel="noopener noreferrer" class="">avoid-nested-shorthands</a></li>
</ul>
<p>Use them to guide your team toward consistency, not as a hammer.</p>
<div class="wrapper_plzk"><p>DCM is a code quality tool that helps your team move faster by reducing the time spent on code reviews, finding tricky bugs, identifying complex code, and unifying code style.</p><div class="heroButtons_DVKJ"><a class="button button--primary button--md" href="https://dcm.dev/pricing/">Start for Free</a><a class="button button--secondary button--md demo-button" href="https://dcm.dev/demo/"><svg width="12" height="17" viewBox="0 0 12 17" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M11.4742 7.67501C12.054 8.0722 12.054 8.92781 11.4742 9.32499L1.60147 16.0881C0.937832 16.5427 0.0363247 16.0675 0.0363247 15.2631L0.0363253 1.73691C0.0363253 0.932494 0.937834 0.457306 1.60147 0.911917L11.4742 7.67501Z" fill="#000"></path></svg>Watch Demo</a></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="null-aware-collection-elements">Null-Aware Collection Elements<a href="https://dcm.dev/blog/2025/12/20/top-dart-features-2025-years/#null-aware-collection-elements" class="hash-link" aria-label="Direct link to Null-Aware Collection Elements" title="Direct link to Null-Aware Collection Elements" translate="no">​</a></h2>
<p><a href="https://blog.dart.dev/announcing-dart-3-8-724eaaec9f47" target="_blank" rel="noopener noreferrer" class="">Dart 3.8</a> introduced null-aware collection elements, a convenient way to conditionally include items in a collection literal only if they are non-null. By prefixing an element with <code>?</code> inside a list, set, or map literal, Dart will automatically include that element only if it’s not null.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics">expression</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// key is a null-aware element</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics">key_expression</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics">value_expression</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// value is a null-aware element</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics">key_expression</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics">value_expression</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// key and value are null-aware elements</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics">key_expression</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics">value_expression</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><br></span></code></pre></div></div>
<p>This feature eliminates the need for verbose if checks when building collections of potentially null values.</p>
<p>For example, suppose you have two variables that might be null and you want to add them to a list if they are non-null:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">String</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> item1 </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">getItem1OrNull</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">String</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> item2 </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">getItem2OrNull</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// Before null-aware elements:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> values </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">item1 </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> values</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">add</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">item1</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">item2 </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> values</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">add</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">item2</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// Using null-aware collection elements (Dart 3.8+):</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> values </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain">item1</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain">item2</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>In the Dart 3.8+ version, the list literal <code>[...]</code> will include <code>item1</code> and <code>item2</code> only when they are not null, making the code more concise.</p>
<p>This works in <code>List</code>, <code>Set</code>, and <code>Map</code> literals.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">String</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> presentKey </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Apple'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">String</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> absentKey </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">int</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> presentValue </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">3</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">int</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> absentValue </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">var</span><span class="token plain"> itemsA </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain">presentKey</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> absentValue</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// {Apple: null}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">var</span><span class="token plain"> itemsB </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain">presentKey</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain">absentValue</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// {}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">var</span><span class="token plain"> itemsC </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain">absentKey</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> presentValue</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// {null: 3}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">var</span><span class="token plain"> itemsD </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain">absentKey</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> presentValue</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// {}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">var</span><span class="token plain"> itemsE </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain">absentKey</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> absentValue</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// {null: null}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">var</span><span class="token plain"> itemsF </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain">absentKey</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain">absentValue</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// {}</span><br></span></code></pre></div></div>
<p>As with dot shorthands, teams often end up with mixed styles here (some people prefer the explicit <code>if (x != null) ...</code>, others prefer the concise <code>?x</code> form). This is a great place to let lint rules enforce consistency.</p>
<p>To keep this style consistent across a codebase, DCM provides:</p>
<ul>
<li class=""><a href="https://dcm.dev/docs/rules/common/prefer-null-aware-elements" target="_blank" rel="noopener noreferrer" class="">prefer-null-aware-elements</a> to encourage using <code>?element</code> instead of <code>if (x != null) ...</code></li>
<li class=""><a href="https://dcm.dev/docs/rules/common/avoid-unnecessary-null-aware-elements" target="_blank" rel="noopener noreferrer" class="">avoid-unnecessary-null-aware-elements</a> to catch redundant <code>?</code> elements (for example <code>?null</code>)</li>
</ul>
<p>Read more about <a href="https://dart.dev/language/collections#null-aware-element" target="_blank" rel="noopener noreferrer" class="">Null-aware elements</a> on Dart's official documentation.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-analyzer-plugin-api">New Analyzer Plugin API<a href="https://dcm.dev/blog/2025/12/20/top-dart-features-2025-years/#new-analyzer-plugin-api" class="hash-link" aria-label="Direct link to New Analyzer Plugin API" title="Direct link to New Analyzer Plugin API" translate="no">​</a></h2>
<p><a href="https://blog.dart.dev/announcing-dart-3-10-ea8b952b6088" target="_blank" rel="noopener noreferrer" class="">Dart 3.10</a> introduced a new native API for analyzer plugins. Now you can write custom static analysis rules and integrate them directly into the Dart analyzer, with rules running in your IDE just like built-in lints.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:analysis_server_plugin/plugin.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:analysis_server_plugin/registry.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// Top-level plugin instance required for analyzer to load</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> plugin </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AvoidPrintPlugin</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AvoidPrintPlugin</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Plugin</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">get</span><span class="token plain"> name </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Avoid Print Plugin'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">register</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">PluginRegistry</span><span class="token plain"> registry</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    registry</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">registerWarningRule</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">AvoidPrintRule</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    registry</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">registerFixForRule</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token class-name" style="color:#7fdbca">AvoidPrintRule</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">code</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token class-name" style="color:#7fdbca">ReplacePrintWithDebugPrint</span><span class="token number" style="color:#8dec95">.</span><span class="token keyword" style="color:#00bff9">new</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>This is a big topic! Let's not explore it here; instead, for a deeper dive into building custom lints with this new API, subscribe to our blog as we are going to release soon a comprehensive blog post about the new API.</p>
<div class="formWrapper_FeQU"><p class="formTitle_o9oT">Enjoying this article?</p><p>Subscribe to get our latest articles and product updates by email.</p><form class="footerForm_u4Zn"><input class="trialInput_rT6u" type="email" placeholder="Email address" name="blogEmail"><button type="submit" class="button button--primary button--sm formButton_cuTv">Subscribe</button></form></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dart--flutter-mcp-server">Dart &amp; Flutter MCP Server<a href="https://dcm.dev/blog/2025/12/20/top-dart-features-2025-years/#dart--flutter-mcp-server" class="hash-link" aria-label="Direct link to Dart &amp; Flutter MCP Server" title="Direct link to Dart &amp; Flutter MCP Server" translate="no">​</a></h2>
<p><a href="https://blog.dart.dev/announcing-dart-3-9-ba49e8f38298" target="_blank" rel="noopener noreferrer" class="">Dart 3.9</a> introduced the <a href="https://docs.flutter.dev/ai/mcp-server" target="_blank" rel="noopener noreferrer" class="">Dart &amp; Flutter MCP Server</a>, a bridge between your IDE, CLI, codebase, and AI assistants. As official documentation mentioned:</p>
<blockquote>
<p>The Dart and Flutter MCP server exposes Dart and Flutter development tool actions to compatible AI-assistant clients. MCP (model context protocol) is a protocol that enables communication between development tools and AI assistants, allowing the assistants to understand the context of the code and perform actions on behalf of the developer.</p>
</blockquote>
<p>For a deeper exploration of how this works and why it matters for code quality automation, check out <a href="https://dcm.dev/blog/2025/08/25/agentic-code-quality-dcm-mcp/" target="_blank" rel="noopener noreferrer" class="">Agentic Code Quality with Dart and DCM MCP Servers</a>.</p>
<img src="https://dcm.dev/blog/2025-08-25/agent-mcp-light.webp" alt="Agent &amp; DCM MCP" class="themedComponent_mlkZ themedComponent--light_NVdE" width="2689" height="862" style="margin-bottom:20px;height:auto"><img src="https://dcm.dev/blog/2025-08-25/agent-mcp-dark.webp" alt="Agent &amp; DCM MCP" class="themedComponent_mlkZ themedComponent--dark_xIcU" width="2689" height="862" style="margin-bottom:20px;height:auto">
<p>You can also explore <a href="https://dcm.dev/docs/ide-integrations/mcp-server/" target="_blank" rel="noopener noreferrer" class="">DCM's MCP Server integration</a> for setup and usage details.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="build-hooks-for-native-code-integration">Build Hooks for Native Code Integration<a href="https://dcm.dev/blog/2025/12/20/top-dart-features-2025-years/#build-hooks-for-native-code-integration" class="hash-link" aria-label="Direct link to Build Hooks for Native Code Integration" title="Direct link to Build Hooks for Native Code Integration" translate="no">​</a></h2>
<p><a href="https://blog.dart.dev/announcing-dart-3-10-ea8b952b6088" target="_blank" rel="noopener noreferrer" class="">Dart 3.10</a> stabilized build hooks, a game-changer for packages that need to compile or bundle native code (C, C++, Rust, Go) alongside Dart.</p>
<p>You create a <code>hook/build.dart</code> script in your package, and the Dart SDK automatically runs it during build, test, or run operations. The hook can compile native libraries, download prebuilt binaries, or generate code assets, all transparently integrated into your package's build process.</p>
<p>Instead of every package inventing custom platform-specific build scripts, you use the standardized <code>hooks</code> and <code>code_assets</code> packages.</p>
<p>Here's a minimal example compiling C code:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// hook/build.dart</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:hooks/hooks.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:logging/logging.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:native_toolchain_c/native_toolchain_c.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">main</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> args</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">args</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">input</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> output</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> packageName </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> input</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">packageName</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> cBuilder </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CBuilder</span><span class="token number" style="color:#8dec95">.</span><span class="token keyword" style="color:#00bff9">library</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> packageName</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      assetName</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'</span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">$</span><span class="token string-literal interpolation expression">packageName</span><span class="token string-literal string" style="color:#e1ffe4">.dart'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      sources</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token string-literal string" style="color:#e1ffe4">'src/</span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">$</span><span class="token string-literal interpolation expression">packageName</span><span class="token string-literal string" style="color:#e1ffe4">.c'</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> cBuilder</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">run</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      input</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> input</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      output</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> output</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      logger</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Logger</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">''</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">level </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Level.ALL</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">onRecord</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">listen</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">record</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">record</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">message</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>Then you can call the native function from Dart with FFI's <code>@Native</code> annotation:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'dart:ffi'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@Native</span><span class="token operator" style="color:#00bff9">&lt;</span><span class="token class-name" style="color:#7fdbca">Int32</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Function</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Int32</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Int32</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">external</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">add</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> a</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> b</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>The SDK bundles the compiled library automatically. No manual setup. No platform-specific complexity.</p>
<p>For complete setup instructions and real-world examples (including SQLite, audio players, and image libraries), see the official <a href="https://dart.dev/tools/hooks" target="_blank" rel="noopener noreferrer" class="">Build Hooks documentation</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="granular-deprecation-annotations">Granular Deprecation Annotations<a href="https://dcm.dev/blog/2025/12/20/top-dart-features-2025-years/#granular-deprecation-annotations" class="hash-link" aria-label="Direct link to Granular Deprecation Annotations" title="Direct link to Granular Deprecation Annotations" translate="no">​</a></h2>
<p><a href="https://blog.dart.dev/announcing-dart-3-10-ea8b952b6088" target="_blank" rel="noopener noreferrer" class="">Dart 3.10</a> introduced a powerful enhancement to the <a href="https://api.dart.dev/dev/latest/dart-core/Deprecated-class.html" target="_blank" rel="noopener noreferrer" class=""><code>@Deprecated</code></a> annotation; you can now deprecate specific usages of a class without marking the entire class deprecated.</p>
<p>Before <a href="https://blog.dart.dev/announcing-dart-3-10-ea8b952b6088" target="_blank" rel="noopener noreferrer" class="">Dart 3.10</a>, if you wanted to prevent extending a class, you had two options: <strong>deprecate the whole class (which flags all usage) or let people extend it freely</strong>. Neither was ideal for library authors trying to communicate breaking changes gradually.</p>
<p>Now you have six specialized constructors:</p>
<ul>
<li class=""><strong><code>@Deprecated.extend()</code></strong>: Deprecates extending a class</li>
<li class=""><strong><code>@Deprecated.implement()</code></strong>: Deprecates implementing a class or mixin</li>
<li class=""><strong><code>@Deprecated.instantiate()</code></strong>: Deprecates instantiating a class</li>
<li class=""><strong><code>@Deprecated.mixin()</code></strong>: Deprecates mixing in a class</li>
<li class=""><strong><code>@Deprecated.subclass()</code></strong>: Deprecates both extending and implementing</li>
<li class=""><strong><code>@Deprecated.optional()</code></strong>: Indicates a parameter will become required in the future</li>
</ul>
<p>Here's a practical example:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// Only allow using the class, not extending it</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@Deprecated</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">extend</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Use composition instead of inheritance'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">LegacyWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">render</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"> </span><span class="token comment" style="color:#999999">/* ... */</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// Normal usage is fine</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> widget </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">LegacyWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// ✅ OK</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// But extending triggers a deprecation warning</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyWidget</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">LegacyWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// ⚠️ Warning</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>Another useful pattern, warning about parameters becoming required:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ApiClient</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">request</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> url</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token metadata function" style="color:#87aff4">@Deprecated</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">optional</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'This will be required in v2.0'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> apiKey</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:#999999">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// Current code without apiKey gets a warning</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">client</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">request</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">url</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'/data'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// ⚠️ Warning: apiKey will be required</span><br></span></code></pre></div></div>
<p>This lets library maintainers communicate upcoming breaking changes clearly through the analyzer, giving users time to migrate before the change becomes breaking.</p>
<p>For full details on all constructors and usage patterns, see the <a href="https://api.dart.dev/dev/latest/dart-core/Deprecated-class.html" target="_blank" rel="noopener noreferrer" class=""><code>Deprecated</code> class documentation</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="documentation-imports-with-docimport">Documentation Imports with <code>@docImport</code><a href="https://dcm.dev/blog/2025/12/20/top-dart-features-2025-years/#documentation-imports-with-docimport" class="hash-link" aria-label="Direct link to documentation-imports-with-docimport" title="Direct link to documentation-imports-with-docimport" translate="no">​</a></h2>
<p><a href="https://blog.dart.dev/announcing-dart-3-8-724eaaec9f47" target="_blank" rel="noopener noreferrer" class="">Dart 3.8</a> introduced <code>@docImport</code>, a feature that solves a frustrating problem:</p>
<blockquote>
<p>how do you reference external APIs in your documentation comments without polluting your actual imports?</p>
</blockquote>
<p>Before <code>@docImport</code>, if you wanted to mention <code>Future</code> or <code>Stream</code> in your docs, you had two bad options:</p>
<ul>
<li class=""><code>import dart:async</code> (even though your code doesn't use it)</li>
<li class="">or write plain text without IDE support (no code completion, no refactoring, broken links).</li>
</ul>
<p>Now you can use <code>@docImport</code> in a library-level doc comment:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">/// @docImport 'dart:async';</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">library</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">/// Returns data asynchronously.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">///</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">/// Similar to [Future.value], but with caching.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">/// For streaming data, consider using [Stream] instead.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DataLoader</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// No actual import of dart:async needed here</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>The IDE treats these references like real imports: you get code completion inside <code>[...]</code>, rename refactoring works, and <code>dart doc</code> generates proper links. But your runtime code stays clean, no unnecessary dependencies.</p>
<p>This works with all import URI styles:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">/// @docImport 'dart:async';</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">/// @docImport 'package:flutter/material.dart';</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">/// @docImport '../models/user.dart';</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">library</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">/// A widget that loads [User] data asynchronously.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">///</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">/// Uses [Future] for one-time loads and [Stream] for real-time updates.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">/// Displays a [CircularProgressIndicator] while loading.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">UserWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Clean implementation without doc-only imports</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>This is especially valuable for package authors writing extensive API documentation. Your docs can reference Flutter widgets, async types, or other packages without forcing those as actual dependencies.</p>
<p>For complete details on doc comment references and IDE features, see the <a href="https://dart.dev/tools/doc-comments/references#doc-imports" target="_blank" rel="noopener noreferrer" class="">Documentation References guide</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="wildcard-variables-with-_">Wildcard Variables with <code>_</code><a href="https://dcm.dev/blog/2025/12/20/top-dart-features-2025-years/#wildcard-variables-with-_" class="hash-link" aria-label="Direct link to wildcard-variables-with-_" title="Direct link to wildcard-variables-with-_" translate="no">​</a></h2>
<p><a href="https://blog.dart.dev/announcing-dart-3-7-bf864a1b195c" target="_blank" rel="noopener noreferrer" class="">Dart 3.7</a> changed how <code>_</code> works for local variables and parameters, making it a true wildcard that doesn't create an actual variable.</p>
<p>Before Dart 3.7, it was common to use <code>_</code> for callback parameters you didn't need:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">announceCompletion</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics keyword" style="color:#00bff9">void</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> future</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  future</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">then</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Complete!'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>But if a callback had multiple unused parameters, you'd end up with awkward naming like <code>_</code>, <code>__</code>, <code>___</code> to avoid name collisions. Now in Dart 3.7, parameters and local variables named <code>_</code> don't actually create a variable, so there's no possibility of collision. You can use <code>_</code> for multiple parameters:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">announceFailure</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics keyword" style="color:#00bff9">void</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> future</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  future</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">onError</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> _</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain">  </span><span class="token comment" style="color:#999999">// ✅ Both wildcards allowed</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Error!'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>This makes the language more consistent with how <code>_</code> already worked in <a href="https://dart.dev/language/patterns" target="_blank" rel="noopener noreferrer" class="">patterns</a>:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">var</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain">_</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> _</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> third</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> _</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> _</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">3</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">4</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">5</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">third</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// Prints "3"</span><br></span></code></pre></div></div>
<p>Now parameters and local variables behave the same way <code>_</code> is a placeholder that declares no actual variable.</p>
<p><strong>Breaking change:</strong> If you have code that declares a parameter or variable named <code>_</code> and then references it, that code will no longer work:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">var</span><span class="token plain"> result </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">3</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">map</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> _</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">toString</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain">  </span><span class="token comment" style="color:#999999">// ❌ Error: Reference to unknown variable</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>You'll need to rename the parameter to something meaningful. This change only applies to parameters and local variables (not top-level variables or members), so you can rename without breaking your library's public API.</p>
<p>In general, DCM provides several lint rules to ensure general usage and proper usage of wildcard, there are some of them:</p>
<ul>
<li class=""><a href="https://dcm.dev/docs/rules/common/avoid-misused-wildcard-pattern/" target="_blank" rel="noopener noreferrer" class=""><strong>avoid-misused-wildcard-pattern</strong></a> — Warns when wildcard patterns are used incorrectly (e.g., in contexts where they have no effect)</li>
<li class=""><a href="https://dcm.dev/docs/rules/common/prefer-wildcard-pattern/" target="_blank" rel="noopener noreferrer" class=""><strong>prefer-wildcard-pattern</strong></a> — Suggests using wildcard patterns instead of <code>dynamic</code> or <code>Object</code> types when matching unknown values</li>
<li class=""><a href="https://dcm.dev/docs/rules/common/avoid-keywords-in-wildcard-pattern/" target="_blank" rel="noopener noreferrer" class=""><strong>avoid-keywords-in-wildcard-pattern</strong></a> — Warns when wildcard patterns have unnecessary declaration keywords</li>
<li class=""><a href="https://dcm.dev/docs/rules/common/avoid-wildcard-cases-with-enums/" target="_blank" rel="noopener noreferrer" class=""><strong>avoid-wildcard-cases-with-enums</strong></a> — Warns against using wildcard cases in enum switches (prefer exhaustive matching)</li>
</ul>
<div class="wrapper_plzk"><p>DCM is a code quality tool that helps your team move faster by reducing the time spent on code reviews, finding tricky bugs, identifying complex code, and unifying code style.</p><div class="heroButtons_DVKJ"><a class="button button--primary button--md" href="https://dcm.dev/pricing/">Start for Free</a><a class="button button--secondary button--md demo-button" href="https://dcm.dev/demo/"><svg width="12" height="17" viewBox="0 0 12 17" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M11.4742 7.67501C12.054 8.0722 12.054 8.92781 11.4742 9.32499L1.60147 16.0881C0.937832 16.5427 0.0363247 16.0675 0.0363247 15.2631L0.0363253 1.73691C0.0363253 0.932494 0.937834 0.457306 1.60147 0.911917L11.4742 7.67501Z" fill="#000"></path></svg>Watch Demo</a></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="other-noteworthy-improvements">Other Noteworthy Improvements<a href="https://dcm.dev/blog/2025/12/20/top-dart-features-2025-years/#other-noteworthy-improvements" class="hash-link" aria-label="Direct link to Other Noteworthy Improvements" title="Direct link to Other Noteworthy Improvements" translate="no">​</a></h2>
<p>A few more quick wins from 2025 worth knowing:</p>
<ul>
<li class="">
<p><strong>Cross-Compilation</strong> (Dart 3.8+): Dart can now compile to native Linux binaries from macOS, Windows, and Linux development machines using <code>dart compile exe</code> or <code>dart compile aot-snapshot</code> with <code>--target-os</code> and <code>--target-arch</code>.</p>
<p>This is especially useful if you’re building for ARM Linux (for example, a Raspberry Pi) and want to compile on your faster dev machine (we do this on macOS to produce <code>linux/arm64</code> artifacts).</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999"># Cross compilation example for an exe</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">dart compile exe --target-os</span><span class="token operator" style="color:#00bff9">=</span><span class="token plain">linux --target-arch</span><span class="token operator" style="color:#00bff9">=</span><span class="token plain">arm64 bin/main.dart</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999"># Cross compilation example for an aot-snapshot</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">dart compile aot-snapshot --target-os</span><span class="token operator" style="color:#00bff9">=</span><span class="token plain">linux --target-arch</span><span class="token operator" style="color:#00bff9">=</span><span class="token plain">arm64 bin/main.dart</span><br></span></code></pre></div></div>
<p>Practical use cases:</p>
<ul>
<li class="">Quicker compiles for embedded devices on a fast laptop.</li>
<li class="">Quicker compiles for a Linux-based backend from a non-Linux dev machine.</li>
</ul>
<p>Read more in the official docs (<a href="https://dart.dev/tools/dart-compile#cross-compilation" target="_blank" rel="noopener noreferrer" class="">Cross compilation</a>) and the Dart 3.8 announcement (<a href="https://blog.dart.dev/announcing-dart-3-8-724eaaec9f47" target="_blank" rel="noopener noreferrer" class="">Dart 3.8</a>).</p>
</li>
<li class="">
<p><strong>Formatter Updates</strong> (Dart 3.7): Dart shipped a largely rewritten formatter (new "tall" style), and Dart 3.8 polished it further based on real feedback: bug fixes, more consistent output, and a few style tweaks that make formatted code read better.</p>
<p>In older releases, a trailing comma would force the surrounding construct to split. The updated formatter now decides whether a construct should split and then adds or removes the trailing comma as needed.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// Before formatter</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">TabBar</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">tabs</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token class-name" style="color:#7fdbca">Tab</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">text</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'A'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Tab</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">text</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'B'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> labelColor</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">white70</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// After formatter</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">TabBar</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  tabs</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Tab</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">text</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'A'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Tab</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">text</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'B'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  labelColor</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">white70</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>Dart 3.8 also tightened some formatting around expressions. For example:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// Previously released formatter (functions)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token function" style="color:#87aff4">function</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">param</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">another</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        argument1</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        argument2</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// Dart 3.8 formatter (functions)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token function" style="color:#87aff4">function</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">param</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">another</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    argument1</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    argument2</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// Previously released formatter (variables)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">variable </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    target</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">property</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">method</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">another</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// Dart 3.8 formatter (variables)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">variable </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> target</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">property</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">method</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">another</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
</li>
<li class="">
<p><strong>Faster CLI Tools</strong> (Dart 3.9): The analysis server is now AOT-compiled. <code>dart analyze</code> runs ~50% faster, and short commands like <code>dart format</code> complete in a fraction of the time.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="further-reading-and-references">Further Reading and References<a href="https://dcm.dev/blog/2025/12/20/top-dart-features-2025-years/#further-reading-and-references" class="hash-link" aria-label="Direct link to Further Reading and References" title="Direct link to Further Reading and References" translate="no">​</a></h2>
<p>For more details on the above features and updates, check out the official Dart announcements and resources from 2025:</p>
<ul>
<li class=""><a href="https://blog.dart.dev/announcing-dart-3-7-bf864a1b195c" target="_blank" rel="noopener noreferrer" class="">Dart 3.7 Release Announcement (Feb 2025)</a></li>
<li class=""><a href="https://blog.dart.dev/announcing-dart-3-8-724eaaec9f47" target="_blank" rel="noopener noreferrer" class="">Dart 3.8 Release Announcement (May 2025)</a></li>
<li class=""><a href="https://blog.dart.dev/announcing-dart-3-9-ba49e8f38298" target="_blank" rel="noopener noreferrer" class="">Dart 3.9 Release Announcement (Aug 2025)</a></li>
<li class=""><a href="https://blog.dart.dev/announcing-dart-3-10-ea8b952b6088" target="_blank" rel="noopener noreferrer" class="">Dart 3.10 Release Announcement (Nov 2025)</a></li>
<li class=""><a href="https://dart.googlesource.com/sdk/+/stable/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class="">Dart SDK Changelog</a></li>
<li class=""><a href="https://blog.flutter.dev/whats-new-in-flutter-3-32-40c1086bab6e" target="_blank" rel="noopener noreferrer" class="">Flutter 3.32 Release Notes (for Hot Reload on Web)</a></li>
</ul>
<p>Each of these resources provides deeper technical context and additional examples.</p>
<p>It’s an exciting time to be a Dart developer, and these features, both stable and upcoming, pave the way for even more productivity and fun in building apps with Dart and Flutter!</p>
<blockquote>
<p>If you want us to write more details about any of the features above, send us an email.</p>
</blockquote>
<p>Happy coding!</p>
<div class="formWrapper_FeQU"><p class="formTitle_o9oT">Enjoying this article?</p><p>Subscribe to get our latest articles and product updates by email.</p><form class="footerForm_u4Zn"><input class="trialInput_rT6u" type="email" placeholder="Email address" name="blogEmail"><button type="submit" class="button button--primary button--sm formButton_cuTv">Subscribe</button></form></div>]]></content>
        <author>
            <name>Majid Hajian</name>
            <uri>https://dcm.dev</uri>
        </author>
        <category label="blog" term="blog"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[What’s new in DCM 1.34.0]]></title>
        <id>https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/</id>
        <link href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/"/>
        <updated>2025-12-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[DCM 1.34.0 includes 6 new rules; updated "recommended" preset; new baseline flag to update only a section of the existing baseline; numerous improvements to all existing metrics to support the latest Dart features and provide more accurate calculations; support for displaying which lines contribute to a particular metric in the metrics HTML reports; and more!]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="Cover" src="https://dcm.dev/assets/images/2025-12-16-cover-bc3104a07636785de1dead270a32ee78.jpg" width="1400" height="736" class="img_ev3q"></p>
<p>Today we’re excited to announce the release of DCM 1.34.0!</p>
<p>This release includes 6 new rules; updated "recommended" preset; new baseline flag to update only a section of the existing baseline; numerous improvements to all existing metrics to support the latest Dart features and provide more accurate calculations; support for displaying which lines contribute to a particular metric in the metrics HTML reports; and more!</p>
<p>Let’s go through the highlights of this release (and the full list of changes is <a class="" href="https://dcm.dev/changelog/#1.34.0">in our changelog</a>)!</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="baseline-improvements">Baseline Improvements<a href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#baseline-improvements" class="hash-link" aria-label="Direct link to Baseline Improvements" title="Direct link to Baseline Improvements" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="flag-to-update-only-a-particular-section">Flag to Update Only a Particular Section<a href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#flag-to-update-only-a-particular-section" class="hash-link" aria-label="Direct link to Flag to Update Only a Particular Section" title="Direct link to Flag to Update Only a Particular Section" translate="no">​</a></h3>
<p>With this release, the <code>dcm init baseline</code> command now has a new <code>--merge</code> flag to update only a particular section of the existing baseline.</p>
<p>For example, the baseline was generated using <code>--analyze</code>, <code>--unused-code</code> and <code>--unused-files</code> and if you would like to update only the "analyze" section, running <code>dcm init baseline . --analyze --merge</code> will update it while also keeping other section intact.</p>
<p>When used together with the <code>--only-rules</code> option, it will only add issues from the passed rules to the "analyze" section of the baseline.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>You can use this flag together with the <code>--update</code> flag.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-hint-on-incorrect---update-usages">New Hint on Incorrect <code>--update</code> Usages<a href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#new-hint-on-incorrect---update-usages" class="hash-link" aria-label="Direct link to new-hint-on-incorrect---update-usages" title="Direct link to new-hint-on-incorrect---update-usages" translate="no">​</a></h3>
<p>For the <code>--update</code> flag to work, it needs to be used with the same number of commands as the initially generated baseline (because this flag only removes no longer reported issue without adding new ones).</p>
<p>With this release you will now see a new hint for cases when the initially used commands does not match the ones passed with the <code>--update</code> flag:</p>
<p><img decoding="async" loading="lazy" alt="Entrypoint Path" src="https://dcm.dev/assets/images/update-hint-10a9a4df69255b68a2ba9f6b65673deb.png" width="1554" height="428" class="img_ev3q"></p>
<p>We hope this improvement removes any confusion when using the <code>--update</code> flag.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="check-exports-completeness-improvements">Check Exports Completeness Improvements<a href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#check-exports-completeness-improvements" class="hash-link" aria-label="Direct link to Check Exports Completeness Improvements" title="Direct link to Check Exports Completeness Improvements" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="exact-entrypoint-path">Exact Entrypoint Path<a href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#exact-entrypoint-path" class="hash-link" aria-label="Direct link to Exact Entrypoint Path" title="Direct link to Exact Entrypoint Path" translate="no">​</a></h3>
<p>Prior to this release, the initial file with the <code>export</code> declaration (from which the export tree is calculated) was simplified to <code>entrypoint</code> in the command output.</p>
<p>Unfortunately, while that help reduce the total length of the issue message, it was completely uninformative and hard to work with.</p>
<p>With this release, such entrypoint files now have clear relative path displayed:</p>
<p><img decoding="async" loading="lazy" alt="Entrypoint Path" src="https://dcm.dev/assets/images/entrypoint-path-0353990ff8bacf22fec58daa86c9f2f5.png" width="1496" height="538" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="improved-excludes-and-ignores">Improved Excludes and Ignores<a href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#improved-excludes-and-ignores" class="hash-link" aria-label="Direct link to Improved Excludes and Ignores" title="Direct link to Improved Excludes and Ignores" translate="no">​</a></h3>
<p>Additionally, we have improved how excludes are applied to the results of this command.</p>
<p>Before, the excludes were only working for the entrypoint files (the ones under <code>lib/</code>, but not <code>lib/src/</code>) and were <strong>not</strong> working for the transitively not exported entities.</p>
<p>Now, if you can pass a pattern to the <code>--exclude</code> option and ignore any file reported by this command.</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token builtin class-name" style="color:#7fdbca">dcm</span><span class="token plain"> ec </span><span class="token function" style="color:#87aff4">lib</span><span class="token plain"> --exclude=</span><span class="token string" style="color:#e1ffe4">"{**/some_file.dart,**/another.dart}"</span><br></span></code></pre></div></div>
<p>Plus, both <code>// ignore: exports</code> and <code>// ignore_for_file: exports</code> are now correctly working for any reported issue.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="metric-improvements">Metric Improvements<a href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#metric-improvements" class="hash-link" aria-label="Direct link to Metric Improvements" title="Direct link to Metric Improvements" translate="no">​</a></h2>
<p>First of all, if you are already using the latest Dart changes (e.g. dot shorthands), this release brings full metrics support for them (if you were getting incorrect results for the latest language features before, updating should resolve this problem).</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>We've been actively working on metrics for the past 3 releases (various improvements can be found in the changelog), but we are not yet done! If you have any suggestions for new metrics or improvements, please let us know.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="understanding-what-contributes-to-the-metric-value">Understanding What Contributes to the Metric Value<a href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#understanding-what-contributes-to-the-metric-value" class="hash-link" aria-label="Direct link to Understanding What Contributes to the Metric Value" title="Direct link to Understanding What Contributes to the Metric Value" translate="no">​</a></h3>
<p>With this release we are also excited to announce a new feature in the metrics HTML reports: an ability to highlight the lines that affect the metric value:</p>
<video width="100%" controls="" autoplay="" loop="" playsinline=""><source src="/video/lines.mp4"></video>
<p>We expect this feature to significantly simplify refactoring and general understanding of how each metric is calculated.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="updated-metrics">Updated Metrics<a href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#updated-metrics" class="hash-link" aria-label="Direct link to Updated Metrics" title="Direct link to Updated Metrics" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="number-of-used-widgets-and-widgets-nesting-level"><code>number-of-used-widgets</code> and <code>widgets-nesting-level</code><a href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#number-of-used-widgets-and-widgets-nesting-level" class="hash-link" aria-label="Direct link to number-of-used-widgets-and-widgets-nesting-level" title="Direct link to number-of-used-widgets-and-widgets-nesting-level" translate="no">​</a></h4>
<p>Both metrics are now calculated for any method that returns a widget, not just the <code>build</code> method.</p>
<p>This can be particularly useful if a widget has methods that are passed to builders.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyAppBar</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyAppBar</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">title</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> title</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// WNL: 3</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Container</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Row</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token class-name" style="color:#7fdbca">IconButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">            tooltip</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Navigation menu'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">            onPressed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// null disables the button</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token class-name" style="color:#7fdbca">Expanded</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> title</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// WNL: 3</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_buildSome</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Container</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Row</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token class-name" style="color:#7fdbca">Expanded</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> title</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="number-of-overridden-methods"><code>number-of-overridden-methods</code><a href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#number-of-overridden-methods" class="hash-link" aria-label="Direct link to number-of-overridden-methods" title="Direct link to number-of-overridden-methods" translate="no">​</a></h4>
<p>Now is also calculated for other declarations (not just classes) that can have overridden methods.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// NOOM: 1</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AnotherClass</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">method</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">someMethod</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">first</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// NOOM: 1</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">enum</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">E</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">implements</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AnotherClass</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  item</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">first</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// NOOM: 1</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">mixin</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">M</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">on</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AnotherClass</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">first</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">abstract</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AnotherClass</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">first</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="number-of-added-methods"><code>number-of-added-methods</code><a href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#number-of-added-methods" class="hash-link" aria-label="Direct link to number-of-added-methods" title="Direct link to number-of-added-methods" translate="no">​</a></h4>
<p>Now no longer calculates the value for classes that do not extend any other class as they cannot introduce "added methods" (before that all their methods were considered "added" which was confusing).</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// NOAM: 1</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Child</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Parent</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">someMethod</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// No longer counted since it has no parent class</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">someMethod</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">abstract</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Parent</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">first</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="number-of-parameters"><code>number-of-parameters</code><a href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#number-of-parameters" class="hash-link" aria-label="Direct link to number-of-parameters" title="Direct link to number-of-parameters" translate="no">​</a></h4>
<p>Now skips not just the <code>copyWith</code> method (which is used to create a new copy of an instance and usually has a lot of parameters which match the number of fields the instance has), but any method that returns an instance of the enclosing class.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> field</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> another</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Skipped</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">copyWith</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token class-name" style="color:#7fdbca">String</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> field</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> another</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Now also skipped</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">copyWithout</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token class-name" style="color:#7fdbca">String</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> field</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> another</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Also skipped since it returns SomeClass</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">anyOtherName</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token class-name" style="color:#7fdbca">String</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> field</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> another</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="maximum-nesting-level"><code>maximum-nesting-level</code><a href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#maximum-nesting-level" class="hash-link" aria-label="Direct link to maximum-nesting-level" title="Direct link to maximum-nesting-level" translate="no">​</a></h4>
<p>For this metric, we have reverted the change made in <code>1.32.0</code> and while some expressions (especially in widget code) do increase nesting, we decided to keep this metric strictly about statements.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// MNL: 5</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Object</span><span class="token plain"> string</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">string</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">case</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'123'</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> variable </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token keyword" style="color:#00bff9">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">            </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">finally</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">            </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">string </span><span class="token operator" style="color:#00bff9">is</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">              </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>We might introduce another metric to help deal with the nesting of expressions.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="number-of-external-imports"><code>number-of-external-imports</code><a href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#number-of-external-imports" class="hash-link" aria-label="Direct link to number-of-external-imports" title="Direct link to number-of-external-imports" translate="no">​</a></h4>
<p>To align this metric with the <code>number-of-imports</code>, it now counts the total number of external imports (not just unique). Plus, it now correctly takes into account "dart:" imports.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// NOEI: 4</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'dart:io'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'dart:developer'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/material.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter_test/flutter_test.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="number-of-implemented-interfaces"><code>number-of-implemented-interfaces</code><a href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#number-of-implemented-interfaces" class="hash-link" aria-label="Direct link to number-of-implemented-interfaces" title="Direct link to number-of-implemented-interfaces" translate="no">​</a></h4>
<p>Now correctly includes all transitive interfaces, not just direct. Additionally, the number of interfaces is now calculated for enums and mixins (which can also have interfaces).</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// NOII: 3</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Regular</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeOtherBase</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">implements</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeInterface</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyClass</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyPerfectClass</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> value</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Regular</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">implement</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// NOII: 1</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">enum</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">E</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">implements</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeInterface</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"> first</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> second </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// NOII: 1</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">mixin</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">M</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">implements</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyClass</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="cyclomatic-complexity"><code>cyclomatic-complexity</code><a href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#cyclomatic-complexity" class="hash-link" aria-label="Direct link to cyclomatic-complexity" title="Direct link to cyclomatic-complexity" translate="no">​</a></h4>
<p>Now does not consider some statements and expressions as increasing complexity.</p>
<p>The full list of statements and expressions that <strong>affect</strong> the metric is:</p>
<ul>
<li class=""><code>if</code> (statement and expression), <code>catch</code>, <code>do</code>, <code>while</code>, <code>for</code> (statement and expression)</li>
<li class="">conditional expressions (<code>? ... : ...</code>)</li>
<li class=""><code>case</code> in a switch statement or expression (<code>default</code> or last case does not count)</li>
<li class="">null-aware operators (<code>?[]</code>, <code>?.</code>, <code>?..</code>, <code>...?</code>, <code>{key: ?value}</code>)</li>
<li class=""><code>&amp;&amp;</code> and <code>||</code> in binary expressions or patterns</li>
<li class=""><code>??</code> and <code>??=</code></li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="coupling-between-object-classes"><code>coupling-between-object-classes</code><a href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#coupling-between-object-classes" class="hash-link" aria-label="Direct link to coupling-between-object-classes" title="Direct link to coupling-between-object-classes" translate="no">​</a></h4>
<p>Now correctly counts method invocations on complex targets.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">someMethod</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// now also counted as coupling</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  some</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">variable</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">field</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">method</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="preset-updates">Preset Updates<a href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#preset-updates" class="hash-link" aria-label="Direct link to Preset Updates" title="Direct link to Preset Updates" translate="no">​</a></h2>
<p>We've updated the <code>recommended</code> preset to include rules from previous releases:</p>
<ul>
<li class="">avoid-always-null-parameters</li>
<li class="">avoid-constant-conditions</li>
<li class="">avoid-constant-switches</li>
<li class="">avoid-default-tostring</li>
<li class="">avoid-nested-shorthands</li>
<li class="">avoid-never-passed-parameters</li>
<li class="">avoid-stream-tostring</li>
<li class="">avoid-suspicious-global-reference</li>
<li class="">avoid-unassigned-fields</li>
<li class="">avoid-unnecessary-late-fields</li>
<li class="">avoid-unnecessary-length-check</li>
<li class="">avoid-unnecessary-local-variable</li>
<li class="">avoid-unnecessary-null-aware-elements</li>
<li class="">avoid-unnecessary-nullable-parameters</li>
<li class="">avoid-unnecessary-statements</li>
<li class="">avoid-unreachable-for-loop</li>
<li class="">avoid-unremovable-callbacks-in-listeners</li>
<li class="">avoid-unused-local-variable</li>
<li class="">avoid-wildcard-cases-with-sealed-classes</li>
<li class="">match-base-class-default-value</li>
<li class="">prefer-null-aware-elements</li>
<li class="">prefer-returning-shorthands</li>
<li class="">prefer-shorthands-with-constructors</li>
<li class="">prefer-shorthands-with-enums</li>
<li class="">prefer-shorthands-with-static-fields</li>
<li class="">prefer-specifying-future-value-type</li>
<li class="">avoid-mounted-in-setstate</li>
</ul>
<p>If you're using <code>extends: - recommended</code>, these changes will apply automatically.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="rule-updates">Rule Updates<a href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#rule-updates" class="hash-link" aria-label="Direct link to Rule Updates" title="Direct link to Rule Updates" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="banned-usage">banned-usage<a href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#banned-usage" class="hash-link" aria-label="Direct link to banned-usage" title="Direct link to banned-usage" translate="no">​</a></h3>
<p>The <code>banned-usage</code> rule now supports new syntax for synthetic enum fields that applies to all enums (without the need to list each enum name separately).</p>
<p>For example,</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">analysis_options.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">rules</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">banned-usage</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">entries</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> Enum.values</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">            </span><span class="token key atrule" style="color:#6dbdfa">description</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> Do not use "values"</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> Enum.name</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">            </span><span class="token key atrule" style="color:#6dbdfa">description</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> Do not use "name"</span></span><br></span></code></pre></div></div>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">enum</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyEnum</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"> first </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">enum</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AnotherEnum</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"> first </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">MyEnum</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">values</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// LINT: Do not use "values"</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">AnotherEnum</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">name</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// LINT: Do not use "name"</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-rules">New Rules<a href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#new-rules" class="hash-link" aria-label="Direct link to New Rules" title="Direct link to New Rules" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p><strong>Discovering and Adding Rules from New Releases</strong></p><p>Each DCM release introduces new rules. To explore all available rules and filter by version, use the <a class="" href="https://dcm.dev/docs/cli/init/#lints-preview"><code>dcm init lints-preview</code></a> command:</p><div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token builtin class-name" style="color:#7fdbca">dcm</span><span class="token plain"> init lints-preview </span><span class="token function" style="color:#87aff4">lib</span><span class="token plain"> --rule-version=1.34.0  </span><span class="token comment" style="color:#999999"># Show rules added in 1.34.0</span><br></span></code></pre></div></div><p>This command displays:</p><ul>
<li class="">Rule names and their violations in your codebase</li>
<li class="">Estimated effort to fix all violations of each rule</li>
<li class="">Whether a rule supports automatic fixes</li>
</ul><p>You can also generate the output in different formats.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="pass-optional-argument"><a class="" href="https://dcm.dev/docs/rules/common/pass-optional-argument/"><code>pass-optional-argument</code></a><a href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#pass-optional-argument" class="hash-link" aria-label="Direct link to pass-optional-argument" title="Direct link to pass-optional-argument" translate="no">​</a></h3>
<p>Warns when the configured invocation does not have the configured optional argument.</p>
<p>This rule helps with cases when an external declaration (e.g. a pub package or SDK code) has optional parameters that you'd want to always pass. Alternatively, you might want to use this rule to gradually migrate to a required parameter.</p>
<p>For other cases try using the built-in <code>required</code> keyword to make parameters required.</p>
<p>For example,</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">analysis_options.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">rules</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">pass-optional-argument</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">entries</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> SomeClass</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">            </span><span class="token key atrule" style="color:#6dbdfa">args</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> label</span></span><br></span></code></pre></div></div>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> regular</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> label</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">regular</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">label</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: This invocation is missing required optional arguments: label. Try passing them.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> instance </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>To fix this issue, pass the <code>label</code> argument:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> instance </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> label</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'value'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-immediately-invoked-functions"><a class="" href="https://dcm.dev/docs/rules/common/avoid-immediately-invoked-functions/"><code>avoid-immediately-invoked-functions</code></a><a href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#avoid-immediately-invoked-functions" class="hash-link" aria-label="Direct link to avoid-immediately-invoked-functions" title="Direct link to avoid-immediately-invoked-functions" translate="no">​</a></h3>
<p>Suggests moving functions out instead of using then in immediately invoked function expressions.</p>
<p>Immediately invoked function expressions can easily make code hard to read and understand. Instead, consider moving them out as methods/functions or widgets.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Container</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// LINT: Avoid immediately invoked function expressions.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">//  Try moving this function out as a method or widget.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><mark class="code-warning"><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span></mark><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> taskCount </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">getTasks</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></mark><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><mark class="code-warning"><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Tasks remaining: </span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">$</span><span class="token string-literal interpolation expression">taskCount</span><span class="token string-literal string" style="color:#e1ffe4">'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></mark><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><mark class="code-warning"><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>can be simplified to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">late</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> taskCount</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">initState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">initState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  taskCount </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">getTasks</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Container</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Tasks remaining: </span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">$</span><span class="token string-literal interpolation expression">taskCount</span><span class="token string-literal string" style="color:#e1ffe4">'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-complex-conditions"><a class="" href="https://dcm.dev/docs/rules/common/avoid-complex-conditions/"><code>avoid-complex-conditions</code></a><a href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#avoid-complex-conditions" class="hash-link" aria-label="Direct link to avoid-complex-conditions" title="Direct link to avoid-complex-conditions" translate="no">​</a></h3>
<p>Warns when the complexity of a binary expression exceeds the configured threshold.</p>
<p>Overly complex conditions reduce readability and require additional effort to understand how different values affect the result. Consider simplifying such conditions by extracting methods or variables.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> list </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: The complexity of this condition (9) exceeds the configured threshold (3).</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Try simplifying this condition.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><mark class="code-warning"><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">list</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">contains</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'123'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">?</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_condition</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">||</span></mark><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><mark class="code-warning"><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">list</span></mark><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><mark class="code-warning"><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">where</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">item</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> item</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">isNotEmpty</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><mark class="code-warning"><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">any</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">item</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> item</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">contains</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'123'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_condition</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>can be simplified to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> list </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> leftCondition </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">list</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">contains</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'123'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">?</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_condition</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> rightCondition </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> list</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">where</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">item</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> item</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">isNotEmpty</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">any</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">item</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> item</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">contains</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'123'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">leftCondition </span><span class="token operator" style="color:#00bff9">||</span><span class="token plain"> rightCondition</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_condition</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>This rule has a configurable <code>threshold</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-assigning-notifiers"><a class="" href="https://dcm.dev/docs/rules/riverpod/avoid-assigning-notifiers/"><code>avoid-assigning-notifiers</code></a><a href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#avoid-assigning-notifiers" class="hash-link" aria-label="Direct link to avoid-assigning-notifiers" title="Direct link to avoid-assigning-notifiers" translate="no">​</a></h3>
<p>Warns when a notifier instance obtained from <code>ref.read</code> is assigned to a variable.</p>
<p>Assigning notifier instances to variables is generally not recommended, as it can lead to stale references to already unmounted notifiers (especially, when it comes to async gaps). Accessing an unmounted notifier can lead to unexpected behavior and exceptions.</p>
<p>Instead, consider always using <code>ref.read</code> to get the latest reference.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">HomeConsumerState</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ConsumerState</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">HomeConsumerStatefulWidget</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">FooWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      onChange</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token comment" style="color:#999999">// LINT: Assigning notifiers to a variable can lead to accessing unmounted notifiers.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token comment" style="color:#999999">//  Try using 'ref.read' in all places.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><mark class="code-warning"><span class="token plain">value</span></mark><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token generic-function" style="color:#87aff4">read</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">MyNotifier</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">counterProvider</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">notifier</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        value</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// can be unmounted</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">HomeConsumerState</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ConsumerState</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">HomeConsumerStatefulWidget</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">FooWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      onChange</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token generic-function" style="color:#87aff4">read</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">MyNotifier</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">counterProvider</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">notifier</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">someFn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token generic-function" style="color:#87aff4">read</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">MyNotifier</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">counterProvider</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">notifier</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// always the latest state</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="use-ref-and-state-synchronously"><a class="" href="https://dcm.dev/docs/rules/riverpod/use-ref-and-state-synchronously/"><code>use-ref-and-state-synchronously</code></a><a href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#use-ref-and-state-synchronously" class="hash-link" aria-label="Direct link to use-ref-and-state-synchronously" title="Direct link to use-ref-and-state-synchronously" translate="no">​</a></h3>
<p>Warns when a notifier's <code>ref</code> or <code>state</code> are called past an <em>await point</em> (also known as asynchronous gap).</p>
<p>Using <code>ref</code> or <code>state</code> after an async gap will lead to <code>UnmountedRefException</code> if the notifier is already unmounted.</p>
<p>Try checking for <code>ref.mounted</code> before using <code>ref</code> or <code>state</code>.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token metadata function" style="color:#87aff4">@riverpod</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CountNotifier</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> _$</span><span class="token class-name" style="color:#7fdbca">CountNotifier</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics keyword" style="color:#00bff9">void</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">incrementDelayed</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics keyword" style="color:#00bff9">void</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">delayed</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Duration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">seconds</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// LINT: Avoid accessing 'ref' or 'state' past an await point without checking if the ref is mounted.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><mark class="code-warning"><span class="token plain">state </span><span class="token operator" style="color:#00bff9">+=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyWidget</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">GestureDetector</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'show dialog'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    onTap</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">showDialog</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      context</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      builder</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Consumer</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        builder</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> ref</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> _</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AlertDialog</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          actions</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">            </span><span class="token class-name" style="color:#7fdbca">GestureDetector</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">              child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'increment and close'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">              onTap</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">                ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">read</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">countProvider</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">notifier</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">incrementDelayed</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">                </span><span class="token class-name" style="color:#7fdbca">Navigator</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">of</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">pop</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>here, modifying the <code>state</code> property will throw an exception. To avoid that, check for <code>ref.mounted</code> first:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token metadata function" style="color:#87aff4">@riverpod</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CountNotifier</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> _$</span><span class="token class-name" style="color:#7fdbca">CountNotifier</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics keyword" style="color:#00bff9">void</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">incrementDelayed</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics keyword" style="color:#00bff9">void</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">delayed</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Duration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">seconds</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">mounted</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// Correct, checks for mounted first</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      state </span><span class="token operator" style="color:#00bff9">+=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyWidget</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">GestureDetector</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'show dialog'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    onTap</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">showDialog</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      context</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      builder</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Consumer</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        builder</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> ref</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> _</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AlertDialog</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          actions</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">            </span><span class="token class-name" style="color:#7fdbca">GestureDetector</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">              child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'increment and close'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">              onTap</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">                ref</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">read</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">countProvider</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">notifier</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">incrementDelayed</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">                </span><span class="token class-name" style="color:#7fdbca">Navigator</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">of</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">pop</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-missing-tr-on-strings"><a class="" href="https://dcm.dev/docs/rules/easy-localization/avoid-missing-tr-on-strings/"><code>avoid-missing-tr-on-strings</code></a><a href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#avoid-missing-tr-on-strings" class="hash-link" aria-label="Direct link to avoid-missing-tr-on-strings" title="Direct link to avoid-missing-tr-on-strings" translate="no">​</a></h3>
<p>Warns when the <code>tr</code> extension method is not called on string literals.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: Missing 'tr' invocation on this string literal.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><mark class="code-warning"><span class="token string-literal string" style="color:#e1ffe4">'str'</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: Missing 'tr' invocation on this string literal.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><mark class="code-warning"><span class="token string-literal string" style="color:#e1ffe4">'str'</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>should be rewritten to</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'str'</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">tr</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'str'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">tr</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'str'</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">tr</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>This rule also comes with <strong>auto-fix</strong>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What’s next<a href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#whats-next" class="hash-link" aria-label="Direct link to What’s next" title="Direct link to What’s next" translate="no">​</a></h2>
<p>To learn more about upcoming features, keep an eye on our <a href="https://dcm.featurebase.app/roadmap" target="_blank" rel="noopener noreferrer" class="">public roadmap</a>.</p>
<p>And to learn more about our upcoming videos and "Rules of the Week" content, subscribe to our <a href="https://www.youtube.com/@DCMAnalyzer" target="_blank" rel="noopener noreferrer" class="">Youtube Channel</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sharing-your-feedback">Sharing your feedback<a href="https://dcm.dev/blog/2025/12/16/whats-new-in-dcm-1-34-0/#sharing-your-feedback" class="hash-link" aria-label="Direct link to Sharing your feedback" title="Direct link to Sharing your feedback" translate="no">​</a></h2>
<p>If there is something you miss from DCM right now, want us to make something better, or have any general feedback — <a href="https://discord.gg/Vzjprgk4sb" target="_blank" rel="noopener noreferrer" class="">join our Discord server</a>! We’d love to hear from you.</p>]]></content>
        <author>
            <name>Dmitry Zhifarsky</name>
            <uri>https://dcm.dev</uri>
        </author>
        <category label="product-update" term="product-update"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Flutter Hot Reload Isn't Enough (And Why Flutter Developers Need Widget Previews)]]></title>
        <id>https://dcm.dev/blog/2025/12/15/flutter-widget-previewer/</id>
        <link href="https://dcm.dev/blog/2025/12/15/flutter-widget-previewer/"/>
        <updated>2025-12-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Stop hot reloading blind—see every Flutter widget state instantly with the Widget Previewer (Flutter 3.38), multi-previews, and design-system-ready workflows.]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="Cover" src="https://dcm.dev/assets/images/2025-12-15-cover-62a4d7ef1f381a06004df0c0a1bba0b6.jpg" width="1050" height="552" class="img_ev3q"></p>
<p>I’ve been developing Flutter apps for years, and Flutter’s evolution never ceases to amaze me. One of the latest game-changers for UI design is the <a href="https://docs.flutter.dev/tools/widget-previewer" target="_blank" rel="noopener noreferrer" class="">Flutter Widget Previewer</a>, a tool introduced in <a href="https://blog.flutter.dev/whats-new-in-flutter-3-38-3f7b258f7228" target="_blank" rel="noopener noreferrer" class="">Flutter 3.35</a> that lets you see your widgets render in real-time, without running a full app.</p>
<p>If you’ve ever used <a href="https://developer.apple.com/documentation/swiftui/canvas" target="_blank" rel="noopener noreferrer" class="">SwiftUI’s canvas</a> or <a href="https://developer.android.com/develop/ui/compose/tooling/previews" target="_blank" rel="noopener noreferrer" class="">Jetpack Compose’s previews</a>, this will feel familiar.</p>
<p>The first time I tried Widget Previewer, it clicked that this isn't just about faster hot reloads, it's about isolating UI like a Storybook for Flutter. Rather than navigating the app to see a state, you build previews that live beside your code, with every variation (light/dark, sizes, error states) ready to inspect.</p>
<p>In this post, we’ll explore what the Flutter Widget Previewer is, how to use it, what’s new in Flutter 3.38, and how it can supercharge your UI development, all while noting a few quirks to watch out for.</p>
<p>Let's get started</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-the-widget-previewer-actually-is">What the Widget Previewer Actually Is<a href="https://dcm.dev/blog/2025/12/15/flutter-widget-previewer/#what-the-widget-previewer-actually-is" class="hash-link" aria-label="Direct link to What the Widget Previewer Actually Is" title="Direct link to What the Widget Previewer Actually Is" translate="no">​</a></h2>
<p>The Widget Previewer is a tool that isolates your Flutter widgets, rendering them in real-time as you code completely decoupled from your main app UI.</p>
<p>First introduced as an experimental feature in Flutter 3.35, it aims to dramatically accelerate how we build and experiment with UI. To understand the value, you need one mental model:</p>
<blockquote>
<p>think of it as a specialized design canvas.</p>
</blockquote>
<p>With the Previewer, you instantly visualize a widget (or multiple variations of it) in a dedicated preview area. This means the "noise" of firing up a heavy emulator or navigating five screens deep into your app just to check a pixel adjustment is gone. You get a live render, right next to your code.</p>
<p><img decoding="async" loading="lazy" alt="Flutter Widget Preview" src="https://dcm.dev/assets/images/simple-widget-previewer-a6e0f56f90215c2708d1dac440d0f260.webp" width="2838" height="1128" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-this-is-a-big-deal">Why This Is a Big Deal<a href="https://dcm.dev/blog/2025/12/15/flutter-widget-previewer/#why-this-is-a-big-deal" class="hash-link" aria-label="Direct link to Why This Is a Big Deal" title="Direct link to Why This Is a Big Deal" translate="no">​</a></h3>
<p>Consider the typical "tax" we pay during UI testing. You often need to verify a widget at different screen sizes, with various text scales, in light and dark themes, or across multiple languages.</p>
<p>In the past, this meant rebuilding and running the app repeatedly, toggling device simulators or manually changing settings for each individual scenario. It was tedious and broke your flow.</p>
<p>The Widget Previewer flips that workflow. By using special preview annotations, you can see all these variations side-by-side, almost instantly, without ever restarting the full app.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">Widget with @Preview annotation</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/widget_previews.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/material.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@Preview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'My Sample Text'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">mySampleText</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Hello, World!'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>In other words, it finally brings a SwiftUI-like rapid feedback loop to Flutter development, letting you iterate on designs faster and with significantly more confidence.</p>
<table><thead><tr><th style="text-align:left">Without Widget Previewer</th><th style="text-align:left">With Widget Previewer</th></tr></thead><tbody><tr><td style="text-align:left">1. Save your code</td><td style="text-align:left">1. Save your code</td></tr><tr><td style="text-align:left">2. Hot Reload triggers (instant ✅)</td><td style="text-align:left">2. Widget appears instantly in the previewer</td></tr><tr><td style="text-align:left">3. Tap through splash screen → login screen → form screen</td><td style="text-align:left">3. Click the light/dark toggle</td></tr><tr><td style="text-align:left">4. Change theme to dark mode in settings</td><td style="text-align:left">4. Observe the input field in both themes simultaneously</td></tr><tr><td style="text-align:left">5. Observe the input field</td><td style="text-align:left">5. Change the border color</td></tr><tr><td style="text-align:left">6. Go back, change the border color</td><td style="text-align:left">6. Watch it update in real-time</td></tr><tr><td style="text-align:left">7. <em>Save and repeat steps 1-5</em></td><td style="text-align:left"></td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-hot-reload-alone-falls-short">Why Hot Reload Alone Falls Short<a href="https://dcm.dev/blog/2025/12/15/flutter-widget-previewer/#why-hot-reload-alone-falls-short" class="hash-link" aria-label="Direct link to Why Hot Reload Alone Falls Short" title="Direct link to Why Hot Reload Alone Falls Short" translate="no">​</a></h3>
<p>Hot Reload is great for code-change speed, but it still assumes you navigate your app to see each state. Widget Previewer removes that navigation tax by keeping every variation visible side-by-side (theme, size, text scale, error/helper/disabled). It also lets you DRY up preview definitions via <code>@MultiPreview</code>, so design-system components stay in sync without manual flows.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="enabling-the-flutter-widget-previewer">Enabling the Flutter Widget Previewer<a href="https://dcm.dev/blog/2025/12/15/flutter-widget-previewer/#enabling-the-flutter-widget-previewer" class="hash-link" aria-label="Direct link to Enabling the Flutter Widget Previewer" title="Direct link to Enabling the Flutter Widget Previewer" translate="no">​</a></h2>
<p>To use the Previewer efficiently, you need Flutter 3.38+. While it technically appeared in 3.35, the IDE integration, which is the whole point of using it arrived in 3.38.</p>
<p>There are three ways to launch it:</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">VS Code</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Android Studio / IntelliJ</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Command Line (Manual Mode)</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p>The Previewer integrates directly into your sidebar. Look for the "Flutter Widget Preview" tab in the sidebar (usually on the right). Click it to spin up the environment. It waits for your annotations.</p><p><img decoding="async" loading="lazy" alt="Flutter Widget Preview Tab VsCode" src="https://dcm.dev/assets/images/simple-widget-previewer-a6e0f56f90215c2708d1dac440d0f260.webp" width="2838" height="1128" class="img_ev3q"></p></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>Similar to VS Code, this is a dedicated tool window. Find the "Flutter Widget Preview" tool window. Open the window to initialize the background process.</p><p><img decoding="async" loading="lazy" alt="Flutter Widget Preview Tab Intellij" src="https://dcm.dev/assets/images/android-studio-ba3fd034e61e6810bf4a251464a828a6.webp" width="2312" height="1136" class="img_ev3q"></p></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>If you prefer the terminal or want to run it in a standalone Chrome window. Run</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">flutter widget-preview start</span><br></span></code></pre></div></div><p>from your project root. This launches a local server and opens the previewer in Chrome. It auto-refreshes on save.</p></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-web-caveat">The "Web" Caveat<a href="https://dcm.dev/blog/2025/12/15/flutter-widget-previewer/#the-web-caveat" class="hash-link" aria-label="Direct link to The &quot;Web&quot; Caveat" title="Direct link to The &quot;Web&quot; Caveat" translate="no">​</a></h3>
<p>Under the hood, the previewer uses Dart Development Compiler (DDC) which generates Javascript. The widget previewer supports previews of widgets that have dependencies on <code>dart:io</code> (and soon <code>dart:ffi</code>), but will show an error if APIs from those unsupported libraries are actually invoked. The same goes for widgets that depend Flutter plugins that don't have web support.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-create-your-first-preview">How to Create Your First Preview<a href="https://dcm.dev/blog/2025/12/15/flutter-widget-previewer/#how-to-create-your-first-preview" class="hash-link" aria-label="Direct link to How to Create Your First Preview" title="Direct link to How to Create Your First Preview" translate="no">​</a></h2>
<p>Once the previewer is running, how do you actually tell it which widgets to display?</p>
<p>This is done with the <code>@Preview</code> annotation. Flutter provides an annotation (<code>@Preview</code>) in the <a href="https://api.flutter.dev/flutter/widget_previews/" target="_blank" rel="noopener noreferrer" class=""><code>flutter/widget_previews.dart</code> package</a>.</p>
<p>By marking a widget, producing function or constructor with <code>@Preview</code>, you register that widget as a preview entry. The Previewer will detect it and render it for you automatically.</p>
<p>Here are the basic rules and steps to create a preview:</p>
<ul>
<li class="">
<p>Choose a widget to preview. You can use <code>@Preview</code> on:</p>
<ul>
<li class="">A <strong>top-level function</strong> that returns a Widget (or a WidgetBuilder)</li>
<li class="">A <strong>static method of a class</strong> that returns a Widget.</li>
<li class="">A <strong>public Widget constructor or factory</strong> that has no required parameters (so it can be called without any arguments).</li>
</ul>
</li>
<li class="">
<p>Add the <code>@Preview</code> annotation right above that function/method or class constructor. You can give it a name parameter to label this preview in the UI (otherwise it will use a default name).</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="under-the-hood-how-preview-works">Under the Hood: How <code>@Preview</code> Works<a href="https://dcm.dev/blog/2025/12/15/flutter-widget-previewer/#under-the-hood-how-preview-works" class="hash-link" aria-label="Direct link to under-the-hood-how-preview-works" title="Direct link to under-the-hood-how-preview-works" translate="no">​</a></h3>
<p>The <code>@Preview</code> annotation is implemented as a <a href="https://github.com/flutter/flutter/blob/45896dd21bbc4883d662fc093b9036815a1b8613/packages/flutter/lib/src/widget_previews/widget_previews.dart#L72" target="_blank" rel="noopener noreferrer" class="">base class</a> in Flutter's <code>widget_previews.dart</code>. What makes it powerful is its dual nature: it works both as a compile-time annotation and as a runtime configuration object.</p>
<p>When you write <code>@Preview()</code>, you're creating a constant instance of the <code>Preview</code> class. The Flutter tooling analyzes your code at compile time, finds these annotations, and registers the associated functions as preview targets. The annotation itself carries all the configuration data (theme, size, brightness, etc.) that the previewer needs to render your widget correctly.</p>
<p>Here's a simplified view of how it's structured:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">base</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Preview</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Preview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> group </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Default'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> name</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Size</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> size</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">double</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> textScaleFactor</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">WidgetWrapper</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> wrapper</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">PreviewTheme</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> theme</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Brightness</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> brightness</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">PreviewLocalizations</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> localizations</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> group</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> name</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Size</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> size</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">double</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> textScaleFactor</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">WidgetWrapper</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> wrapper</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">PreviewTheme</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> theme</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Brightness</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> brightness</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">PreviewLocalizations</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> localizations</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Converts this Preview into a mutable builder</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">PreviewBuilder</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">toBuilder</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">PreviewBuilder</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">_fromPreview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Hook for runtime modifications</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Preview</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">transform</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>Here’s what the "restriction" actually is; in Dart, annotation arguments (anything inside <code>@Preview(...)</code>) must be <strong>compile-time constants</strong>. That means callback parameters like <code>theme</code> or <code>wrapper</code> can only be a <strong>const function tear-off</strong> (a top-level function or a <code>static</code> method). You can’t pass an inline closure like <code>(child) =&gt; ...</code> or an instance method like <code>someObject.wrap</code>, because those aren’t compile-time constants.</p>
<p>This also has been mentioned in the <a href="https://github.com/flutter/flutter/blob/45896dd21bbc4883d662fc093b9036815a1b8613/packages/flutter/lib/src/widget_previews/widget_previews.dart#L150-L154" target="_blank" rel="noopener noreferrer" class="">source code documentation in Flutter repository</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-use">How to Use?<a href="https://dcm.dev/blog/2025/12/15/flutter-widget-previewer/#how-to-use" class="hash-link" aria-label="Direct link to How to Use?" title="Direct link to How to Use?" translate="no">​</a></h3>
<p>Ensure you import the previewer’s package:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/widget_previews.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>For example, let’s preview a simple Text widget by defining a top-level function:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/material.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/widget_previews.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@Preview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'My Sample Text'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">mySampleText</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Hello, World!'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>In this snippet, we create a function <code>mySampleText</code> that returns a Text widget, and we annotate it with <code>@Preview</code> (naming it "My Sample Text"). The moment you save this file, the Previewer will pick it up.</p>
<p>In your preview panel (or browser), you should now see a card or frame showing “My Sample Text” rendered as Hello, World!.</p>
<p><img decoding="async" loading="lazy" alt="Flutter Widget Preview Tab " src="https://dcm.dev/assets/images/simple-widget-previewer-a6e0f56f90215c2708d1dac440d0f260.webp" width="2838" height="1128" class="img_ev3q"></p>
<p>By default, previews are grouped by file (the Previewer filters to show previews from your currently open file in the IDE). You can turn off filtering to see all previews across the project if needed.</p>
<video width="100%" controls="" autoplay="" loop="" playsinline=""><source src="/video/previewer.mp4"></video>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="previewer-controls">Previewer Controls<a href="https://dcm.dev/blog/2025/12/15/flutter-widget-previewer/#previewer-controls" class="hash-link" aria-label="Direct link to Previewer Controls" title="Direct link to Previewer Controls" translate="no">​</a></h3>
<p>Let’s take a closer look at the controls available on a preview card. For any given widget preview, you’ll typically see five round icon buttons:</p>
<ul>
<li class=""><strong>Zoom In/Out</strong> to magnify or shrink the widget’s view (useful if your widget is small or if you want to inspect details)</li>
<li class=""><strong>Reset Zoom</strong> returns to default scale</li>
<li class=""><strong>Toggle Light/Dark Mode</strong> instantly switch the preview between a light theme and dark theme. This is great for checking theming and contrast.</li>
<li class=""><strong>Hot Restart (preview)</strong> restarts that individual widget’s preview. This applies changes like new state or static initializers without needing to restart the whole preview environment.</li>
<li class="">(In the overall preview window, there’s also a global restart button to rebuild everything, useful if something goes awry with state)</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Previewer Controls" src="https://dcm.dev/assets/images/previewer-controls-c20ca85acf450b1b551b0f1338aeec3e.webp" width="1906" height="734" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="customizing-previews">Customizing Previews<a href="https://dcm.dev/blog/2025/12/15/flutter-widget-previewer/#customizing-previews" class="hash-link" aria-label="Direct link to Customizing Previews" title="Direct link to Customizing Previews" translate="no">​</a></h2>
<p>The <code>@Preview</code> annotation isn’t one-size-fits-all. It comes with several parameters to tailor the preview to your needs.</p>
<p>Here are some of the most useful customization options:</p>
<ul>
<li class="">
<p><code>name</code>: A label for the preview.
This appears as the title above the preview frame (e.g. “My Sample Text” in our earlier example).</p>
</li>
<li class="">
<p><code>size</code>: Allows you to specify width/height constraints for the previewed widget (using a Size object).
This is incredibly handy to simulate different screen sizes or container sizes.
For example, <code>@Preview(size: Size(375, 812))</code> might show how a widget looks on an iPhone-sized canvas. If your widget naturally expands to fill its parent, giving it a fixed size in preview ensures it doesn’t just stretch infinitely.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token metadata function" style="color:#87aff4">@Preview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'iPhone SE Sized'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  size</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Size</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">375</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">667</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// 👈 Constraints the canvas</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">mobileView</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyResponsiveWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
</li>
<li class="">
<p><code>brightness</code>: Sets the initial theme brightness (light or dark) for the preview.
You can use <code>Brightness.light</code> or <code>Brightness.dark</code>. This saves you from toggling every time, if you want a specific theme by default.</p>
</li>
<li class="">
<p><code>theme</code>: You can provide a custom <code>PreviewThemeData</code> via a function here, which lets you define full <code>Material</code> or <code>Cupertino</code> theme settings for the preview.
This is advanced usage, but essentially you could make the preview use your app's <code>ThemeData</code> by supplying a function that returns <code>PreviewThemeData(materialLight: myTheme, materialDark: myThemeDark)</code>.</p>
<p>The <a href="https://github.com/flutter/flutter/blob/45896dd21bbc4883d662fc093b9036815a1b8613/packages/flutter/lib/src/widget_previews/widget_previews.dart#L404" target="_blank" rel="noopener noreferrer" class=""><code>PreviewThemeData</code> class</a> is designed to hold separate theme configurations for both Material and Cupertino design systems, each with light and dark variants:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">base</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">PreviewThemeData</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">PreviewThemeData</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">materialLight</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">materialDark</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">cupertinoLight</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">cupertinoDark</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ThemeData</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> materialLight</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ThemeData</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> materialDark</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CupertinoThemeData</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> cupertinoLight</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CupertinoThemeData</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> cupertinoDark</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Automatically selects the right theme based on brightness</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">ThemeData</span><span class="token operator" style="color:#00bff9">?</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CupertinoThemeData</span><span class="token operator" style="color:#00bff9">?</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">themeForBrightness</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Brightness</span><span class="token plain"> brightness</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">brightness </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Brightness</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">light</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">materialLight</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> cupertinoLight</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">materialDark</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> cupertinoDark</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>This design makes theme switching seamless, the previewer calls <code>themeForBrightness()</code> when you toggle light/dark mode.</p>
</li>
<li class="">
<p><code>wrapper</code>: Perhaps one of the most powerful options. This lets you wrap the previewed widget in another widget.
For instance, if your widget relies on an inherited widget (like a theme or localization provided above), you can supply a <code>wrapper: (child) =&gt; MyAppShell(child: child)</code> to ensure the preview is wrapped with necessary context.
This way, even complex widgets that expect certain ancestors can be previewed.</p>
<p>The wrapper system is particularly elegant. The <a href="https://github.com/flutter/flutter/blob/45896dd21bbc4883d662fc093b9036815a1b8613/packages/flutter/lib/src/widget_previews/widget_previews.dart#L270" target="_blank" rel="noopener noreferrer" class=""><code>PreviewBuilder</code> class</a> includes an <code>addWrapper()</code> method that composes multiple wrappers together:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">PreviewBuilder</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> group</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> name</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Size</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> size</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">double</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> textScaleFactor</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">WidgetWrapper</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> wrapper</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">PreviewTheme</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> theme</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Brightness</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> brightness</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">PreviewLocalizations</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> localizations</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Composes wrappers: new wrapper wraps the existing one</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">addWrapper</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">WidgetWrapper</span><span class="token plain"> newWrapper</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> existingWrapper </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> wrapper</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">existingWrapper </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token comment" style="color:#999999">// Nest them: newWrapper( existingWrapper( widget ) )</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      wrapper </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> widget</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">newWrapper</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token function" style="color:#87aff4">existingWrapper</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">widget</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      wrapper </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> newWrapper</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Preview</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Preview</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">_required</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      group</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> group </span><span class="token operator" style="color:#00bff9">?</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Default'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> name</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      size</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> size</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      textScaleFactor</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> textScaleFactor</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      wrapper</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> wrapper</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      theme</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> theme</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      brightness</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> brightness</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      localizations</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> localizations</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>If you call <code>addWrapper()</code> multiple times, each new wrapper wraps the previous one, creating a nested widget tree. This composition pattern is what enables the <code>transform()</code> method to dynamically build complex preview configurations at runtime.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token metadata function" style="color:#87aff4">@Preview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Input in Context'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  wrapper</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> appWrapper</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// 👈 public, allowed in annotation</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">inputPreview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyTextField</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">appWrapper</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Scaffold</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    body</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Padding</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      padding</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">EdgeInsets</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">16</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
</li>
<li class="">
<p><code>textScaleFactor</code>: Sets the text scale (font size scale) for the preview.
Use this to simulate accessibility settings like large text. E.g. <code>textScaleFactor: 2.0</code> will roughly emulate the system being set to 200% font size</p>
</li>
<li class="">
<p><code>group</code>: A string used to group related previews in the UI.
If you have multiple previews that logically belong together (say, several states of the same widget), giving them the same group name will organize them under a collapsible heading in the previewer.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token metadata function" style="color:#87aff4">@Preview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Normal'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> group</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Inputs'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">inputNormal</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextField</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@Preview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Error'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> group</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Inputs'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">inputError</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextField</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">decoration</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">InputDecoration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">errorText</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Fail'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
</li>
</ul>
<p>Using these parameters, you can cover a wide range of scenarios.</p>
<p>Here's a practical example showing an input field tested across different sizes and text scales:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/material.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/widget_previews.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">PreviewThemeData</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">inputPreviewTheme</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">PreviewThemeData</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  materialLight</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ThemeData</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    brightness</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Brightness</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">light</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    useMaterial3</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    colorSchemeSeed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">blue</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  materialDark</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ThemeData</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    brightness</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Brightness</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">dark</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    useMaterial3</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    colorSchemeSeed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">deepPurple</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@Preview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Normal - Light'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  group</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Input Field Variations'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  brightness</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Brightness</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">light</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  theme</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> inputPreviewTheme</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  textScaleFactor</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1.0</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">inputFieldNormalLight</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextField</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    decoration</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">InputDecoration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      border</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">OutlineInputBorder</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      labelText</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Enter text'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@Preview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Normal - Dark'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  group</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Input Field Variations'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  brightness</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Brightness</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">dark</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  theme</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> inputPreviewTheme</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  textScaleFactor</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1.0</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">inputFieldNormalDark</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextField</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    decoration</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">InputDecoration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      border</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">OutlineInputBorder</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      labelText</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Enter text'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@Preview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Large Text - Light'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  group</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Input Field Variations'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  brightness</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Brightness</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">light</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  theme</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> inputPreviewTheme</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  textScaleFactor</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1.5</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">inputFieldLargeTextLight</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextField</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    decoration</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">InputDecoration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      border</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">OutlineInputBorder</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      labelText</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Enter text'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@Preview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Large Text - Dark'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  group</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Input Field Variations'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  brightness</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Brightness</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">dark</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  theme</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> inputPreviewTheme</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  textScaleFactor</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1.5</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">inputFieldLargeTextDark</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextField</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    decoration</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">InputDecoration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      border</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">OutlineInputBorder</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      labelText</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Enter text'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>All four variations appear grouped together. You can compare them side-by-side without manually changing settings between observations. This is the opposite of navigating through your app manually.</p>
<p><img decoding="async" loading="lazy" alt="Group In Previewer" src="https://dcm.dev/assets/images/group-preview-949334689b3541878845072b0592fd80.webp" width="2958" height="1508" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-wrapper-parameter-crucial-for-injecting-state-and-context">The Wrapper Parameter (Crucial for Injecting State and Context)<a href="https://dcm.dev/blog/2025/12/15/flutter-widget-previewer/#the-wrapper-parameter-crucial-for-injecting-state-and-context" class="hash-link" aria-label="Direct link to The Wrapper Parameter (Crucial for Injecting State and Context)" title="Direct link to The Wrapper Parameter (Crucial for Injecting State and Context)" translate="no">​</a></h3>
<p>Most real-world widgets depend on context—theme data, inherited state, providers, localization. This is where the wrapper parameter becomes essential:</p>
<p>Without a proper context, many widgets simply won't render correctly. The <code>wrapper</code> parameter lets you inject your widget into a complete widget tree:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/material.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/widget_previews.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@Preview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Input in Form Context'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  wrapper</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> formContextWrapper</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">inputInFormPreview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextField</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    decoration</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">InputDecoration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      border</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">OutlineInputBorder</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      labelText</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Username'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      helperText</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Enter your username'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// Wrapper: no MaterialApp, just form-like context around the field.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">formContextWrapper</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Scaffold</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    appBar</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AppBar</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">title</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Form Example'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    body</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SingleChildScrollView</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Padding</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        padding</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">EdgeInsets</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">16</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>Now your input field renders with proper <code>Material</code> context, <code>AppBar</code>, <code>Scaffold</code>, and padding, everything you need to see how it actually looks in your app, but without navigating through your app.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="multiple-previews-reveal-hidden-edge-cases">Multiple Previews Reveal Hidden Edge Cases<a href="https://dcm.dev/blog/2025/12/15/flutter-widget-previewer/#multiple-previews-reveal-hidden-edge-cases" class="hash-link" aria-label="Direct link to Multiple Previews Reveal Hidden Edge Cases" title="Direct link to Multiple Previews Reveal Hidden Edge Cases" translate="no">​</a></h3>
<p>Here's a powerful pattern: create multiple preview configurations for different widget states. This is where Widget Previewer reveals bugs that manual testing might miss:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/material.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/widget_previews.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@Preview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Empty State'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> group</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Input States'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> wrapper</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> inputStateWrapper</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">inputEmptyStatePreview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextField</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    decoration</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">InputDecoration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      border</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">OutlineInputBorder</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      labelText</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Username'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@Preview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'With Value'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> group</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Input States'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> wrapper</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> inputStateWrapper</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">inputWithValuePreview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Simple controller just for the preview.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> controller </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextEditingController</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">text</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'dcm.dev'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextField</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    controller</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> controller</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    decoration</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">InputDecoration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      border</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">OutlineInputBorder</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      labelText</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Username'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@Preview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Error State'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> group</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Input States'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> wrapper</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> inputStateWrapper</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">inputErrorStatePreview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextField</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    decoration</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">InputDecoration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      border</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">OutlineInputBorder</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      labelText</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Username'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      errorText</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Required'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@Preview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Disabled State'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  group</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Input States'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  wrapper</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> inputStateWrapper</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">inputDisabledStatePreview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextField</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    enabled</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    decoration</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">InputDecoration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      border</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">OutlineInputBorder</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      labelText</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Username'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// Small neutral wrapper: keeps things compact and centered.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">inputStateWrapper</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Center</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Padding</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      padding</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">EdgeInsets</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">16</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ConstrainedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        constraints</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BoxConstraints</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">maxWidth</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">320</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>This highlights a limitation: "a single preview function can't return different widgets for each preview".</p>
<p><img decoding="async" loading="lazy" alt="Group In Previewer" src="https://dcm.dev/assets/images/multi-preview-2461ba72883a8447db71d94269c730cc.webp" width="3174" height="1494" class="img_ev3q"></p>
<p>This is where <code>@MultiPreview</code> becomes essential.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="custom-preview-annotations-for-dry-code">Custom Preview Annotations for DRY Code<a href="https://dcm.dev/blog/2025/12/15/flutter-widget-previewer/#custom-preview-annotations-for-dry-code" class="hash-link" aria-label="Direct link to Custom Preview Annotations for DRY Code" title="Direct link to Custom Preview Annotations for DRY Code" translate="no">​</a></h3>
<p>Flutter 3.38 made the <code>Preview</code> class extendable. This lets you create custom preview annotations that eliminate boilerplate:</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="understanding-multipreview-and-transform">Understanding <code>MultiPreview</code> and <code>transform()</code><a href="https://dcm.dev/blog/2025/12/15/flutter-widget-previewer/#understanding-multipreview-and-transform" class="hash-link" aria-label="Direct link to understanding-multipreview-and-transform" title="Direct link to understanding-multipreview-and-transform" translate="no">​</a></h4>
<p>The <a href="https://github.com/flutter/flutter/blob/45896dd21bbc4883d662fc093b9036815a1b8613/packages/flutter/lib/src/widget_previews/widget_previews.dart#L250" target="_blank" rel="noopener noreferrer" class=""><code>MultiPreview</code> abstract base class</a> is designed to generate multiple <code>Preview</code> instances from a single annotation:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">abstract</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">base</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MultiPreview</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MultiPreview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Your subclass provides this: a const list of Preview configurations</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Preview</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">get</span><span class="token plain"> previews</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Runtime hook: transform each preview before it's used</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Preview</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">transform</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> previews</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">map</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">preview</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> preview</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">transform</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">toList</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>You extend it and provide a list of <code>Preview</code> objects via the <code>previews</code> getter. The real magic happens in the <a href="https://github.com/flutter/flutter/blob/45896dd21bbc4883d662fc093b9036815a1b8613/packages/flutter/lib/src/widget_previews/widget_previews.dart#L266" target="_blank" rel="noopener noreferrer" class=""><code>transform()</code> method</a>. While the annotation itself must be constant, <code>transform()</code> runs at runtime, giving you the ability to modify previews programmatically:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyCustomPreview</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MultiPreview</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyCustomPreview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">baseName</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> baseName</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Preview</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">get</span><span class="token plain"> previews </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Preview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">brightness</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Brightness</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">light</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Preview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">brightness</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Brightness</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">dark</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Preview</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">transform</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> basePreviews </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">transform</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> basePreviews</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">asMap</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">entries</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">map</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">entry</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> index </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> entry</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> preview </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> entry</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token comment" style="color:#999999">// Convert to mutable builder</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> builder </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> preview</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">toBuilder</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token comment" style="color:#999999">// Modify at runtime (not possible in const context)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      builder</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">name </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'</span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">$</span><span class="token string-literal interpolation expression">baseName</span><span class="token string-literal string" style="color:#e1ffe4"> - </span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">${</span><span class="token string-literal interpolation expression">index </span><span class="token string-literal interpolation expression operator" style="color:#00bff9">==</span><span class="token string-literal interpolation expression"> </span><span class="token string-literal interpolation expression number" style="color:#8dec95">0</span><span class="token string-literal interpolation expression"> </span><span class="token string-literal interpolation expression operator" style="color:#00bff9">?</span><span class="token string-literal interpolation expression"> </span><span class="token string-literal interpolation expression string-literal string" style="color:#e1ffe4">"Light"</span><span class="token string-literal interpolation expression"> </span><span class="token string-literal interpolation expression punctuation" style="color:#a7dbf7">:</span><span class="token string-literal interpolation expression"> </span><span class="token string-literal interpolation expression string-literal string" style="color:#e1ffe4">"Dark"</span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">}</span><span class="token string-literal string" style="color:#e1ffe4">'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      builder</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">group </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Custom Group'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      builder</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">addWrapper</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">child</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Padding</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        padding</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">EdgeInsets</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">16</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token comment" style="color:#999999">// Build the modified preview</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> builder</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">toList</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>Each <code>Preview</code> has a <a href="https://github.com/flutter/flutter/blob/45896dd21bbc4883d662fc093b9036815a1b8613/packages/flutter/lib/src/widget_previews/widget_previews.dart#L192" target="_blank" rel="noopener noreferrer" class=""><code>toBuilder()</code> method</a> that converts it into a mutable <code>PreviewBuilder</code>, where you can change any property, add wrappers, or even compose complex configurations that wouldn't be possible in a <code>const</code> context.</p>
<p>This two-phase approach, constant annotation followed by runtime transformation, is what makes custom preview annotations so powerful. You define the structure at compile time, then enhance it with dynamic behavior at runtime.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/material.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/widget_previews.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">/// Shared theme for light/dark previews.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">/// Must be a public top-level function when used in const Preview.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">PreviewThemeData</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">brightnessPreviewTheme</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">PreviewThemeData</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  materialLight</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ThemeData</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    brightness</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Brightness</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">light</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    useMaterial3</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    colorSchemeSeed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">blue</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  materialDark</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ThemeData</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    brightness</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Brightness</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">dark</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    useMaterial3</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    colorSchemeSeed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">deepPurple</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">/// A custom preview that automatically creates light and dark mode previews.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BrightnessPreview</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MultiPreview</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BrightnessPreview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> name</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Preview</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">get</span><span class="token plain"> previews </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Preview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      brightness</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Brightness</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">light</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      theme</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> brightnessPreviewTheme</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      group</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Theme'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Preview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      brightness</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Brightness</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">dark</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      theme</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> brightnessPreviewTheme</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      group</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Theme'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Preview</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">transform</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">base</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">transform</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> lightBuilder </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">base</span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">toBuilder</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">name </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'</span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">$</span><span class="token string-literal interpolation expression">name</span><span class="token string-literal string" style="color:#e1ffe4"> - Light'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> darkBuilder </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">base</span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">toBuilder</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">name </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'</span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">$</span><span class="token string-literal interpolation expression">name</span><span class="token string-literal string" style="color:#e1ffe4"> - Dark'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain">lightBuilder</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> darkBuilder</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// Usage – no repetition needed.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@BrightnessPreview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Input Field'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">inputFieldPreview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Builder</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    builder</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> scheme </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Theme</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">of</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">colorScheme</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Center</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ConstrainedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          constraints</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BoxConstraints</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">maxWidth</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">320</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextField</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            decoration</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">InputDecoration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              filled</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              fillColor</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> scheme</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">surface</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              border</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">OutlineInputBorder</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              labelText</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Enter text'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>Instead of writing light/dark previews manually every time, you define the pattern once and reuse it everywhere. For teams building design systems, this is game-changing.</p>
<p><img decoding="async" loading="lazy" alt="Preview DRY Concept" src="https://dcm.dev/assets/images/brightness-preview-e1aeb195283337cb5ff41b4450c026d7.webp" width="3120" height="872" class="img_ev3q"></p>
<p>And here's the advanced move: <code>Preview</code> has a <code>transform()</code> method that lets you modify previews at runtime, enabling things impossible in a <code>const</code> context:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/material.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/widget_previews.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AccessibilityPreview</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MultiPreview</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AccessibilityPreview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Preview</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">get</span><span class="token plain"> previews </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token class-name" style="color:#7fdbca">Preview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Normal'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token class-name" style="color:#7fdbca">Preview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Large Text'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> textScaleFactor</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1.5</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token class-name" style="color:#7fdbca">Preview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Extra Large Text'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> textScaleFactor</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2.0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Preview</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">transform</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> previews </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">transform</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> previews</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">map</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">preview</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> builder </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> preview</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">toBuilder</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      builder</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">group </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Accessibility'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> builder</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">toList</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@AccessibilityPreview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">accessibleInputPreview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextField</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    decoration</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">InputDecoration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      border</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">OutlineInputBorder</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      labelText</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Username'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-design-system-input-component">A Design System Input Component<a href="https://dcm.dev/blog/2025/12/15/flutter-widget-previewer/#a-design-system-input-component" class="hash-link" aria-label="Direct link to A Design System Input Component" title="Direct link to A Design System Input Component" translate="no">​</a></h3>
<p>Let's tie this together. Imagine you're maintaining a design system with a custom input component. This pattern keeps every state of the component previewable in one place so they stay in sync as you evolve the design.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/material.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/widget_previews.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DesignSystemInput</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> label</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> errorText</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> enabled</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> helperText</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DesignSystemInput</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">label</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">errorText</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">enabled </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">helperText</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextField</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      enabled</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> enabled</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      decoration</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">InputDecoration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        border</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">OutlineInputBorder</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        labelText</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> label</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        errorText</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> errorText</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        helperText</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> helperText</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">/// Shared theme for all previews in this MultiPreview.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">/// NOTE: must be a top-level *public* function because it's used in annotations.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">PreviewThemeData</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">designSystemPreviewTheme</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">PreviewThemeData</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  materialLight</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ThemeData</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    brightness</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Brightness</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">light</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    useMaterial3</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    colorSchemeSeed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">blue</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  materialDark</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ThemeData</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    brightness</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Brightness</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">dark</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    useMaterial3</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    colorSchemeSeed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">deepPurple</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// Define custom preview annotation for consistency</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DesignSystemInputPreview</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MultiPreview</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DesignSystemInputPreview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Preview</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">get</span><span class="token plain"> previews </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Preview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Default - Light'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      brightness</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Brightness</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">light</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      group</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'States'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      theme</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> designSystemPreviewTheme</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Preview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Default - Dark'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      brightness</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Brightness</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">dark</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      group</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'States'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      theme</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> designSystemPreviewTheme</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Preview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'With Helper - Light'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      brightness</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Brightness</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">light</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      group</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'States'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      theme</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> designSystemPreviewTheme</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Preview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'With Helper - Dark'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      brightness</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Brightness</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">dark</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      group</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'States'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      theme</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> designSystemPreviewTheme</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Preview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Error - Light'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      brightness</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Brightness</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">light</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      group</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'States'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      theme</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> designSystemPreviewTheme</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Preview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Error - Dark'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      brightness</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Brightness</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">dark</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      group</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'States'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      theme</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> designSystemPreviewTheme</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Preview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Disabled - Light'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      brightness</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Brightness</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">light</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      group</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'States'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      theme</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> designSystemPreviewTheme</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Preview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Disabled - Dark'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      brightness</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Brightness</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">dark</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      group</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'States'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      theme</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> designSystemPreviewTheme</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Preview</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">transform</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> previews </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">transform</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> previews</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">map</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">preview</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> builder </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> preview</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">toBuilder</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> name </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> preview</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">name </span><span class="token operator" style="color:#00bff9">?</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">''</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">contains</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Helper'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        builder</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">wrapper </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> _helperWrapper</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">else</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">contains</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Error'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        builder</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">wrapper </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> _errorWrapper</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">else</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">contains</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Disabled'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        builder</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">wrapper </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> _disabledWrapper</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        builder</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">wrapper </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> _defaultWrapper</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> builder</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">toList</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// Wrapper functions for different states</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_defaultWrapper</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Previewer supplies MaterialApp + theme; we just add layout.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Scaffold</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    body</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Padding</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">padding</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">EdgeInsets</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">16</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_helperWrapper</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Scaffold</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    body</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Padding</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      padding</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">EdgeInsets</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">16</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DesignSystemInput</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        label</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Email'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        helperText</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Enter your email address'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_errorWrapper</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Scaffold</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    body</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Padding</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      padding</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">EdgeInsets</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">16</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DesignSystemInput</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        label</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Email'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        errorText</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Invalid email format'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_disabledWrapper</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Scaffold</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    body</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Padding</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      padding</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">EdgeInsets</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">16</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DesignSystemInput</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">label</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Email'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> enabled</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// The preview</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token metadata function" style="color:#87aff4">@DesignSystemInputPreview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">designSystemInputPreview</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Used by "Default" variants; other states override via wrapper.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DesignSystemInput</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">label</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Email Address'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>Now, whenever you modify the <code>DesignSystemInput</code> component, all eight variations render instantly in the previewer. You see every combination of state and theme without manually navigating your app.</p>
<video width="100%" controls="" autoplay="" loop="" playsinline=""><source src="/video/previewer.mp4"></video>
<p>You change the widget once and instantly see every variant in light/dark and across error/helper/disabled states.</p>
<p>This is what eliminates the "navigation friction" problem. You're not testing components anymore; you're validating them systematically.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="my-rules-for-widget-previewer-success">My Rules for Widget Previewer Success<a href="https://dcm.dev/blog/2025/12/15/flutter-widget-previewer/#my-rules-for-widget-previewer-success" class="hash-link" aria-label="Direct link to My Rules for Widget Previewer Success" title="Direct link to My Rules for Widget Previewer Success" translate="no">​</a></h2>
<p>Based on real-world usage (and the constraints baked into <code>widget_previews.dart</code>: static/public callbacks for const annotations, default group of <code>"Default"</code>, wrappers composing at runtime), here are the rules that will make your life easier:</p>
<p>✅ DO preview any widget that doesn't require constructor arguments. Top-level functions, static methods, and parameterless constructors are perfect.</p>
<p>✅ DO use the wrapper parameter to inject <code>MaterialApp</code>, <code>Scaffold</code>, theme context, or any dependency your widget needs. Keep wrapper callbacks public/static so they can be referenced from const annotations.</p>
<p>✅ DO create custom preview annotations (<code>extends Preview</code> or <code>extends MultiPreview</code>) when you have repeating preview patterns. This keeps your codebase DRY and maintainable.</p>
<p>✅ DO use group to organize related previews. This makes the previewer UI manageable as your component library grows.</p>
<p>✅ DO test accessibility variations with <code>textScaleFactor</code>. This catches responsive design issues early.</p>
<p>⛔️ DON'T expect to preview widgets with required constructor arguments without wrapper setup.</p>
<p>⛔️ DON'T use relative asset paths. Always use package-based paths like <code>'packages/my_package/assets/image.png'</code>.​</p>
<p>⛔️ DON'T rely on <code>dart:io</code> or <code>dart:ffi</code> APIs in previewed widgets, they won't work in the web-based previewer. Use conditional imports if your widget has platform-specific code.​</p>
<p>⛔️ DON'T preview widgets tightly coupled to native platform features (camera, sensors, file system). These simply won't render in the web environment.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="from-preview-to-maintainable-widgets">From Preview to Maintainable Widgets<a href="https://dcm.dev/blog/2025/12/15/flutter-widget-previewer/#from-preview-to-maintainable-widgets" class="hash-link" aria-label="Direct link to From Preview to Maintainable Widgets" title="Direct link to From Preview to Maintainable Widgets" translate="no">​</a></h2>
<p>Widget Previewer solves the <em>visibility</em> problem you see every state instantly. But as your component library grows, a new problem emerges: <strong>widget maintainability and quality</strong>.</p>
<p>You end up with 20 similar buttons, 15 card variants, and 8 input fields that are almost identical. Some widgets become 300-line monsters with cyclomatic complexity through the roof. Others get copy-pasted across files because it's faster than refactoring. Your design system fragments.</p>
<p>This is where <a href="https://dcm.dev/docs/cli/analysis/analyze-widgets/" target="_blank" rel="noopener noreferrer" class="">DCM's <code>analyze-widgets</code></a> command becomes essential. It's a static analysis tool specifically built for Flutter's widget layer that answers questions you can't answer with previews alone:</p>
<ul>
<li class=""><strong>Is this widget too complex?</strong> DCM calculates quality scores based on code metrics (cyclomatic complexity, lines of code, nesting depth, etc.), flagging widgets that have grown too large or tangled.
<img decoding="async" loading="lazy" alt="Analyze report" src="https://dcm.dev/assets/images/widgets-console-report-f31ef29fd2de3d66e50003e86c13814c.webp" width="2100" height="1710" class="img_ev3q"></li>
<li class=""><strong>Where is this widget used?</strong> It reports widget usage across your codebase, helping you understand the blast radius of changes.
<img decoding="async" loading="lazy" alt="Used Widget" src="https://dcm.dev/assets/images/widgets-single-file-html-report-f61adc3e9ff60f0bf7cbe6e09d4af574.webp" width="2512" height="1702" class="img_ev3q"></li>
<li class=""><strong>Do I have duplicate widgets?</strong> With <code>--show-similarity</code>, it detects near-identical widget subtrees, those copy/paste jobs that should've been extracted into shared components (perhaps)
<img decoding="async" loading="lazy" alt="Similarity" src="https://dcm.dev/assets/images/similarity-report-example-35a5a1da215eaa9eb548cf98f6a3d915.webp" width="1820" height="1262" class="img_ev3q"></li>
</ul>
<p>Think of it as a health check for your widget architecture. Previews let you <em>iterate fast</em>. DCM lets you <em>iterate sustainably</em>.</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999"># Basic widget quality report</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token builtin class-name" style="color:#7fdbca">dcm</span><span class="token plain"> analyze-widgets </span><span class="token function" style="color:#87aff4">lib</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999"># Find similar UI that should be refactored (disabled by default)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token builtin class-name" style="color:#7fdbca">dcm</span><span class="token plain"> analyze-widgets </span><span class="token function" style="color:#87aff4">lib</span><span class="token plain"> --show-similarity --reporter=html --open</span><br></span></code></pre></div></div>
<p>The similarity detection is particularly powerful for design systems. It highlights widgets with matching build method structures, complete with visual diffs of the duplicated subtrees. This surfaces refactoring opportunities you'd otherwise miss.</p>
<blockquote>
<p>Watch our <a href="https://www.youtube.com/watch?v=TSJx3gQmomc" target="_blank" rel="noopener noreferrer" class="">DCM Analyze Widget</a> video to learn more!</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-widget-previewer-becomes-your-competitive-advantage">When Widget Previewer Becomes Your Competitive Advantage<a href="https://dcm.dev/blog/2025/12/15/flutter-widget-previewer/#when-widget-previewer-becomes-your-competitive-advantage" class="hash-link" aria-label="Direct link to When Widget Previewer Becomes Your Competitive Advantage" title="Direct link to When Widget Previewer Becomes Your Competitive Advantage" translate="no">​</a></h2>
<p>If you're building a design system or component library, Widget Previewer isn't just a nice-to-have—it's essential infrastructure.</p>
<p>Without it, your design system exists as abstract documentation and scattered code examples. With it, every component is living, interactive documentation. Designers can see all variations. Other engineers can understand how to use components by seeing them in action. Edge cases reveal themselves.</p>
<p>This is what Storybook provides for web. This is what Jetpack Compose has built-in. Now Flutter engineers have it too.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://dcm.dev/blog/2025/12/15/flutter-widget-previewer/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Flutter's Hot Reload already changed the game. It made development fast. Widget Previewer completes the picture. It makes development focused.</p>
<p>Instead of compile-navigate-observe-repeat, you get instant isolation and instant feedback. Your component becomes the center of attention, not a small piece buried in your app's navigation hierarchy. And more importantly, can simply create your design systems decoupled from your business logic where it can run independently.</p>
<p>Your component library will be better. Your design system will be stronger. And your iteration cycle will finally feel modern.</p>
<p>Happy previewing.</p>
<div class="formWrapper_FeQU"><p class="formTitle_o9oT">Enjoying this article?</p><p>Subscribe to get our latest articles and product updates by email.</p><form class="footerForm_u4Zn"><input class="trialInput_rT6u" type="email" placeholder="Email address" name="blogEmail"><button type="submit" class="button button--primary button--sm formButton_cuTv">Subscribe</button></form></div>]]></content>
        <author>
            <name>Majid Hajian</name>
            <uri>https://dcm.dev</uri>
        </author>
        <category label="blog" term="blog"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[What’s new in DCM 1.33.0]]></title>
        <id>https://dcm.dev/blog/2025/11/20/whats-new-in-dcm-1-33-0/</id>
        <link href="https://dcm.dev/blog/2025/11/20/whats-new-in-dcm-1-33-0/"/>
        <updated>2025-11-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[DCM 1.33.0 includes 8 new rules (5 for Dot shorthands), Dot shorthands support for all existing rules and features, improved detection of unused code in various new cases (unassigned fields, setters, code that is used only in generated files and so on), automatic Dashboards project creation based on the monorepo structure, redesigned Dashboards page with support for tagging projects, and more!]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="Cover" src="https://dcm.dev/assets/images/2025-11-20-cover-ba508f049c73e01973c4d8269febbaea.jpg" width="1400" height="736" class="img_ev3q"></p>
<p>With a little delay, we are excited to announce the release of DCM 1.33.0!</p>
<p>This release includes 8 new rules (5 for Dot shorthands), Dot shorthands support for all existing rules and features, improved detection of unused code in various new cases (unassigned fields, setters, code that is used only in generated files and so on), automatic Dashboards project creation based on the monorepo structure, redesigned Dashboards page with support for tagging projects, and more!</p>
<p>Let’s go through the highlights of this release (and the full list of changes is <a class="" href="https://dcm.dev/changelog/#1.33.0">in our changelog</a>)!</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dashboard-improvements">Dashboard Improvements<a href="https://dcm.dev/blog/2025/11/20/whats-new-in-dcm-1-33-0/#dashboard-improvements" class="hash-link" aria-label="Direct link to Dashboard Improvements" title="Direct link to Dashboard Improvements" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-project-view-and-tags">New Project View and Tags<a href="https://dcm.dev/blog/2025/11/20/whats-new-in-dcm-1-33-0/#new-project-view-and-tags" class="hash-link" aria-label="Direct link to New Project View and Tags" title="Direct link to New Project View and Tags" translate="no">​</a></h3>
<p>To help you group projects by your own rules, Dashboards now support custom tags in the Project List:</p>
<p><img decoding="async" loading="lazy" alt="Add Tag" src="https://dcm.dev/assets/images/add-tag-ee26ea895170d53710452ad2f3c9c9ba.webp" width="2560" height="1000" class="img_ev3q"></p>
<p>You can also select a tag (or several tags) on the Projects Overview tab and get a summary for a particular tag (or several tags):</p>
<p><img decoding="async" loading="lazy" alt="Issues Overview" src="https://dcm.dev/assets/images/tags-filter-e9bdea620c31607b6ba99f4cce1a9031.webp" width="2560" height="1052" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="external-users">External Users<a href="https://dcm.dev/blog/2025/11/20/whats-new-in-dcm-1-33-0/#external-users" class="hash-link" aria-label="Direct link to External Users" title="Direct link to External Users" translate="no">​</a></h3>
<p>Inviting users to the DCM Teams Console now also supports external users (users with an email address that doesn't match the account's domain name).</p>
<p><img decoding="async" loading="lazy" alt="Add External User Modal" src="https://dcm.dev/assets/images/add-external-user-modal-197291f4d80c3951c0f44f78370ab072.webp" width="2048" height="1542" class="img_ev3q"></p>
<p>Such users also have a dedicated label:</p>
<p><img decoding="async" loading="lazy" alt="External User" src="https://dcm.dev/assets/images/external-user-b4db2e58fb4054771a4a6be9acac3e9e.webp" width="2560" height="1542" class="img_ev3q"></p>
<p>Note, that external users can only have the "View Selected" role. Please carefully check the external user's email before granting them access to your projects.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="automatic-projects-creation">Automatic Projects Creation<a href="https://dcm.dev/blog/2025/11/20/whats-new-in-dcm-1-33-0/#automatic-projects-creation" class="hash-link" aria-label="Direct link to Automatic Projects Creation" title="Direct link to Automatic Projects Creation" translate="no">​</a></h3>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>This feature is available to <strong>Enterprise</strong> users only.</p></div></div>
<p>You can now automatically create Dashboards projects from your monorepo structure with the help of the new <code>--scaffold</code> flag.</p>
<p>Here are the required steps:</p>
<ol>
<li class="">
<p>Add a new <code>project</code> entry to the <code>dcm</code> config in every package's <code>analysis_options.yaml</code> file (this entry can be any string and will be used both as the unique project id and its name, which you can change later):</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">analysis_options.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">project</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> my_monorepo_package</span></span><br></span></code></pre></div></div>
</li>
<li class="">
<p>Add the <code>--scaffold</code> flag to your uploads (and use the <a class="" href="https://dcm.dev/docs/getting-started/for-teams/license-keys/#access-global-project-key-">Global Project Key</a> for the <code>--project</code> option).</p>
</li>
<li class="">
<p>Keep the <code>--scaffold</code> flag in every run (not just the first one).</p>
</li>
</ol>
<p>When using <code>--scaffold</code>, the tool will compare unique project ids and create missing projects. Then, it will assign uploaded data to each corresponding project.</p>
<p>If the unique id changes, it will only create a new project and <strong>never</strong> delete any existing ones.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="unused-code-detection-improvements">Unused Code Detection Improvements<a href="https://dcm.dev/blog/2025/11/20/whats-new-in-dcm-1-33-0/#unused-code-detection-improvements" class="hash-link" aria-label="Direct link to Unused Code Detection Improvements" title="Direct link to Unused Code Detection Improvements" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="unassigned-fields">Unassigned Fields<a href="https://dcm.dev/blog/2025/11/20/whats-new-in-dcm-1-33-0/#unassigned-fields" class="hash-link" aria-label="Direct link to Unassigned Fields" title="Direct link to Unassigned Fields" translate="no">​</a></h3>
<p>Now, if a public or private field is referenced, but never assigned, the tool will report such fields as unused code.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AssignmentsExample</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> inner</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">dispose</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">inner</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> value </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> inner</span><span class="token operator" style="color:#00bff9">?</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">split</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">','</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>here, even though the field is referenced (<code>print(inner)</code> and <code>inner?.split(',')</code>), it actually never receives a value making the field itself unused and all the code that references this field to always result in <code>null</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="collection-methods-and-properties">Collection Methods and Properties<a href="https://dcm.dev/blog/2025/11/20/whats-new-in-dcm-1-33-0/#collection-methods-and-properties" class="hash-link" aria-label="Direct link to Collection Methods and Properties" title="Direct link to Collection Methods and Properties" translate="no">​</a></h3>
<p>Another improvement to the unused code detection covers collection methods and statements with properties.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">WithCollection</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> directMap </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">WithCollection</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">notUsage</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    directMap</span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token string-literal string" style="color:#e1ffe4">'hello'</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'hi'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    directMap</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">length</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>here, even though, both <code>directMap['hello'] = 'hi'</code> and <code>directMap.length</code> reference the <code>directMap</code> field, both of them do not indicate the usage of that field.</p>
<p>With this release, such cases will be reported as unused code.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="asserts">Asserts<a href="https://dcm.dev/blog/2025/11/20/whats-new-in-dcm-1-33-0/#asserts" class="hash-link" aria-label="Direct link to Asserts" title="Direct link to Asserts" translate="no">​</a></h3>
<p>With this release, any code that is used only in asserts is now reported as unused.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Some</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> value</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> another</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Some</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">another</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">assert</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">another </span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">work</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>here, the only place the <code>another</code> field is used is the assert initializer.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="setters">Setters<a href="https://dcm.dev/blog/2025/11/20/whats-new-in-dcm-1-33-0/#setters" class="hash-link" aria-label="Direct link to Setters" title="Direct link to Setters" translate="no">​</a></h3>
<p>Prior to this release, setters were excluded by default even if they were never used to support cases when developers always create a pair of a getter and setter.</p>
<p>With this release we are removing this exception making the command always report unused setters.</p>
<p>If you still wish to keep unused setters in your codebase, consider adding ignore comments (e.g. <code>// ignore: unused-code</code>).</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="generated-code-moved-to-134">Generated Code (moved to 1.34)<a href="https://dcm.dev/blog/2025/11/20/whats-new-in-dcm-1-33-0/#generated-code-moved-to-134" class="hash-link" aria-label="Direct link to Generated Code (moved to 1.34)" title="Direct link to Generated Code (moved to 1.34)" translate="no">​</a></h3>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>This feature was initially added in 1.33 and removed in 1.33.1 as it had a lot of false positives. We plan to bring it back in 1.34.</p></div></div>
<p>In some cases, for example, when you declare models for your app and then generate <code>copyWith</code> and other methods via code generation, such classes can still be referenced in the generated files, but not by any of your code.</p>
<p>With this change we aim to highlight such classes in the generated files so you can quickly identify and remove them.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ide-integration">IDE Integration<a href="https://dcm.dev/blog/2025/11/20/whats-new-in-dcm-1-33-0/#ide-integration" class="hash-link" aria-label="Direct link to IDE Integration" title="Direct link to IDE Integration" translate="no">​</a></h3>
<p>With this release we are removing the IDE integration for unused code and files detection.</p>
<p>The integration had several issues (including memory leaks, not analyzing excluded files properly, not supporting all issues reported by the <code>check-unused-code</code> command and so on).</p>
<p>We plan to reintroduce this feature later in 2026 while also addressing all the known issues.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="rule-updates">Rule Updates<a href="https://dcm.dev/blog/2025/11/20/whats-new-in-dcm-1-33-0/#rule-updates" class="hash-link" aria-label="Direct link to Rule Updates" title="Direct link to Rule Updates" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dot-shorthands">Dot Shorthands<a href="https://dcm.dev/blog/2025/11/20/whats-new-in-dcm-1-33-0/#dot-shorthands" class="hash-link" aria-label="Direct link to Dot Shorthands" title="Direct link to Dot Shorthands" translate="no">​</a></h3>
<p>All lint rules (and other features) now support latest language changes (including Dot shorthands).</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="notable-changes">Notable Changes<a href="https://dcm.dev/blog/2025/11/20/whats-new-in-dcm-1-33-0/#notable-changes" class="hash-link" aria-label="Direct link to Notable Changes" title="Direct link to Notable Changes" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-unused-local-variable">avoid-unused-local-variable<a href="https://dcm.dev/blog/2025/11/20/whats-new-in-dcm-1-33-0/#avoid-unused-local-variable" class="hash-link" aria-label="Direct link to avoid-unused-local-variable" title="Direct link to avoid-unused-local-variable" translate="no">​</a></h4>
<p>Now supports the same checks as the <code>check-unused-code</code> command when it comes to collection methods and properties:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><mark class="code-warning"><span class="token plain">items</span></mark><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// LINT</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  items</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">add</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">''</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  items</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">addAll</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token string-literal string" style="color:#e1ffe4">''</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  items</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">clear</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  items</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">remove</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">''</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  items</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">removeWhere</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">element</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  items</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">retainWhere</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">element</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><mark class="code-warning"><span class="token plain">str</span></mark><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'123'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// LINT</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  str</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">length</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>here, even though the <code>items</code> list is mutated, it is never passed to any other function therefore making the variable actually unused. Same for <code>str</code>.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-unassigned-late-fields">avoid-unassigned-late-fields<a href="https://dcm.dev/blog/2025/11/20/whats-new-in-dcm-1-33-0/#avoid-unassigned-late-fields" class="hash-link" aria-label="Direct link to avoid-unassigned-late-fields" title="Direct link to avoid-unassigned-late-fields" translate="no">​</a></h4>
<p>Now only highlights private late fields (or late fields for private declarations):</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Test</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">late</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> anotherField</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">late</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> uninitializedField</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">late</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> </span><mark class="code-warning"><span class="token plain">_privateLate</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// LINT</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">method</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    anotherField </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-rules">New Rules<a href="https://dcm.dev/blog/2025/11/20/whats-new-in-dcm-1-33-0/#new-rules" class="hash-link" aria-label="Direct link to New Rules" title="Direct link to New Rules" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>All new rules for Dot shorthands are also available to the Starter plan users.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prefer-returning-shorthands"><a class="" href="https://dcm.dev/docs/rules/common/prefer-returning-shorthands/"><code>prefer-returning-shorthands</code></a><a href="https://dcm.dev/blog/2025/11/20/whats-new-in-dcm-1-33-0/#prefer-returning-shorthands" class="hash-link" aria-label="Direct link to prefer-returning-shorthands" title="Direct link to prefer-returning-shorthands" translate="no">​</a></h3>
<p>Suggests returning dot shorthands from an expression function body.</p>
<p>Function and methods declarations already have an explicit return type and in cases when that type is the same as the returned instance, the instance can be simplified to a dot shorthand without reducing readability.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// LINT: This instance type matches the return type and can be replaced with a dot shorthand.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">//  Try using the dot shorthand constructor.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">getInstance</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'val'</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// LINT: This instance type matches the return type and can be replaced with a dot shorthand.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">//  Try using the dot shorthand constructor.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">getInstance</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">named</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'val'</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// LINT: This instance type matches the return type and can be replaced with a dot shorthand.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">//  Try using the dot shorthand constructor.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">getInstance</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> flag</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    flag </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'value'</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">named</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'val'</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> value</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">named</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>To fix these issues, use dot shorthands in all highlighted places:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">getInstance</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token keyword" style="color:#00bff9">new</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'val'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">getInstance</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">named</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'val'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">getInstance</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> flag</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    flag </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token keyword" style="color:#00bff9">new</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'value'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">named</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'val'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>This rule also comes with <strong>auto-fix</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prefer-shorthands-with-static-fields"><a class="" href="https://dcm.dev/docs/rules/common/prefer-shorthands-with-static-fields/"><code>prefer-shorthands-with-static-fields</code></a><a href="https://dcm.dev/blog/2025/11/20/whats-new-in-dcm-1-33-0/#prefer-shorthands-with-static-fields" class="hash-link" aria-label="Direct link to prefer-shorthands-with-static-fields" title="Direct link to prefer-shorthands-with-static-fields" translate="no">​</a></h3>
<p>Suggests using dot shorthands with static fields.</p>
<p>When a static field type matches the type of its class, such fields can be used as dot shorthands (without an explicit class prefix).</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// LINT: Prefer dot shorthands instead of explicit class prefixes. Try removing the prefix.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">case</span><span class="token plain"> </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span></mark><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> v </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// LINT: Prefer dot shorthands instead of explicit class prefixes. Try removing the prefix.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span></mark><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    _ </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: Prefer dot shorthands instead of explicit class prefixes. Try removing the prefix.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> another </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: Prefer dot shorthands instead of explicit class prefixes. Try removing the prefix.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// LINT: Prefer dot shorthands instead of explicit class prefixes. Try removing the prefix.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">another</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> value </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span></mark><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// LINT: Prefer dot shorthands instead of explicit class prefixes. Try removing the prefix.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">getClass</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> value</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> first </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'first'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> second </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'second'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>To fix these issues, remove the class name prefix:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">case</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> v </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    _ </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> another </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">another</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> value </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">getClass</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Object</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">getObject</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>This rule also comes with <strong>auto-fix</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prefer-shorthands-with-enums"><a class="" href="https://dcm.dev/docs/rules/common/prefer-shorthands-with-enums/"><code>prefer-shorthands-with-enums</code></a><a href="https://dcm.dev/blog/2025/11/20/whats-new-in-dcm-1-33-0/#prefer-shorthands-with-enums" class="hash-link" aria-label="Direct link to prefer-shorthands-with-enums" title="Direct link to prefer-shorthands-with-enums" translate="no">​</a></h3>
<p>Suggests using dot shorthands with enums.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">MyEnum</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// LINT: Prefer dot shorthands instead of explicit enum prefixes. Try removing the enum prefix.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">case</span><span class="token plain"> </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">MyEnum</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span></mark><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> v </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// LINT: Prefer dot shorthands instead of explicit enum prefixes. Try removing the enum prefix.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">MyEnum</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span></mark><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    _ </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: Prefer dot shorthands instead of explicit enum prefixes. Try removing the enum prefix.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyEnum</span><span class="token plain"> another </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">MyEnum</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: Prefer dot shorthands instead of explicit enum prefixes. Try removing the enum prefix.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">MyEnum</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// LINT: Prefer dot shorthands instead of explicit enum prefixes. Try removing the enum prefix.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">another</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token class-name" style="color:#7fdbca">MyEnum</span><span class="token plain"> value </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">MyEnum</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span></mark><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token comment" style="color:#999999">// LINT: Prefer dot shorthands instead of explicit enum prefixes. Try removing the enum prefix.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">MyEnum</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">getEnum</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">MyEnum</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">enum</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyEnum</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"> first</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> second </span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>To fix these issues, remove the enum prefix:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">MyEnum</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">case</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> v </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    _ </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyEnum</span><span class="token plain"> another </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">another</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token class-name" style="color:#7fdbca">MyEnum</span><span class="token plain"> value </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">MyEnum</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">getEnum</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Object</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">getObject</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyEnum</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>This rule also comes with <strong>auto-fix</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-nested-shorthands"><a class="" href="https://dcm.dev/docs/rules/common/avoid-nested-shorthands/"><code>avoid-nested-shorthands</code></a><a href="https://dcm.dev/blog/2025/11/20/whats-new-in-dcm-1-33-0/#avoid-nested-shorthands" class="hash-link" aria-label="Direct link to avoid-nested-shorthands" title="Direct link to avoid-nested-shorthands" translate="no">​</a></h3>
<p>Warns when a dot shorthand invocation has an argument that is also a dot shorthand.</p>
<p>Nested dot shorthands significantly reduce readability (to a point where every instance is <code>.new(.new(...))</code>) and should be generally avoided.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: Avoid nested dot shorthands as they significantly reduce readability. Try adding explicit types.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Another</span><span class="token plain"> a </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token keyword" style="color:#00bff9">new</span><span class="token punctuation" style="color:#a7dbf7">(</span><mark class="code-warning"><span class="token number" style="color:#8dec95">.</span><span class="token keyword" style="color:#00bff9">new</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">version</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token keyword" style="color:#00bff9">new</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'val'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: Avoid nested dot shorthands as they significantly reduce readability. Try adding explicit types.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> a </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Another</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">.</span><span class="token keyword" style="color:#00bff9">new</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">version</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><mark class="code-warning"><span class="token number" style="color:#8dec95">.</span><span class="token keyword" style="color:#00bff9">new</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'val'</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> value</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Some</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> version</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Some</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">version</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Another</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Some</span><span class="token plain"> some</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Another</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">some</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prefer-shorthands-with-constructors"><a class="" href="https://dcm.dev/docs/rules/common/prefer-shorthands-with-constructors/"><code>prefer-shorthands-with-constructors</code></a><a href="https://dcm.dev/blog/2025/11/20/whats-new-in-dcm-1-33-0/#prefer-shorthands-with-constructors" class="hash-link" aria-label="Direct link to prefer-shorthands-with-constructors" title="Direct link to prefer-shorthands-with-constructors" translate="no">​</a></h3>
<p>Suggests using dot shorthand constructor invocations for the configured list of classes.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token class-name" style="color:#7fdbca">Padding</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: Prefer dot shorthands instead of explicit class instantiations.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Try using the dot shorthand constructor.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  padding</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">EdgeInsets</span></mark><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">symmetric</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    horizontal</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">horizontalPadding</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">screenWidth</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    vertical</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">12</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">BoxDecoration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">transparent</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: Prefer dot shorthands instead of explicit class instantiations.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Try using the dot shorthand constructor.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  border</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">Border</span></mark><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AppColors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">primary</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">withOpacity</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_controller</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    width</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: Prefer dot shorthands instead of explicit class instantiations.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Try using the dot shorthand constructor.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  borderRadius</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">BorderRadius</span></mark><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">circular</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">18</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>Additionally, this rule supports a config option called <code>entries</code> to configure a list of constructors that should be converted to dot shorthands.</p>
<p>For example,</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">analysis_options.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">rules</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">prefer-shorthands-with-constructors</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">entries</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> EdgeInsets</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> BorderRadius</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Radius</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Border</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> MyClass</span></span><br></span></code></pre></div></div>
<p>This rule also comes with <strong>auto-fix</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="newline-before-constructor"><a class="" href="https://dcm.dev/docs/rules/common/newline-before-constructor/"><code>newline-before-constructor</code></a><a href="https://dcm.dev/blog/2025/11/20/whats-new-in-dcm-1-33-0/#newline-before-constructor" class="hash-link" aria-label="Direct link to newline-before-constructor" title="Direct link to newline-before-constructor" translate="no">​</a></h3>
<p>Enforces a blank line before a constructor declaration.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Wrong</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Wrong</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">Wrong</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">first</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// LINT: Missing a blank line before this constructor declaration. Try adding it.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">Wrong</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">second</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// LINT: Missing a blank line before this constructor declaration. Try adding it.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>is expected to be</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Wrong</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Wrong</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Wrong</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">first</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Wrong</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">second</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>This rule also comes with <strong>auto-fix</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-always-null-parameters"><a class="" href="https://dcm.dev/docs/rules/common/avoid-always-null-parameters/"><code>avoid-always-null-parameters</code></a><a href="https://dcm.dev/blog/2025/11/20/whats-new-in-dcm-1-33-0/#avoid-always-null-parameters" class="hash-link" aria-label="Direct link to avoid-always-null-parameters" title="Direct link to avoid-always-null-parameters" translate="no">​</a></h3>
<p>Warns when a private function or method has a parameter that always gets <code>null</code>. Such parameters can be removed.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Some</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">work</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token function" style="color:#87aff4">_fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: This parameter always gets a null value. Try removing it.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">String</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> nullable</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">nullable </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token comment" style="color:#999999">// handle nullable case</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token comment" style="color:#999999">// handle regular case</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-unassigned-fields"><a class="" href="https://dcm.dev/docs/rules/common/avoid-unassigned-fields/"><code>avoid-unassigned-fields</code></a><a href="https://dcm.dev/blog/2025/11/20/whats-new-in-dcm-1-33-0/#avoid-unassigned-fields" class="hash-link" aria-label="Direct link to avoid-unassigned-fields" title="Direct link to avoid-unassigned-fields" translate="no">​</a></h3>
<p>Warns when a private field is not assigned a value.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Test</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> _field </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'string'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: This field is never assigned a value within its declaration.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Try assigning a value or removing this field.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">int</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> _privateLate</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>here, <code>_privateLate</code> never gets a value and should be either removed or assigned a value.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What’s next<a href="https://dcm.dev/blog/2025/11/20/whats-new-in-dcm-1-33-0/#whats-next" class="hash-link" aria-label="Direct link to What’s next" title="Direct link to What’s next" translate="no">​</a></h2>
<p>To learn more about upcoming features, keep an eye on our <a href="https://dcm.featurebase.app/roadmap" target="_blank" rel="noopener noreferrer" class="">public roadmap</a>.</p>
<p>And to learn more about our upcoming videos and "Rules of the Week" content, subscribe to our <a href="https://www.youtube.com/@DCMAnalyzer" target="_blank" rel="noopener noreferrer" class="">Youtube Channel</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sharing-your-feedback">Sharing your feedback<a href="https://dcm.dev/blog/2025/11/20/whats-new-in-dcm-1-33-0/#sharing-your-feedback" class="hash-link" aria-label="Direct link to Sharing your feedback" title="Direct link to Sharing your feedback" translate="no">​</a></h2>
<p>If there is something you miss from DCM right now, want us to make something better, or have any general feedback — <a href="https://discord.gg/Vzjprgk4sb" target="_blank" rel="noopener noreferrer" class="">join our Discord server</a>! We’d love to hear from you.</p>]]></content>
        <author>
            <name>Dmitry Zhifarsky</name>
            <uri>https://dcm.dev</uri>
        </author>
        <category label="product-update" term="product-update"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[A Deeper Look at Dart's Dot Shorthands (and Their Hidden Complexity For Your Flutter Projects)]]></title>
        <id>https://dcm.dev/blog/2025/11/17/deeper-look-darts-dot-shorthand-hidden-complexity/</id>
        <link href="https://dcm.dev/blog/2025/11/17/deeper-look-darts-dot-shorthand-hidden-complexity/"/>
        <updated>2025-11-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Deep dive into Dart 3.10's dot shorthand syntax: learn when to use it, avoid common pitfalls like nested shorthands, and discover best practices with practical examples and DCM lint rules.]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="Cover" src="https://dcm.dev/assets/images/2025-11-17-cover-682a30385a7fbffa4432b0ddc53c7160.jpg" width="1050" height="561" class="img_ev3q"></p>
<p>I’ve been writing Flutter and Dart professionally for many years, and during that time, Dart has evolved in all kinds of exciting ways. We’ve gained sound null safety, pattern matching, sealed classes, the list keeps growing. But every once in a while, Dart introduces a feature that is deceptively small yet manages to reshape how we think and write code every day.</p>
<p>With Dart 3.10, released alongside Flutter 3.38 on November 12, 2025, we got one of those features: <strong>dot shorthands</strong>.</p>
<p>The first time I enabled the feature in a real codebase, my Flutter widget trees instantly felt lighter. The noise reduced. My eyes stopped tripping over repeated type names. And for a few minutes, I genuinely thought: "Why didn’t we have this earlier?"</p>
<p>But like every elegant piece of syntax, dot shorthands carry hidden complexity, especially when they escape the "safe" zones they were designed for. After reviewing, experimenting, and observing how teams naturally adopt (and misuse) them, I realized this is one of those cases where you need both excitement and caution.</p>
<p>This article is my deep dive into the feature; not just what dot shorthands are, but <em>why</em> they exist, how they work, where they might be tricky to use, and how you can get the best of them while avoiding the worst.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-dot-shorthands-actually-are">What Dot Shorthands Actually Are<a href="https://dcm.dev/blog/2025/11/17/deeper-look-darts-dot-shorthand-hidden-complexity/#what-dot-shorthands-actually-are" class="hash-link" aria-label="Direct link to What Dot Shorthands Actually Are" title="Direct link to What Dot Shorthands Actually Are" translate="no">​</a></h2>
<p>Dot shorthands let you write <code>.foo</code> instead of <code>SomeType.foo</code> whenever Dart can infer the type from context. That’s it. But to truly understand this feature, you need one mental model.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-one-rule-that-explains-everything">The One Rule That Explains Everything<a href="https://dcm.dev/blog/2025/11/17/deeper-look-darts-dot-shorthand-hidden-complexity/#the-one-rule-that-explains-everything" class="hash-link" aria-label="Direct link to The One Rule That Explains Everything" title="Direct link to The One Rule That Explains Everything" translate="no">​</a></h3>
<p>Dart does not guess. It does not "search around."</p>
<p>It simply looks at whatever provides the <strong>expected type</strong> and resolves the shorthand using that. This "expected type" is the <strong>context</strong>.</p>
<ul>
<li class="">
<p><strong>Variable declarations</strong> create context:
<code>MainAxisAlignment alignment =</code> (The context is <code>MainAxisAlignment</code>)</p>
</li>
<li class="">
<p><strong>Function arguments</strong> create context:
<code>Column(mainAxisAlignment:</code> (The context is <code>MainAxisAlignment</code>)</p>
</li>
<li class="">
<p><strong>Function return types</strong> create context:
<code>Color getDefaultColor() =&gt;</code> (The context is <code>Color</code>)</p>
</li>
<li class="">
<p><strong>Enum cases in switch statements or pattern matching</strong></p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">level</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">case</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">warning</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// Context: LogLevel enum</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
</li>
<li class="">
<p><strong>Equality comparisons:</strong>
<code>if (myColor == .green)</code></p>
</li>
</ul>
<p>We will go through all of the above examples in details in this article.</p>
<p>In a nutshell, If there’s no context, the shorthand fails, because Dart can't guess:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// ❌ ERROR: No context. Dart cannot infer what `.parse` refers to.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">parse</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'8080'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>But as soon as you provide that context, it works perfectly:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// ✅ OK: The variable declaration `int port` provides</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// the context, so Dart knows `.parse` means `int.parse`.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> port </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">parse</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'8080'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>Once you internalize that one rule, everything about the feature feels obvious.</p>
<p>Let's see it in action.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dot-shorthands-in-action">Dot Shorthands in Action<a href="https://dcm.dev/blog/2025/11/17/deeper-look-darts-dot-shorthand-hidden-complexity/#dot-shorthands-in-action" class="hash-link" aria-label="Direct link to Dot Shorthands in Action" title="Direct link to Dot Shorthands in Action" translate="no">​</a></h2>
<p>This feature applies to four major places. Let's look at them not just with code, but with the scenarios where they appear in real projects.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-enums">1. Enums<a href="https://dcm.dev/blog/2025/11/17/deeper-look-darts-dot-shorthand-hidden-complexity/#1-enums" class="hash-link" aria-label="Direct link to 1. Enums" title="Direct link to 1. Enums" translate="no">​</a></h3>
<p>If you’ve worked with Flutter for even a week, you’ve written this: <code>MainAxisAlignment.center</code>, <code>CrossAxisAlignment.end</code>, <code>LogLevel.warning</code>. Enums are one of the most repetitive things in Flutter.</p>
<p>In the past, you had to explicitly write the enum type every time:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">enum</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Status</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"> running</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> paused</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> stopped </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Status</span><span class="token plain"> currentStatus </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Status</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">running</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>With dot shorthands, the compiler uses the variable's type as the context, letting you write this instead:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// The context is `Status` from the variable type.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Status</span><span class="token plain"> currentStatus </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">running</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>When you see <code>.running</code>, you know exactly what it is. No ambiguity. If anything, the code reads <em>better</em> because your eyes go straight to the actual value.</p>
<p>Inside a typical <code>build</code> method, your widget parameters become much cleaner:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">Column</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  mainAxisAlignment</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">center</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  crossAxisAlignment</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">start</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  mainAxisSize</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">min</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-static-methods--fields">2. Static Methods &amp; Fields<a href="https://dcm.dev/blog/2025/11/17/deeper-look-darts-dot-shorthand-hidden-complexity/#2-static-methods--fields" class="hash-link" aria-label="Direct link to 2. Static Methods &amp; Fields" title="Direct link to 2. Static Methods &amp; Fields" translate="no">​</a></h3>
<p>Static members (like <code>int.parse</code> or <code>Duration.zero</code>) often come with verbose calls. We've all written this kind of repetitive code:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">Duration</span><span class="token plain"> timeout </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Duration</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">zero</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> port </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">parse</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'8080'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>With shorthands, the contexts from the variable declarations clean this up nicely:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// The contexts are `Duration` and `int`.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Duration</span><span class="token plain"> timeout </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">zero</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> port </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">parse</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'8080'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>I noticed this effect most in code dealing with timers, parsing, and constants. However, here’s my caveat: <strong>static getters are great; static methods are acceptable but use with judgment.</strong></p>
<p>Some developers find <code>int value = .parse('42')</code> clean. Others find it confusing, what is <code>.parse</code> attached to? Use your team's best judgment.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-named-constructors">3. Named Constructors<a href="https://dcm.dev/blog/2025/11/17/deeper-look-darts-dot-shorthand-hidden-complexity/#3-named-constructors" class="hash-link" aria-label="Direct link to 3. Named Constructors" title="Direct link to 3. Named Constructors" translate="no">​</a></h3>
<p>Named constructors appear everywhere in Dart: <code>Point.fromList</code>, <code>Color.fromARGB</code>, <code>BorderRadius.circular</code>.</p>
<p>Previously, this meant repeating the class name:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">Point</span><span class="token plain"> p </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Point</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">fromList</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>Now, you can simply write:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// The context is `Point`.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Point</span><span class="token plain"> p </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">fromList</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>This one surprised me. Rewriting all named constructors with shorthand made parts of my code feel more consistent. I wasn’t switching between long-form and shorthand, I could rely on shorthands whenever the context was clear.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-default-constructors-new">4. Default Constructors (<code>.new</code>)<a href="https://dcm.dev/blog/2025/11/17/deeper-look-darts-dot-shorthand-hidden-complexity/#4-default-constructors-new" class="hash-link" aria-label="Direct link to 4-default-constructors-new" title="Direct link to 4-default-constructors-new" translate="no">​</a></h3>
<p>This is where dot shorthands really start to shine in Flutter state classes, where we initialize controllers, keys, and maps.</p>
<p>Here’s a real example I encountered in a project, which was full of boilerplate:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_State</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Page</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">late</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AnimationController</span><span class="token plain"> _ac </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AnimationController</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">vsync</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ScrollController</span><span class="token plain"> _sc </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ScrollController</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">GlobalKey</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">ScaffoldMessengerState</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> messengerKey </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token class-name" style="color:#7fdbca">GlobalKey</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">ScaffoldMessengerState</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>After applying dot shorthands, every line reads cleaner:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_State</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Page</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">late</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AnimationController</span><span class="token plain"> _ac </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token keyword" style="color:#00bff9">new</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">vsync</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ScrollController</span><span class="token plain"> _sc </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token keyword" style="color:#00bff9">new</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">GlobalKey</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">ScaffoldMessengerState</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> messengerKey </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token keyword" style="color:#00bff9">new</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>The type repetition disappears, and the intent of the code initialization becomes clearer.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="generics-just-work">Generics Just Work<a href="https://dcm.dev/blog/2025/11/17/deeper-look-darts-dot-shorthand-hidden-complexity/#generics-just-work" class="hash-link" aria-label="Direct link to Generics Just Work" title="Direct link to Generics Just Work" translate="no">​</a></h2>
<p>One of my favorite discoveries was how well shorthands integrate with <strong>generics</strong> (types with <code>&lt;&gt;</code>).</p>
<p>The first time I wrote: <code>List&lt;int&gt; values = .filled(5, 0);</code>, a small part of me thought, "There’s no way this works." But it did.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-this-is-a-big-deal">Why this is a big deal<a href="https://dcm.dev/blog/2025/11/17/deeper-look-darts-dot-shorthand-hidden-complexity/#why-this-is-a-big-deal" class="hash-link" aria-label="Direct link to Why this is a big deal" title="Direct link to Why this is a big deal" translate="no">​</a></h3>
<p>Generic constructors like <code>List&lt;T&gt;.filled</code> or <code>Map&lt;K, V&gt;.from</code> are extremely common. And they’re always verbose. This often led to extremely wordy declarations, especially with complex generic types:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">Map</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> matrix </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Map</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">from</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>Now, the compiler uses that entire generic type as the context, cleaning up the code dramatically:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// The context is the *entire* generic type.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Map</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">String</span><span class="token generics punctuation" style="color:#a7dbf7">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">int</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> matrix </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">from</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>But here’s the caveat you must watch for: If you lose the explicit type on the left, the shorthand breaks because the context is lost.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// ❌ ERROR: 'var' provides no context for the compiler to use.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">var</span><span class="token plain"> values </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">filled</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">5</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>My rule of thumb: <strong>Shorthands with generics are great as long as the type is explicit.</strong></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-hidden-complexity-the-things-you-only-learn-after-using-it">The Hidden Complexity (The Things You Only Learn After Using It)<a href="https://dcm.dev/blog/2025/11/17/deeper-look-darts-dot-shorthand-hidden-complexity/#the-hidden-complexity-the-things-you-only-learn-after-using-it" class="hash-link" aria-label="Direct link to The Hidden Complexity (The Things You Only Learn After Using It)" title="Direct link to The Hidden Complexity (The Things You Only Learn After Using It)" translate="no">​</a></h2>
<p>Everything above sounds perfect, right? It is until it's not.</p>
<p>After reviewing shorthands and testing edge cases, here are the real-world pitfalls you must be aware of.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-nested-shorthands-create-readability-nightmares">1. Nested Shorthands Create Readability Nightmares<a href="https://dcm.dev/blog/2025/11/17/deeper-look-darts-dot-shorthand-hidden-complexity/#1-nested-shorthands-create-readability-nightmares" class="hash-link" aria-label="Direct link to 1. Nested Shorthands Create Readability Nightmares" title="Direct link to 1. Nested Shorthands Create Readability Nightmares" translate="no">​</a></h3>
<p>The most severe problem occurs when shorthands are nested within other shorthands. I cannot say this strongly enough. Avoid this at all costs:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Version</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> name</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Version</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">WidgetConfig</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Version</span><span class="token plain"> version</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">WidgetConfig</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">version</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CustomWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">WidgetConfig</span><span class="token plain"> config</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CustomWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">config</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// ⛔️ DON'T DO THIS</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CustomWidget</span><span class="token plain"> x </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token keyword" style="color:#00bff9">new</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">.</span><span class="token keyword" style="color:#00bff9">new</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">version</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token keyword" style="color:#00bff9">new</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'val'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>In my opinion, this is not clever. This is not modern. <strong>This is a puzzle.</strong> This code is nearly impossible to parse mentally.</p>
<p>The cognitive load is extreme because:</p>
<ul>
<li class="">There are no visual type anchors to help identify what's being created</li>
<li class="">The nesting depth becomes invisible</li>
<li class="">Debugging requires constantly checking type definitions</li>
<li class="">Code reviews become significantly more difficult</li>
</ul>
<p>Because this pattern is so universally harmful, <strong>DCM</strong> provides a specific rule to ban it: <strong><a href="https://dcm.dev/docs/rules/common/avoid-nested-shorthands" target="_blank" rel="noopener noreferrer" class=""><code>avoid-nested-shorthands</code></a></strong>. This rule will flag this unreadable code as an error right in your IDE:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// ⛔️ LINT: Avoid nested dot shorthands</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Another</span><span class="token plain"> a </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token keyword" style="color:#00bff9">new</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">.</span><span class="token keyword" style="color:#00bff9">new</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">version</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token keyword" style="color:#00bff9">new</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'val'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> a </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Another</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">.</span><span class="token keyword" style="color:#00bff9">new</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">version</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token keyword" style="color:#00bff9">new</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'val'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>The linter rule guides you to this much cleaner solution, where only the outer call is a shorthand:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// ✅ GOOD: Only the outer call is shorthand.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// The inner calls are explicit and readable.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Another</span><span class="token plain"> a </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token keyword" style="color:#00bff9">new</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Some</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">version</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'val'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> a </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Another</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">.</span><span class="token keyword" style="color:#00bff9">new</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">version</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'val'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<div class="wrapper_plzk"><p>DCM is a code quality tool that helps your team move faster by reducing the time spent on code reviews, finding tricky bugs, identifying complex code, and unifying code style.</p><div class="heroButtons_DVKJ"><a class="button button--primary button--md" href="https://dcm.dev/pricing/">Start for Free</a><a class="button button--secondary button--md demo-button" href="https://dcm.dev/demo/"><svg width="12" height="17" viewBox="0 0 12 17" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M11.4742 7.67501C12.054 8.0722 12.054 8.92781 11.4742 9.32499L1.60147 16.0881C0.937832 16.5427 0.0363247 16.0675 0.0363247 15.2631L0.0363253 1.73691C0.0363253 0.932494 0.937834 0.457306 1.60147 0.911917L11.4742 7.67501Z" fill="#000"></path></svg>Watch Demo</a></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-expression-statements-cannot-begin-with-dots">2. Expression Statements Cannot Begin With Dots<a href="https://dcm.dev/blog/2025/11/17/deeper-look-darts-dot-shorthand-hidden-complexity/#2-expression-statements-cannot-begin-with-dots" class="hash-link" aria-label="Direct link to 2. Expression Statements Cannot Begin With Dots" title="Direct link to 2. Expression Statements Cannot Begin With Dots" translate="no">​</a></h3>
<p>You will run into this. It feels strange at first, but it makes sense based on our "One Rule." You will instinctively try this, but it will fail because there is no context:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Logger</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">log</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> message</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">message</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">main</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// ⛔️ ERROR: No context.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">log</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Hello'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>You must always provide the explicit type in this situation:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">main</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// ✅ OK: Explicit type context provided by prefix.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Logger</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">log</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Hello'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain">  </span><span class="token comment" style="color:#999999">// Fully qualified static method call.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// ✅ OK: Assigned to variable with explicit function type (tear-off).</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Function</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">String</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> logFn </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Logger</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">log</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token function" style="color:#87aff4">logFn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Hello from logFn!'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<blockquote>
<p><strong>Note:</strong> This is a <strong>compiler error</strong>, not just a style issue. Your code simply won't run. Because of this, you don't need a special lint rule for it, the Dart analyzer will catch it every time.</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-asymmetric-equality-checks">3. Asymmetric Equality Checks<a href="https://dcm.dev/blog/2025/11/17/deeper-look-darts-dot-shorthand-hidden-complexity/#3-asymmetric-equality-checks" class="hash-link" aria-label="Direct link to 3. Asymmetric Equality Checks" title="Direct link to 3. Asymmetric Equality Checks" translate="no">​</a></h3>
<p>The equality operators (<code>==</code> and <code>!=</code>) have special, asymmetric rules for shorthands. Because Dart uses the left-hand side to infer type, comparisons <em>only</em> work when the shorthand is on the right.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">Color</span><span class="token plain"> myColor </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Color</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">red</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// ✅ This is allowed:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">myColor </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">green</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"> </span><span class="token comment" style="color:#999999">/* ... */</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">myColor </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">blue</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain">  </span><span class="token comment" style="color:#999999">// OK</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// ⛔️ This is not allowed:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// ERROR: Shorthand must be on right side</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">red </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> myColor</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// ERROR: Cannot use complex expressions on right side</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">myColor </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">condition </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">green </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">blue</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// ERROR: Type context lost by casting</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">myColor </span><span class="token operator" style="color:#00bff9">as</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Object</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">green</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>I’ve seen developers waste time debugging this. Remember the context-type rule: in <code>myColor == .green</code>, <code>myColor</code> provides the <code>Color</code> context. In <code>.red == myColor</code>, <code>.red</code> is seen first and has no context.</p>
<blockquote>
<p><strong>Note:</strong> Like the last pitfall, this is a <strong>compiler error</strong> that the Dart analyzer will flag immediately.</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-readability-concerns-and-team-disagreement">4. Readability Concerns and Team Disagreement<a href="https://dcm.dev/blog/2025/11/17/deeper-look-darts-dot-shorthand-hidden-complexity/#4-readability-concerns-and-team-disagreement" class="hash-link" aria-label="Direct link to 4. Readability Concerns and Team Disagreement" title="Direct link to 4. Readability Concerns and Team Disagreement" translate="no">​</a></h3>
<p>Once shorthands are introduced, teams naturally split:</p>
<ul>
<li class="">Some developers love the conciseness.</li>
<li class="">Others find it hides too much information.</li>
<li class="">Juniors may struggle to infer the missing types.</li>
</ul>
<p>Critics argue:</p>
<ul>
<li class="">When everything is shortened, your brain must constantly infer types rather than reading them explicitly</li>
<li class="">Explicit type names serve as inline documentation</li>
<li class="">New team members or less experienced developers struggle more with implicit syntax</li>
<li class="">Code becomes harder to read without IDE support</li>
</ul>
<p>This is why lint rules become essential. Without guidelines, the codebase becomes inconsistent.</p>
<p>You solve the human problem by <strong>enforcing consistency</strong>. You can use a rule to <em>encourage</em> the good patterns.</p>
<p>The best example is for enums. You want <em>everyone</em> to use the new shorthand. You can enforce this with the DCM rule <strong><a href="https://dcm.dev/docs/rules/common/prefer-shorthands-with-enums" target="_blank" rel="noopener noreferrer" class=""><code>prefer-shorthands-with-enums</code></a></strong>. This rule flags the <em>old</em> way of writing enum cases:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">MyEnum</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:#999999">// ⛔️ LINT</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">case</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyEnum</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// ⛔️ LINT</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyEnum</span><span class="token plain"> another </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyEnum</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// ⛔️ LINT</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyEnum</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<p>It actively guides everyone on the team to use the new, cleaner syntax:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// ✅ GOOD: This is what the linter will guide you to write.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">MyEnum</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">case</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyEnum</span><span class="token plain"> another </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>Our style rules for dot shorthands come with <strong>quick fixes and CLI fixes</strong>, allowing you to automatically update your code to follow best practices without manual effort.</p></div></div>
<p>Another rule that helps for consistency is <a href="https://dcm.dev/docs/rules/common/prefer-shorthands-with-constructors" target="_blank" rel="noopener noreferrer" class=""><code>prefer-shorthands-with-constructors</code></a>, which suggests using shorthand syntax for constructor calls when the type is explicit.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">Padding</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// ⛔️ LINT</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  padding</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">EdgeInsets</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">symmetric</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    horizontal</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">horizontalPadding</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">screenWidth</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    vertical</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">12</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">BoxDecoration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">transparent</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// ⛔️ LINT</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  border</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Border</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AppColors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">primary</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">withOpacity</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_controller</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    width</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// ⛔️ LINT</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  borderRadius</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BorderRadius</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">circular</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">18</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>And this simply can be fixed by changing your code to:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// ✅ GOOD:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Padding</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  padding</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">symmetric</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    horizontal</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">horizontalPadding</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">screenWidth</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    vertical</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">12</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">BoxDecoration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">transparent</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  border</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AppColors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">primary</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">withOpacity</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_controller</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    width</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  borderRadius</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">circular</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">18</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>Moreover, this rule is configurable to make it more adaptable to your team preferences.</p>
<p>For example, set entries to configure the list of classes that should be used as dot shorthands.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">rules</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">prefer-shorthands-with-constructors</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">entries</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> EdgeInsets</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> BorderRadius</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Radius</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Border</span><br></span></code></pre></div></div>
<p>Similar to the last two rules, you can also enforce the best practices for consistent codebase using <a href="https://dcm.dev/docs/rules/common/prefer-shorthands-with-static-fields" target="_blank" rel="noopener noreferrer" class=""><code>prefer-shorthands-with-static-fields</code></a> which encourages shorthand usage for static field access and static getter calls.</p>
<p>Let's take this example:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">case</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// ⛔️ LINT</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> v </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// ⛔️ LINT</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    _ </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> another </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// ⛔️ LINT</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// ⛔️ LINT</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">another</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> value </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// ⛔️ LINT</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">getClass</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// ⛔️ LINT</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> value</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> first </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'first'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> second </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'second'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>Then by enforcing this rule you can simply catch the issues and turn to correct one as follow:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">case</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> v </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    _ </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> another </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">another</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> value </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">getClass</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">Object</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">getObject</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">first</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>Finally, using shorthands can also be applied in return statements using <a href="https://dcm.dev/docs/rules/common/prefer-returning-shorthands" target="_blank" rel="noopener noreferrer" class=""><code>prefer-returning-shorthands</code></a> for consistency across all your codes.
For example</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// ⛔️ LINT This instance type matches the return type</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">getInstance</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'val'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">getInstance</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">named</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'val'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>can easily be caught and be fixed as follows:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// ✅ GOOD:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">getInstance</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token keyword" style="color:#00bff9">new</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'val'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">getInstance</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">named</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'val'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
<p>As you see, there's no objectively "correct" answer, it depends on team preferences, project complexity, and developer experience levels, however, having rules that can enforce your team's choice and preference can lead to a much more readable and maintainable project.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-limited-union-type-support">5. Limited Union Type Support<a href="https://dcm.dev/blog/2025/11/17/deeper-look-darts-dot-shorthand-hidden-complexity/#5-limited-union-type-support" class="hash-link" aria-label="Direct link to 5. Limited Union Type Support" title="Direct link to 5. Limited Union Type Support" translate="no">​</a></h3>
<p>Dart provides special handling for nullable types (<code>T?</code>) and <code>FutureOr&lt;T&gt;</code>, but support is limited:</p>
<ul>
<li class="">For nullable types, you can access static members of <code>T</code>, but not of <code>Null</code></li>
<li class="">For <code>FutureOr&lt;T&gt;</code>, you can access static members of <code>T</code> (primarily to support async function returns), but not of <code>Future</code></li>
</ul>
<p>This creates inconsistency where some type contexts work seamlessly while others fail unexpectedly.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-silent-ignore-on-dart-older-version">6. Silent Ignore On Dart Older Version<a href="https://dcm.dev/blog/2025/11/17/deeper-look-darts-dot-shorthand-hidden-complexity/#6-silent-ignore-on-dart-older-version" class="hash-link" aria-label="Direct link to 6. Silent Ignore On Dart Older Version" title="Direct link to 6. Silent Ignore On Dart Older Version" translate="no">​</a></h3>
<p>If even one file in your project begins with:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// @dart=3.9</span><br></span></code></pre></div></div>
<p>Dot shorthands will silently stop working in that file. This leads to confusing build errors where one team member sees shorthands everywhere while another sees red squiggly lines. Always check your language versions!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="my-practical-rulebook-for-teams">My Practical Rulebook for Teams<a href="https://dcm.dev/blog/2025/11/17/deeper-look-darts-dot-shorthand-hidden-complexity/#my-practical-rulebook-for-teams" class="hash-link" aria-label="Direct link to My Practical Rulebook for Teams" title="Direct link to My Practical Rulebook for Teams" translate="no">​</a></h2>
<p>After playing around and checking on how other Flutter and Dart developers are using the shorthands, I came into a rulebook I personally follow:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-always-use">✅ Always Use<a href="https://dcm.dev/blog/2025/11/17/deeper-look-darts-dot-shorthand-hidden-complexity/#-always-use" class="hash-link" aria-label="Direct link to ✅ Always Use" title="Direct link to ✅ Always Use" translate="no">​</a></h3>
<ul>
<li class=""><strong>Enums:</strong> In all contexts (<code>switch</code>, <code>if</code>, assignment). This is the safest, cleanest win.</li>
<li class=""><strong>Flutter Widget Parameters:</strong> <code>mainAxisAlignment: .center</code>, <code>alignment: .bottomCenter</code>, etc.</li>
<li class=""><strong>Static Constants:</strong> <code>Duration.zero</code> becomes <code>Duration timeout = .zero;</code>.</li>
<li class=""><strong>Return Values</strong> (with explicit return types): <code>Color getColor() =&gt; .red;</code>.</li>
<li class=""><strong>Generic Constructors</strong> (with explicit types): <code>List&lt;int&gt; x = .filled(5, 0);</code>.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-use-with-care">⚠️ Use with Care<a href="https://dcm.dev/blog/2025/11/17/deeper-look-darts-dot-shorthand-hidden-complexity/#%EF%B8%8F-use-with-care" class="hash-link" aria-label="Direct link to ⚠️ Use with Care" title="Direct link to ⚠️ Use with Care" translate="no">​</a></h3>
<ul>
<li class=""><strong>Static Methods:</strong> <code>int value = .parse('42');</code>. It's fine, but it's not a huge win and can be less clear than <code>int.parse('42')</code>.</li>
<li class=""><strong>Constructors with many parameters:</strong> <code>final controller = .new(vsync: this, duration: .seconds(2));</code>. If you have to pause to know what <code>.new</code> is, write it out.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-never-use">❌ Never Use<a href="https://dcm.dev/blog/2025/11/17/deeper-look-darts-dot-shorthand-hidden-complexity/#-never-use" class="hash-link" aria-label="Direct link to ❌ Never Use" title="Direct link to ❌ Never Use" translate="no">​</a></h3>
<ul>
<li class=""><strong>Nested Shorthands:</strong> <code>final x = .new(.new(.new()));</code>. <strong>Never do this.</strong></li>
<li class=""><strong>To Start an Expression:</strong> <code>.log('Hello');</code>. (Compiler error).</li>
<li class=""><strong>On the Left Side of <code>==</code>:</strong> <code>if (.red == color)</code>. (Compiler error).</li>
<li class=""><strong>Anywhere your team finds confusing:</strong> Clarity <em>always</em> wins over brevity.</li>
</ul>
<p>Based on my suggested rule book, here will be the DCM rules and configurations needed for your projects:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">rules</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:#999999"># "Enums"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> prefer</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">shorthands</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">with</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">enums</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:#999999"># "Static Constants"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> prefer</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">shorthands</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">with</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">static</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">fields</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:#999999"># "Return Values"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> prefer</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">returning</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">shorthands</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:#999999"># "Generic Constructors"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">prefer-shorthands-with-constructors</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">entries</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> EdgeInsets</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> BorderRadius</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Radius</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Border</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> List</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Map</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Set</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token comment" style="color:#999999"># Add other simple UI classes here as needed</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:#999999"># "Nested Shorthands."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> avoid</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">nested</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">shorthands</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://dcm.dev/blog/2025/11/17/deeper-look-darts-dot-shorthand-hidden-complexity/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Dot shorthands are one of those rare language features that truly change how your code <em>feels</em>. Flutter widget trees become lighter. Enum-heavy logic becomes readable. Redundant constructors disappear.</p>
<p>But like any sharp tool, it cuts both ways.</p>
<p>Use it thoughtfully. Avoid the traps. And let linter rules (like those from DCM) enforce the guardrails that keep your codebase consistent and understandable. Dart has given us a beautiful new piece of expressiveness. With the right discipline, it becomes one of the most enjoyable additions to modern Dart.</p>
<p>Happy shorthands coding!</p>
<div class="formWrapper_FeQU"><p class="formTitle_o9oT">Enjoying this article?</p><p>Subscribe to get our latest articles and product updates by email.</p><form class="footerForm_u4Zn"><input class="trialInput_rT6u" type="email" placeholder="Email address" name="blogEmail"><button type="submit" class="button button--primary button--sm formButton_cuTv">Subscribe</button></form></div>]]></content>
        <author>
            <name>Majid Hajian</name>
            <uri>https://dcm.dev</uri>
        </author>
        <category label="blog" term="blog"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[8 More Flutter Widgets You’re Probably Not Using (But Should Be)]]></title>
        <id>https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/</id>
        <link href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/"/>
        <updated>2025-10-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Discover 8 powerful Flutter widgets you might not be using yet, with practical examples and tips to boost your app's performance and UI versatility.]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="Cover" src="https://dcm.dev/assets/images/2025-10-30-cover-d0a6d98e9248fabdee28f295d15b39d2.jpg" width="1400" height="748" class="img_ev3q"></p>
<p>It never ceases to amaze me how Flutter continues to surprise developers with its depth and versatility. Even after years of working with this framework, there are still widgets hiding in plain sight that solve very specific problems elegantly.</p>
<p>I recently demonstrated a set of 10 widgets in a <a href="https://youtu.be/pLSJMPpgPts?si=mKp3bKl7rh7QzPWV&amp;t=23" target="_blank" rel="noopener noreferrer" class="">lightning talk at FlutterCon as a DCM advocate</a>, where I showcased several niche but incredibly useful widgets. After the talk, I decided to turn it into an in-depth and more detailed blog post about these widgets. Like my previous article on <a href="https://dcm.dev/blog/2025/01/13/ten-flutter-widgets-probably-havent-heard-of-but-should-be-using/" target="_blank" rel="noopener noreferrer" class="">10 Flutter widgets you probably haven't heard of (But you should be using)</a>, I went into the source code to understand not just how to use these widgets, but also how they work under the hood.</p>
<blockquote>
<p>Before we start, all examples and source code of this blog has been posted to <a href="https://github.com/mhadaily/flutter_test_cases/tree/main/lib/widgets" target="_blank" rel="noopener noreferrer" class="">this repo</a> which was created for <a href="https://dcm.dev/blog/2025/07/30/navigating-hard-parts-testing-flutter-developers/" target="_blank" rel="noopener noreferrer" class="">Navigating the Hard Parts of Testing in Flutter</a> article.</p>
</blockquote>
<p>Now, let's uncover these widgets together!</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="snapshotwidget">SnapshotWidget<a href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/#snapshotwidget" class="hash-link" aria-label="Direct link to SnapshotWidget" title="Direct link to SnapshotWidget" translate="no">​</a></h2>
<p>The <code>SnapshotWidget</code> is a performance optimization powerhouse that can transform complex, expensive-to-draw widgets into static, non-interactive images. Think of it as taking a screenshot of a specific widget, once captured, Flutter no longer needs to spend resources redrawing the original complex widget on every frame.</p>
<p>You should reach for <code>SnapshotWidget</code> when you have graphically complex UI elements (custom drawings, charts, complicated widget stacks) that don't change frequently but are expensive to render, or when performance degrades on low-end devices and you want to enhance performance.</p>
<center><video width="65%" controls="" autoplay="" playsinline=""><source src="/video/2025-10-30/snapshot.mp4"></video></center>
<p>Here's how it works in practice:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">SnapshotWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  controller</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> controller</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ExpensiveCircleGrid</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><br></span></code></pre></div></div>
<p>You wrap your expensive widget with <code>SnapshotWidget</code> and provide a <code>SnapshotController</code>.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_SnapshotExampleState</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">SnapshotExample</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> controller </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SnapshotController</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> isSnapshotEnabled </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// ... rest of the code</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>Initially, <code>controller.allowSnapshotting</code> is <code>false</code>, so the original widget renders normally. When you're ready (perhaps after an animation finishes or data loads), you set <code>controller.allowSnapshotting = true</code>. On the next frame, <code>SnapshotWidget</code> captures the child into a rasterized image buffer and displays that frozen image instead, dramatically improving performance.</p>
<p><strong>The trade-off is clear: the snapshot is not interactive</strong>. Any gesture detectors, buttons, or animations within the original widget will no longer work after the snapshot is taken.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="snapshotwidget-under-the-hood">SnapshotWidget Under the Hood<a href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/#snapshotwidget-under-the-hood" class="hash-link" aria-label="Direct link to SnapshotWidget Under the Hood" title="Direct link to SnapshotWidget Under the Hood" translate="no">​</a></h4>
<p>If you peek into Flutter’s source code, the <code>SnapshotWidget</code> lives in <a href="https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/widgets/snapshot_widget.dart" target="_blank" rel="noopener noreferrer" class="">snapshot_widget.dart</a>, and it’s surprisingly elegant.</p>
<p>Here is an abstract, pseudocode of the implementation:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">enum</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SnapshotMode</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"> permissive</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> normal</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> forced </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SnapshotController</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ChangeNotifier</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">get</span><span class="token plain"> allowSnapshotting</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">set</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">allowSnapshotting</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">clear</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// notifyListeners → force re-snapshot</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">abstract</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SnapshotPainter</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ChangeNotifier</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">paintSnapshot</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">PaintingContext</span><span class="token plain"> c</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Offset</span><span class="token plain"> o</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Size</span><span class="token plain"> s</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name namespace" style="color:#7fdbca">ui</span><span class="token class-name namespace punctuation" style="color:#a7dbf7">.</span><span class="token class-name" style="color:#7fdbca">Image</span><span class="token plain"> image</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Size</span><span class="token plain"> srcSize</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">double</span><span class="token plain"> pixelRatio</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">paint</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">PaintingContext</span><span class="token plain"> c</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Offset</span><span class="token plain"> o</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Size</span><span class="token plain"> s</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">PaintingContextCallback</span><span class="token plain"> paintChild</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">shouldRepaint</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">covariant</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SnapshotPainter</span><span class="token plain"> old</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SnapshotWidget</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SingleChildRenderObjectWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SnapshotWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SnapshotController</span><span class="token plain"> controller</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">SnapshotMode</span><span class="token plain"> mode </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SnapshotMode</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">normal</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">SnapshotPainter</span><span class="token plain"> painter </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_DefaultSnapshotPainter</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> autoresize </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// if (controller.allowSnapshotting) {</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">//   capture child as ui.Image and reuse it</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// } else {</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">//   paint live child using painter.paint()</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// }</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>The SnapshotWidget leverages Flutter's layer system to create a texture-backed representation of child widgets. According to the Flutter documentation, it creates a frozen representation stored as a <code>ui.Image</code>, making it particularly useful for short animations that would otherwise be expensive, such as scale and skew transformations on complex children.</p>
<p>Let me explain a bit more. The design is neatly modular.</p>
<p>At the top, you have <code>SnapshotMode</code>, an enum that defines how strict the widget should be about what can be captured.</p>
<ul>
<li class="">In <code>normal</code>, it throws an error if the child contains an un-snapshotable view (like a platform texture).</li>
<li class="">In <code>permissive</code>, it quietly skips snapshotting and paints the child normally.</li>
<li class="">And in <code>forced</code>, it snapshot everything possible—even if it has to ignore those platform layers.</li>
</ul>
<p>The <code>SnapshotController</code> is a lightweight <code>ChangeNotifier</code> that acts as the on/off switch.
Setting <code>allowSnapshotting = true</code> tells Flutter’s rendering pipeline to “freeze” the child into a texture (a <code>ui.Image</code>). Calling <code>clear()</code> drops the cached snapshot and forces the widget to capture a new one the next time it paints.</p>
<p>The <code>SnapshotPainter</code> defines how to draw that image once it exists.</p>
<p>It provides two methods: <code>paintSnapshot()</code> for the frozen bitmap, and <code>paint()</code> for the live child. This is what makes <code>SnapshotWidget</code> powerful, you can apply visual transformations like rotations, blurs, or scaling directly on the snapshot image without rebuilding the original widget tree.</p>
<p>Finally, <code>SnapshotWidget</code> itself extends <code>SingleChildRenderObjectWidget</code>. Inside the render layer, it checks the controller’s flag:</p>
<ul>
<li class="">
<p>If <code>snapshotting</code> is enabled, the child is rendered once into a <code>ui.Image</code> (via the <code>dart:ui</code> library) and that image is reused for subsequent paints.</p>
</li>
<li class="">
<p>If not, it simply paints the child normally through the painter.</p>
</li>
</ul>
<p>The autoresize flag ensures the snapshot refreshes automatically when the widget size changes.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="snapshotwidget-implementation-lessons">SnapshotWidget Implementation Lessons<a href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/#snapshotwidget-implementation-lessons" class="hash-link" aria-label="Direct link to SnapshotWidget Implementation Lessons" title="Direct link to SnapshotWidget Implementation Lessons" translate="no">​</a></h4>
<p><code>SnapshotWidget</code> captures the essence of Flutter’s rendering philosophy: <strong>"don’t rebuild what you can reuse."</strong> By storing a widget’s visual output as a <code>ui.Image</code>, it gives you a way to animate, transform, or transition complex UIs cheaply. It’s a reminder that optimization in Flutter isn’t just about clever state management, sometimes, it’s about knowing when to stop drawing and just reuse what’s already there.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="snapshotwidget-practical-full-example">SnapshotWidget Practical Full Example<a href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/#snapshotwidget-practical-full-example" class="hash-link" aria-label="Direct link to SnapshotWidget Practical Full Example" title="Direct link to SnapshotWidget Practical Full Example" translate="no">​</a></h4>
<p>Let's look at a practical example that was shown in the video above which demonstrates the performance benefits:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/material.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">main</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token function" style="color:#87aff4">runApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MaterialApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      debugShowCheckedModeBanner</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      home</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SnapshotExample</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SnapshotExample</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatefulWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SnapshotExample</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">SnapshotExample</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">createState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_SnapshotExampleState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_SnapshotExampleState</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">SnapshotExample</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> controller </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SnapshotController</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> isSnapshotEnabled </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> buildCounter </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Scaffold</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      appBar</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AppBar</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        title</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'SnapshotWidget Demo (Builds: </span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">$</span><span class="token string-literal interpolation expression">buildCounter</span><span class="token string-literal string" style="color:#e1ffe4">)'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        actions</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token class-name" style="color:#7fdbca">IconButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            icon</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Icon</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Icons</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">add</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            onPressed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">setState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> buildCounter</span><span class="token operator" style="color:#00bff9">++</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      body</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Center</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Column</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          mainAxisAlignment</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MainAxisAlignment</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">center</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token class-name" style="color:#7fdbca">SnapshotWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              controller</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> controller</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ExpensiveCircleGrid</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">30</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token class-name" style="color:#7fdbca">ElevatedButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              onPressed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token function" style="color:#87aff4">setState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  isSnapshotEnabled </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">!</span><span class="token plain">isSnapshotEnabled</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  controller</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">allowSnapshotting </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> isSnapshotEnabled</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                isSnapshotEnabled</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                    </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Unfreeze Widget'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                    </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Freeze Widget (Snapshot)'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">10</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              isSnapshotEnabled</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'The widget is now a static image.\nParent rebuilds will not repaint it.'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'The widget is live and will repaint.'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              textAlign</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextAlign</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">center</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ExpensiveCircleGrid</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ExpensiveCircleGrid</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">"--- Repainting ExpensiveCircleGrid ---"</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Container</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      width</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">200</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">200</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      decoration</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BoxDecoration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">border</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Border</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">black</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CustomPaint</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">painter</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CirclePainter</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CirclePainter</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CustomPainter</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">static</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> _paintCount </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">paint</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Canvas</span><span class="token plain"> canvas</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Size</span><span class="token plain"> size</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    _paintCount</span><span class="token operator" style="color:#00bff9">++</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">"🎨 CirclePainter is painting now! (Count: </span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">$</span><span class="token string-literal interpolation expression">_paintCount</span><span class="token string-literal string" style="color:#e1ffe4">) 🎨"</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> paint </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Paint</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">color </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">teal</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">double</span><span class="token plain"> radius </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">5.0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> i </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> i </span><span class="token operator" style="color:#00bff9">&lt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">20</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> i</span><span class="token operator" style="color:#00bff9">++</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> j </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> j </span><span class="token operator" style="color:#00bff9">&lt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">20</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> j</span><span class="token operator" style="color:#00bff9">++</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        canvas</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">drawCircle</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token class-name" style="color:#7fdbca">Offset</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">i </span><span class="token operator" style="color:#00bff9">*</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">10.0</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">+</span><span class="token plain"> radius</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> j </span><span class="token operator" style="color:#00bff9">*</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">10.0</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">+</span><span class="token plain"> radius</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          radius</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          paint</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">shouldRepaint</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">covariant</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CustomPainter</span><span class="token plain"> oldDelegate</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>In this example, you can see the performance impact clearly (check the video above). When snapshotting is enabled, the expensive <code>CustomPainter</code> stops being called on every rebuild, even though the parent widget continues to rebuild when you press the add button.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-pro-tip-for-your-team-improving-readability">A Pro-Tip for Your Team: Improving Readability<a href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/#a-pro-tip-for-your-team-improving-readability" class="hash-link" aria-label="Direct link to A Pro-Tip for Your Team: Improving Readability" title="Direct link to A Pro-Tip for Your Team: Improving Readability" translate="no">​</a></h3>
<p>We've just optimized our app's runtime performance, but what about our development performance? Messy <code>build</code> methods, many lines of inline logic, are a major drag on readability and make maintenance a chore.</p>
<p>Take the <code>onPressed</code> callback in our <code>SnapshotWidget</code> example. It's four lines of state-changing logic sitting right in the middle of our UI tree:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">ElevatedButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    onPressed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// &lt;-- Logic clutters the UI</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token function" style="color:#87aff4">setState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        isSnapshotEnabled </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">!</span><span class="token plain">isSnapshotEnabled</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        controller</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">allowSnapshotting </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> isSnapshotEnabled</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><br></span></code></pre></div></div>
<p><a href="https://dcm.dev/" target="_blank" rel="noopener noreferrer" class="">DCM</a> has a fantastic rule called <a href="https://dcm.dev/docs/rules/flutter/prefer-extracting-callbacks/" target="_blank" rel="noopener noreferrer" class=""><code>prefer-extracting-callbacks</code></a>, which is designed to enforce a clean separation of concerns. We can tell DCM to flag any inline callback that's longer than one line.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">analysis_options.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">rules</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">prefer-extracting-callbacks</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">allowed-line-count</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">3</span><br></span></code></pre></div></div>
<p>With this rule active, DCM would flag our <code>onPressed</code> callback.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">$ dcm analyze lib/snapshot_widget.dart</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">✔ Analysis is completed. Preparing the results: </span><span class="token number" style="color:#8dec95">0</span><span class="token plain">.3s</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">lib/snapshot_widget.dart </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">1</span><span class="token plain"> issue</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain">:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">STYLE     Prefer extracting the callback to a separate widget method.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          at lib/snapshot_widget.dart:38:15</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          prefer-extracting-callbacks </span><span class="token builtin class-name" style="color:#7fdbca">:</span><span class="token plain"> https://dcm.dev/docs/rules/flutter/prefer-extracting-callbacks</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Scanned folders: </span><span class="token number" style="color:#8dec95">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Scanned files: </span><span class="token number" style="color:#8dec95">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">style issues: </span><span class="token number" style="color:#8dec95">1</span><br></span></code></pre></div></div>
<p>The fix is simple:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_SnapshotExampleState</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">SnapshotExample</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Logic is now in a clean, testable method</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_toggleSnapshot</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token function" style="color:#87aff4">setState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      isSnapshotEnabled </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">!</span><span class="token plain">isSnapshotEnabled</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      controller</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">allowSnapshotting </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> isSnapshotEnabled</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:#999999">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">ElevatedButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      onPressed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _toggleSnapshot</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// &lt;-- Build method is 100% UI</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:#999999">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>Now, our <code>build</code> method is purely declarative (it describes what the UI looks like), and our logic is encapsulated in the <code>_toggleSnapshot</code> method (it describes how the UI works). This shows how DCM goes beyond and actively guides your entire team to write more professional, testable, and maintainable Flutter apps.</p>
<p>As you can see, it's not just about finding new widgets or writing code, it's about making it maintainable, testable, scalable and increase code quality even when you are not focusing on it.</p>
<div class="wrapper_plzk"><p>DCM is a code quality tool that helps your team move faster by reducing the time spent on code reviews, finding tricky bugs, identifying complex code, and unifying code style.</p><div class="heroButtons_DVKJ"><a class="button button--primary button--md" href="https://dcm.dev/pricing/">Start for Free</a><a class="button button--secondary button--md demo-button" href="https://dcm.dev/demo/"><svg width="12" height="17" viewBox="0 0 12 17" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M11.4742 7.67501C12.054 8.0722 12.054 8.92781 11.4742 9.32499L1.60147 16.0881C0.937832 16.5427 0.0363247 16.0675 0.0363247 15.2631L0.0363253 1.73691C0.0363253 0.932494 0.937834 0.457306 1.60147 0.911917L11.4742 7.67501Z" fill="#000"></path></svg>Watch Demo</a></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="repaintboundarytoimage">RepaintBoundary.toImage<a href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/#repaintboundarytoimage" class="hash-link" aria-label="Direct link to RepaintBoundary.toImage" title="Direct link to RepaintBoundary.toImage" translate="no">​</a></h2>
<p>The RepaintBoundary widget is a performance optimization tool that limits the area of the screen needing redraws when visual updates occur. By creating a new compositing layer in Flutter's rendering pipeline, it ensures only that specific layer redraws when visual updates happen within its subtree, rather than the entire screen.</p>
<center><video width="65%" controls="" autoplay="" playsinline=""><source src="/video/2025-10-30/boundaryimage.mp4"></video></center>
<p>Without <code>RepaintBoundary</code>, Flutter's rendering engine propagates visual updates upward through the widget tree, marking all ancestor widgets as dirty. This cascading effect can result in large portions of the screen being unnecessarily redrawn, even when changes are confined to a small area.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">RepaintBoundary</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Container</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    width</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">100</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">100</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">blue</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Optimized Painting'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><br></span></code></pre></div></div>
<p>I have written extensively about this widget in my <a href="https://dcm.dev/blog/2025/01/13/ten-flutter-widgets-probably-havent-heard-of-but-should-be-using/#repaintboundary-widget" target="_blank" rel="noopener noreferrer" class="">previous blog</a>.</p>
<p>However, I want to look at this widget from a different angle.</p>
<p>The <code>RepaintBoundary</code> also has a powerful feature: <strong>its render object has a <code>toImage()</code> method that lets you capture the layer as a <code>ui.Image</code>.</strong> This image can then be converted to bytes (PNG, JPEG, etc.), saved to disk, uploaded, or displayed elsewhere.</p>
<p>The process is straightforward: wrap your widget in a <code>RepaintBoundary</code> with a <code>GlobalKey</code>, then use the key to access the <code>RenderRepaintBoundary</code> instance and call its <code>toImage()</code> method. The <code>RepaintBoundary</code> is implemented at the rendering layer as a <code>RenderRepaintBoundary</code> object.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">RepaintBoundary</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  key</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _boundaryKey</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Container</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">blueAccent</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    width</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">200</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">200</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Center</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token string-literal string" style="color:#e1ffe4">'Snapshot me!'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        style</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextStyle</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">fontSize</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">20</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">white</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="repaintboundarytoimage-under-the-hood"><code>RepaintBoundary.toImage</code> Under the Hood<a href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/#repaintboundarytoimage-under-the-hood" class="hash-link" aria-label="Direct link to repaintboundarytoimage-under-the-hood" title="Direct link to repaintboundarytoimage-under-the-hood" translate="no">​</a></h4>
<p>Here is the <a href="https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/rendering/proxy_box.dart" target="_blank" rel="noopener noreferrer" class="">source code of ProxyBox</a>, which contains the definition of <code>RenderRepaintBoundary</code>.</p>
<p>The <code>toImage()</code> method is implemented in the <code>RenderRepaintBoundary</code> class. It captures the current state of the render object and its children, returning a <code>ui.Image</code> with uncompressed raw RGBA bytes. The method requires that the render object has gone through the paint phase (<code>debugNeedsPaint</code> must be <code>false</code>).</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">RenderRepaintBoundary</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">RenderProxyBox</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">/// Creates a repaint boundary around [child].</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">RenderRepaintBoundary</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token class-name" style="color:#7fdbca">RenderBox</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">super</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">child</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">get</span><span class="token plain"> isRepaintBoundary </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name namespace" style="color:#7fdbca">ui</span><span class="token generics class-name namespace punctuation" style="color:#a7dbf7">.</span><span class="token generics class-name" style="color:#7fdbca">Image</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">toImage</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token class-name" style="color:#7fdbca">double</span><span class="token plain"> pixelRatio </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1.0</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">assert</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token operator" style="color:#00bff9">!</span><span class="token plain">debugNeedsPaint</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">OffsetLayer</span><span class="token plain"> offsetLayer </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> layer</span><span class="token operator" style="color:#00bff9">!</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">as</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">OffsetLayer</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> offsetLayer</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">toImage</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Offset</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">zero </span><span class="token operator" style="color:#00bff9">&amp;</span><span class="token plain"> size</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> pixelRatio</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> pixelRatio</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name namespace" style="color:#7fdbca">ui</span><span class="token class-name namespace punctuation" style="color:#a7dbf7">.</span><span class="token class-name" style="color:#7fdbca">Image</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">toImageSync</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token class-name" style="color:#7fdbca">double</span><span class="token plain"> pixelRatio </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1.0</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">assert</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token operator" style="color:#00bff9">!</span><span class="token plain">debugNeedsPaint</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">OffsetLayer</span><span class="token plain"> offsetLayer </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> layer</span><span class="token operator" style="color:#00bff9">!</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">as</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">OffsetLayer</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> offsetLayer</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">toImageSync</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Offset</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">zero </span><span class="token operator" style="color:#00bff9">&amp;</span><span class="token plain"> size</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> pixelRatio</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> pixelRatio</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>The <code>pixelRatio</code> parameter describes the scale between logical pixels and the output image size, allowing you to control the quality of the captured image.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="repaintboundarytoimage-practical-full-example">RepaintBoundary.toImage Practical Full Example<a href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/#repaintboundarytoimage-practical-full-example" class="hash-link" aria-label="Direct link to RepaintBoundary.toImage Practical Full Example" title="Direct link to RepaintBoundary.toImage Practical Full Example" translate="no">​</a></h4>
<p>Here's a complete example showing how to capture and display a widget as an image:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'dart:typed_data'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'dart:ui'</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">as</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/material.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/rendering.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">main</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token function" style="color:#87aff4">runApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">MaterialApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    debugShowCheckedModeBanner</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    home</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CaptureExample</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CaptureExample</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatefulWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">_CaptureExampleState</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">createState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_CaptureExampleState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_CaptureExampleState</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">CaptureExample</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">GlobalKey</span><span class="token plain"> _boundaryKey </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">GlobalKey</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Uint8List</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> _capturedImage</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics keyword" style="color:#00bff9">void</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_capturePng</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token class-name" style="color:#7fdbca">RenderRepaintBoundary</span><span class="token plain"> boundary </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> _boundaryKey</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">currentContext</span><span class="token operator" style="color:#00bff9">!</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">findRenderObject</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">as</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">RenderRepaintBoundary</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token class-name namespace" style="color:#7fdbca">ui</span><span class="token class-name namespace punctuation" style="color:#a7dbf7">.</span><span class="token class-name" style="color:#7fdbca">Image</span><span class="token plain"> image </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> boundary</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">toImage</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">pixelRatio</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">3.0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token class-name" style="color:#7fdbca">ByteData</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> byteData </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> image</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">toByteData</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">format</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name namespace" style="color:#7fdbca">ui</span><span class="token class-name namespace punctuation" style="color:#a7dbf7">.</span><span class="token class-name" style="color:#7fdbca">ImageByteFormat</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">png</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token class-name" style="color:#7fdbca">Uint8List</span><span class="token plain"> pngBytes </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> byteData</span><span class="token operator" style="color:#00bff9">!</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">buffer</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">asUint8List</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token function" style="color:#87aff4">setState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        _capturedImage </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> pngBytes</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token function" style="color:#87aff4">debugPrint</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">"Error capturing image: </span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">$</span><span class="token string-literal interpolation expression">e</span><span class="token string-literal string" style="color:#e1ffe4">"</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Scaffold</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      appBar</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AppBar</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">title</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'RepaintBoundary Capture Example'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      body</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Column</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        mainAxisAlignment</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MainAxisAlignment</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">center</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token class-name" style="color:#7fdbca">RepaintBoundary</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            key</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _boundaryKey</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Container</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">blueAccent</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              width</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">200</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">200</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Center</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token string-literal string" style="color:#e1ffe4">'Snapshot me!'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  style</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextStyle</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">fontSize</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">20</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">white</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">20</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token class-name" style="color:#7fdbca">ElevatedButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            onPressed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _capturePng</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Capture to Image'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">20</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_capturedImage </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token class-name" style="color:#7fdbca">Image</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">memory</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_capturedImage</span><span class="token operator" style="color:#00bff9">!</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> width</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">200</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>This functionality is particularly powerful for creating drawing applications where users can capture their artwork, or for generating shareable content dynamically.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="advanced-repaintboundary-drawing-pad-example">Advanced RepaintBoundary: Drawing Pad Example<a href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/#advanced-repaintboundary-drawing-pad-example" class="hash-link" aria-label="Direct link to Advanced RepaintBoundary: Drawing Pad Example" title="Direct link to Advanced RepaintBoundary: Drawing Pad Example" translate="no">​</a></h4>
<p>Let's explore a more advanced use case, creating a drawing application where users can capture their artwork as images.</p>
<center><video width="65%" controls="" autoplay="" playsinline=""><source src="/video/2025-10-30/drawing.mp4"></video></center>
<p>This demonstrates the real-world power of combining <code>RepaintBoundary</code> with custom painting.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'dart:ui'</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">as</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/material.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/rendering.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">main</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token function" style="color:#87aff4">runApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MaterialApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      debugShowCheckedModeBanner</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      home</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DrawingPadScreen</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DrawingPadScreen</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatefulWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DrawingPadScreen</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">DrawingPadScreen</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">createState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_DrawingPadScreenState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_DrawingPadScreenState</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">DrawingPadScreen</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">GlobalKey</span><span class="token plain"> _repaintKey </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">GlobalKey</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Offset</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> _points </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name namespace" style="color:#7fdbca">ui</span><span class="token class-name namespace punctuation" style="color:#a7dbf7">.</span><span class="token class-name" style="color:#7fdbca">Image</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> _capturedImage</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics keyword" style="color:#00bff9">void</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_captureDrawing</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">RenderRepaintBoundary</span><span class="token plain"> boundary </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          _repaintKey</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">currentContext</span><span class="token operator" style="color:#00bff9">!</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">findRenderObject</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token operator" style="color:#00bff9">as</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">RenderRepaintBoundary</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name namespace" style="color:#7fdbca">ui</span><span class="token class-name namespace punctuation" style="color:#a7dbf7">.</span><span class="token class-name" style="color:#7fdbca">Image</span><span class="token plain"> image </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> boundary</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">toImage</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">pixelRatio</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">3.0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token function" style="color:#87aff4">setState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        _capturedImage </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> image</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token function" style="color:#87aff4">debugPrint</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">"Error capturing image: </span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">$</span><span class="token string-literal interpolation expression">e</span><span class="token string-literal string" style="color:#e1ffe4">"</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Scaffold</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      appBar</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AppBar</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        title</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Drawing Pad'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        actions</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token class-name" style="color:#7fdbca">IconButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            icon</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Icon</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Icons</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">clear</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            onPressed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">setState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              _points</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">clear</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              _capturedImage </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            tooltip</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Clear Drawing'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      body</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Padding</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        padding</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">EdgeInsets</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">16.0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Column</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          crossAxisAlignment</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CrossAxisAlignment</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">stretch</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token string-literal string" style="color:#e1ffe4">'Draw in the box below:'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              style</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextStyle</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">fontSize</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">18</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> fontWeight</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">FontWeight</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">bold</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">10</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token class-name" style="color:#7fdbca">Expanded</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">RepaintBoundary</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                key</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _repaintKey</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AspectRatio</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  aspectRatio</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1.0</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">GestureDetector</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                    onPanUpdate</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">details</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                      </span><span class="token function" style="color:#87aff4">setState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                        _points</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">add</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">details</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">localPosition</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                      </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                    onPanEnd</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">details</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                      </span><span class="token function" style="color:#87aff4">setState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                        _points</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">add</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// Break the line</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                      </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                    child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Container</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                      decoration</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BoxDecoration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                        color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">grey</span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token number" style="color:#8dec95">200</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                        border</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Border</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">blueGrey</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CustomPaint</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                        painter</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DrawingPainter</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                          points</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">List</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">of</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_points</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">20</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token class-name" style="color:#7fdbca">ElevatedButton</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">icon</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              icon</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Icon</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Icons</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">camera_alt</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              label</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Capture Drawing'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              onPressed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _captureDrawing</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">20</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token string-literal string" style="color:#e1ffe4">'Captured Image:'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              style</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextStyle</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">fontSize</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">18</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> fontWeight</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">FontWeight</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">bold</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">10</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token class-name" style="color:#7fdbca">Expanded</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Container</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                decoration</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BoxDecoration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  border</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Border</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">green</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _capturedImage </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                    </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">RawImage</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">image</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _capturedImage</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                    </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Center</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                        child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Press capture to see the image here'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DrawingPainter</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CustomPainter</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Offset</span><span class="token generics operator" style="color:#00bff9">?</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> points</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">DrawingPainter</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">points</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">paint</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Canvas</span><span class="token plain"> canvas</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Size</span><span class="token plain"> size</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> paint </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Paint</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">color </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">black</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">strokeCap </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StrokeCap</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">round</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">strokeWidth </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">5.0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> i </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> i </span><span class="token operator" style="color:#00bff9">&lt;</span><span class="token plain"> points</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">length </span><span class="token operator" style="color:#00bff9">-</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> i</span><span class="token operator" style="color:#00bff9">++</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">points</span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain">i</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> points</span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain">i </span><span class="token operator" style="color:#00bff9">+</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        canvas</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">drawLine</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">points</span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain">i</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token operator" style="color:#00bff9">!</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> points</span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain">i </span><span class="token operator" style="color:#00bff9">+</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token operator" style="color:#00bff9">!</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> paint</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">shouldRepaint</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">covariant</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">DrawingPainter</span><span class="token plain"> oldDelegate</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      oldDelegate</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">points</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">length </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> points</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">length </span><span class="token operator" style="color:#00bff9">||</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token operator" style="color:#00bff9">!</span><span class="token function" style="color:#87aff4">_listEquals</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">oldDelegate</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">points</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> points</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> _listEquals</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> a</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> b</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">a </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> b </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">b </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">||</span><span class="token plain"> a</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">length </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> b</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">length</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> i </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> i </span><span class="token operator" style="color:#00bff9">&lt;</span><span class="token plain"> a</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">length</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> i</span><span class="token operator" style="color:#00bff9">++</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">a</span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain">i</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> b</span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain">i</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>The combination of gesture detection, custom painting, and image capture creates a powerful foundation for drawing or design applications.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="gridpaper">GridPaper<a href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/#gridpaper" class="hash-link" aria-label="Direct link to GridPaper" title="Direct link to GridPaper" translate="no">​</a></h2>
<p>The GridPaper widget is a debugging and design tool that overlays a grid pattern onto its child widget, making it easier to check for misalignments and ensure your layout is pixel-perfect.</p>
<center><video width="65%" controls="" autoplay="" playsinline=""><source src="/video/2025-10-30/gridpaper.mp4"></video></center>
<p>Think of it as placing a sheet of graph paper over your app, it's purely a visual aid for development and shouldn't be used in production UI.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">GridPaper</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">red</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  interval</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">100</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  divisions</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  subdivisions</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">4</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    width</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">300</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">400</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Column</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      mainAxisAlignment</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MainAxisAlignment</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">center</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">FlutterLogo</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">size</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">80</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">20</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Align Me!'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> style</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextStyle</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">fontSize</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">24</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><br></span></code></pre></div></div>
<p>The widget's key Properties are:</p>
<ul>
<li class=""><code>color</code>: The color of the grid lines</li>
<li class=""><code>interval</code>: The distance in logical pixels between the major grid lines</li>
<li class=""><code>divisions</code>: The number of major grid lines</li>
<li class=""><code>subdivisions</code>: The number of smaller lines within each major grid division</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="gridpaper-under-the-hood">GridPaper Under the Hood<a href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/#gridpaper-under-the-hood" class="hash-link" aria-label="Direct link to GridPaper Under the Hood" title="Direct link to GridPaper Under the Hood" translate="no">​</a></h4>
<p>Here is the <a href="https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/widgets/grid_paper.dart" target="_blank" rel="noopener noreferrer" class="">source code for GridPaper</a>:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_GridPaperPainter</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CustomPainter</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">paint</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Canvas</span><span class="token plain"> canvas</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Size</span><span class="token plain"> size</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Paint</span><span class="token plain"> linePaint </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Paint</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">color </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> color</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">double</span><span class="token plain"> allDivisions </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">divisions </span><span class="token operator" style="color:#00bff9">*</span><span class="token plain"> subdivisions</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">toDouble</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">double</span><span class="token plain"> x </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0.0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> x </span><span class="token operator" style="color:#00bff9">&lt;=</span><span class="token plain"> size</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">width</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> x </span><span class="token operator" style="color:#00bff9">+=</span><span class="token plain"> interval </span><span class="token operator" style="color:#00bff9">/</span><span class="token plain"> allDivisions</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      linePaint</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">strokeWidth </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">x </span><span class="token operator" style="color:#00bff9">%</span><span class="token plain"> interval </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0.0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1.0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">x </span><span class="token operator" style="color:#00bff9">%</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">interval </span><span class="token operator" style="color:#00bff9">/</span><span class="token plain"> subdivisions</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0.0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0.5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0.25</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      canvas</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">drawLine</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Offset</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">x</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0.0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Offset</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">x</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> size</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> linePaint</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">double</span><span class="token plain"> y </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0.0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> y </span><span class="token operator" style="color:#00bff9">&lt;=</span><span class="token plain"> size</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> y </span><span class="token operator" style="color:#00bff9">+=</span><span class="token plain"> interval </span><span class="token operator" style="color:#00bff9">/</span><span class="token plain"> allDivisions</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      linePaint</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">strokeWidth </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">y </span><span class="token operator" style="color:#00bff9">%</span><span class="token plain"> interval </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0.0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1.0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">y </span><span class="token operator" style="color:#00bff9">%</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">interval </span><span class="token operator" style="color:#00bff9">/</span><span class="token plain"> subdivisions</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0.0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0.5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0.25</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      canvas</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">drawLine</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Offset</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">0.0</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> y</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Offset</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">size</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">width</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> y</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> linePaint</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">shouldRepaint</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">_GridPaperPainter</span><span class="token plain"> oldPainter</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> oldPainter</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">color </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> color </span><span class="token operator" style="color:#00bff9">||</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        oldPainter</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">interval </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> interval </span><span class="token operator" style="color:#00bff9">||</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        oldPainter</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">divisions </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> divisions </span><span class="token operator" style="color:#00bff9">||</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        oldPainter</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">subdivisions </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> subdivisions</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">hitTest</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Offset</span><span class="token plain"> position</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">GridPaper</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Color</span><span class="token plain"> color</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">double</span><span class="token plain"> interval</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> divisions</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> subdivisions</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CustomPaint</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      foregroundPainter</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_GridPaperPainter</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> color</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        interval</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> interval</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        divisions</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> divisions</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        subdivisions</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> subdivisions</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>GridPaper is built using a <code>CustomPaint</code> widget with <code>_GridPaperPainter</code> as its foreground painter.
The painter simply draws vertical and horizontal lines spaced by the interval, with different stroke widths for major, minor, and subdivision lines.</p>
<p>By combining these evenly spaced strokes, Flutter renders a rectilinear grid across the widget’s surface, almost like graph paper laid over your UI. Because it’s painted directly on the canvas, it doesn’t interfere with the child widget beneath it; it’s purely a visual overlay.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="gridpaper-practical-full-example">GridPaper Practical Full Example<a href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/#gridpaper-practical-full-example" class="hash-link" aria-label="Direct link to GridPaper Practical Full Example" title="Direct link to GridPaper Practical Full Example" translate="no">​</a></h4>
<p>Here's an example showing <code>GridPaper</code> in action as you have seen in the video above:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/material.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">main</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token function" style="color:#87aff4">runApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MaterialApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      debugShowCheckedModeBanner</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      home</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Scaffold</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        appBar</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AppBar</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          title</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'GridPaper Demo'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        body</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Center</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">GridPaper</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">red</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            interval</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">100</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            divisions</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            subdivisions</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">4</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              width</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">300</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">400</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Column</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                mainAxisAlignment</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MainAxisAlignment</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">center</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">FlutterLogo</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">size</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">80</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">20</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                    </span><span class="token string-literal string" style="color:#e1ffe4">'Align Me!'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                    style</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextStyle</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">fontSize</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">24</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Padding</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                    padding</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">EdgeInsets</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">16.0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                    child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                      </span><span class="token string-literal string" style="color:#e1ffe4">'Use the grid to check if I am perfectly centered.'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                      textAlign</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextAlign</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">center</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>As said, <code>GridPaper</code> is particularly useful when you're trying to achieve pixel-perfect layouts or when working with designers who need precise alignment verification. You can easily toggle it on and off during development to check your layout precision.</p>
<div class="formWrapper_FeQU"><p class="formTitle_o9oT">Enjoying this article?</p><p>Subscribe to get our latest articles and product updates by email.</p><form class="footerForm_u4Zn"><input class="trialInput_rT6u" type="email" placeholder="Email address" name="blogEmail"><button type="submit" class="button button--primary button--sm formButton_cuTv">Subscribe</button></form></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="layerlink">LayerLink<a href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/#layerlink" class="hash-link" aria-label="Direct link to LayerLink" title="Direct link to LayerLink" translate="no">​</a></h2>
<p>The <code>LayerLink</code> is a fascinating widget system that connects two widgets across the widget tree, allowing one widget (the follower) to be positioned relative to another widget (the target), even when they're not direct parent-child relationships.</p>
<center><video width="65%" controls="" autoplay="" playsinline=""><source src="/video/2025-10-30/layerlink.mp4"></video></center>
<p>Think of it as an invisible wire connecting two widgets, no matter where the target moves, the follower maintains its relative position.</p>
<p><code>LayerLink</code> works with two companion widgets:</p>
<ul>
<li class=""><code>CompositedTransformTarget</code>: The "anchor" widget that other widgets can follow</li>
<li class=""><code>CompositedTransformFollower</code>: The widget that positions itself relative to the target</li>
</ul>
<p>This system is particularly useful for dropdown menus, tooltips, and custom overlays that need to stay positioned relative to a specific UI element.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">LayerLink</span><span class="token plain"> _layerLink </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">LayerLink</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// The target widget</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">CompositedTransformTarget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  link</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _layerLink</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ElevatedButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    onPressed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _toggleDropdown</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Menu'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// The follower widget (usually in an Overlay)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token class-name" style="color:#7fdbca">CompositedTransformFollower</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  link</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _layerLink</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  showWhenUnlinked</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  targetAnchor</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Alignment</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">bottomLeft</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  offset</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Offset</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">8</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Material</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    elevation</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">4.0</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Container</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      padding</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">EdgeInsets</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">8.0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Column</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        mainAxisSize</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MainAxisSize</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">min</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Option 1'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token class-name" style="color:#7fdbca">Divider</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Option 2'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="layerlink-under-the-hood">LayerLink Under the Hood<a href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/#layerlink-under-the-hood" class="hash-link" aria-label="Direct link to LayerLink Under the Hood" title="Direct link to LayerLink Under the Hood" translate="no">​</a></h4>
<p><code>LayerLink</code> creates a connection between a <code>LeaderLayer</code> and <code>FollowerLayer</code> at the rendering level. You can check the full <a href="https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/rendering/layer.dart" target="_blank" rel="noopener noreferrer" class="">source code</a> on the Flutter repository.</p>
<p>Here is an abstract, pseudocode of the implementation:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// Shared rendezvous</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">LayerLink</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">LeaderLayer</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> leader</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_registerLeader</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">LeaderLayer</span><span class="token plain"> l</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> leader </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> l</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain">     </span><span class="token comment" style="color:#999999">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_unregisterLeader</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">LeaderLayer</span><span class="token plain"> l</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">leader </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> l</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> leader </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// Leader: created by CompositedTransformTarget</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">LeaderLayer</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ContainerLayer</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">LeaderLayer</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">LayerLink</span><span class="token plain"> link</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Offset</span><span class="token plain"> offset </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Offset</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">zero</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">LayerLink</span><span class="token plain"> link</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Offset</span><span class="token plain"> offset</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">attach</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Object</span><span class="token plain"> owner</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">attach</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">owner</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    link</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">_registerLeader</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">detach</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    link</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">_unregisterLeader</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">detach</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">addToScene</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">SceneBuilder</span><span class="token plain"> b</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:#999999">// Collapse offset into a transform, children see Offset.zero.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">offset </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Offset</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">zero</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      b</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">pushTransform</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token function" style="color:#87aff4">translate</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">offset</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token function" style="color:#87aff4">addChildrenToScene</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">b</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      b</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">pop</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token function" style="color:#87aff4">addChildrenToScene</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">b</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">applyTransform</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Layer</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Matrix4</span><span class="token plain"> m</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    m</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">translate</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">offset</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">dx</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> offset</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">dy</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// Follower: created by CompositedTransformFollower</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">FollowerLayer</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ContainerLayer</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">FollowerLayer</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">LayerLink</span><span class="token plain"> link</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> showWhenUnlinked </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Offset</span><span class="token plain"> unlinkedOffset </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Offset</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">zero</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Offset</span><span class="token plain"> linkedOffset </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Offset</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">zero</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">LayerLink</span><span class="token plain"> link</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> showWhenUnlinked</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Offset</span><span class="token plain"> unlinkedOffset</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Offset</span><span class="token plain"> linkedOffset</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">get</span><span class="token plain"> alwaysNeedsAddToScene </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// recompute every frame</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">addToScene</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">SceneBuilder</span><span class="token plain"> b</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">link</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">leader </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">!</span><span class="token plain">showWhenUnlinked</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">return</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:#999999">// M = inverse(follower→ancestor) * (leader→ancestor) * translate(linkedOffset)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Matrix4</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">M</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_establishTransformOrFallback</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">unlinkedOffset</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> link</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">leader</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> linkedOffset</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    b</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">pushTransform</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">M</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">storage</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token function" style="color:#87aff4">addChildrenToScene</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">b</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    b</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">pop</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p><code>CompositedTransformTarget</code> and <code>CompositedTransformFollower</code> are a duo for spatial relationships in Flutter. The target inserts a <code>LeaderLayer</code> that registers itself with a shared <code>LayerLink</code>. Anywhere else in the layer tree, the follower inserts a <code>FollowerLayer</code> with the same link. During composition, the follower asks, "Where’s my leader?" and, if present, computes a matrix that maps its own space into the leader’s space:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// M = inverse(follower→commonAncestor)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">//    * (leader→commonAncestor)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">//    * translate(linkedOffset)</span><br></span></code></pre></div></div>
<p>It then pushes <code>M</code> so its children render as if they’re attached to the leader—great for anchored menus, tooltips, FAB-to-sheet transitions, and context-aware overlays—without manual global-to-local math or extra rebuilds. If the leader isn’t present and <code>showWhenUnlinked</code> is <code>true</code>, the follower simply falls back to <code>unlinkedOffset</code>.</p>
<p>The <code>LeaderLayer</code> also "collapses" its offset into a transform and passes <code>Offset.zero</code> to its children. That subtle choice ensures the transform chain is consistent, so the follower’s mapping is stable and accurate.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="design-patterns-lessons">Design Patterns Lessons<a href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/#design-patterns-lessons" class="hash-link" aria-label="Direct link to Design Patterns Lessons" title="Direct link to Design Patterns Lessons" translate="no">​</a></h4>
<p>Looking at this smart implementation shows how you can blend design patterns and how important they could be in building software and applications:</p>
<ul>
<li class=""><strong>Observer (pull-based)</strong>: the follower "observes" the leader’s state each frame via the shared <code>LayerLink</code>.</li>
<li class=""><strong>Mediator</strong>: <code>LayerLink</code> decouples leader and follower, neither holds a direct reference to the other.</li>
<li class=""><strong>Bridge (architectural)</strong>: widgets (<code>CompositedTransformTarget/Follower</code>) cleanly bridge high-level UI to the low-level layer tree and engine transforms.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="layerlink-practical-full-example">LayerLink Practical Full Example<a href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/#layerlink-practical-full-example" class="hash-link" aria-label="Direct link to LayerLink Practical Full Example" title="Direct link to LayerLink Practical Full Example" translate="no">​</a></h4>
<p>Here's a complete example showing a dropdown menu implementation using LayerLink:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/material.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">main</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token function" style="color:#87aff4">runApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MaterialApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      debugShowCheckedModeBanner</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      home</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">LayerLinkDropdownExample</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">LayerLinkDropdownExample</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatefulWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">LayerLinkDropdownExample</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">LayerLinkDropdownExample</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">createState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_LayerLinkDropdownExampleState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_LayerLinkDropdownExampleState</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">LayerLinkDropdownExample</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">LayerLink</span><span class="token plain"> _layerLink </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">LayerLink</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">OverlayEntry</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> _overlayEntry</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> _isDropdownOpen </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_toggleDropdown</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_isDropdownOpen</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token function" style="color:#87aff4">_hideDropdown</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token function" style="color:#87aff4">_showDropdown</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_showDropdown</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    _overlayEntry </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_createDropdownEntry</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Overlay</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">of</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">insert</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_overlayEntry</span><span class="token operator" style="color:#00bff9">!</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token function" style="color:#87aff4">setState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      _isDropdownOpen </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_hideDropdown</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    _overlayEntry</span><span class="token operator" style="color:#00bff9">?</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">remove</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    _overlayEntry </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token function" style="color:#87aff4">setState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      _isDropdownOpen </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">OverlayEntry</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_createDropdownEntry</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">OverlayEntry</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      builder</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CompositedTransformFollower</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          link</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _layerLink</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          showWhenUnlinked</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          targetAnchor</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Alignment</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">bottomLeft</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          offset</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Offset</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">8</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Material</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            elevation</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">4.0</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            borderRadius</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BorderRadius</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">circular</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">8</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Container</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              padding</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">EdgeInsets</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">8.0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              decoration</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BoxDecoration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">white</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                borderRadius</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BorderRadius</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">circular</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">8</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Column</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                mainAxisSize</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MainAxisSize</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">min</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Option 1'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token class-name" style="color:#7fdbca">Divider</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Option 2'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token class-name" style="color:#7fdbca">Divider</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Logout'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Scaffold</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      appBar</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AppBar</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">title</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Dropdown Menu with LayerLink'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      body</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Padding</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        padding</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">EdgeInsets</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">20.0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Column</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          crossAxisAlignment</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CrossAxisAlignment</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">start</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token string-literal string" style="color:#e1ffe4">"Press the button to show a menu that is perfectly aligned using LayerLink."</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              style</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextStyle</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">fontSize</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">16</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">20</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token class-name" style="color:#7fdbca">CompositedTransformTarget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              link</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _layerLink</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ElevatedButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                onPressed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _toggleDropdown</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Row</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  mainAxisSize</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MainAxisSize</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">min</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                    </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Menu'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                    </span><span class="token class-name" style="color:#7fdbca">Icon</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                      _isDropdownOpen</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                          </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Icons</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">arrow_drop_up</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                          </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Icons</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">arrow_drop_down</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>The beauty is that the follower automatically adjusts its position when the target moves, scrolls, or transforms, making it perfect for responsive overlay elements.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tickermode">TickerMode<a href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/#tickermode" class="hash-link" aria-label="Direct link to TickerMode" title="Direct link to TickerMode" translate="no">​</a></h2>
<p>The <code>TickerMode</code> widget is a performance optimization tool that controls whether animations are running in a specific part of your app's widget tree. By wrapping widgets with <code>TickerMode</code>, you can enable or disable all animations (like those driven by <code>AnimationController</code>) for that widget and all of its descendants.</p>
<center><video width="65%" controls="" autoplay="" playsinline=""><source src="/video/2025-10-30/tickermode.mp4"></video></center>
<p>This widget is particularly valuable for performance optimization and state management. Common use cases include pausing off-screen animations in PageView or ListView, implementing accessibility preferences for users who prefer reduced motion, and temporarily halting animations during network requests or loading states.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">TickerMode</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  enabled</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// Disables all animations in the subtree</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AnimatedContainer</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    duration</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Duration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">seconds</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> isBlue </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">blue </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">red</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'This animation is paused!'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="tickermode-under-the-hood">TickerMode Under the Hood<a href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/#tickermode-under-the-hood" class="hash-link" aria-label="Direct link to TickerMode Under the Hood" title="Direct link to TickerMode Under the Hood" translate="no">​</a></h4>
<p>The <code>TickerMode</code> widget works by controlling the <code>TickerProvider</code> system that Flutter uses for animations. Here is the <a href="https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/widgets/ticker_provider.dart" target="_blank" rel="noopener noreferrer" class="">source code</a>.</p>
<p><code>TickerMode</code> is the global on/off switch for animations in a subtree. It wraps your content in an <code>_EffectiveTickerMode (an InheritedWidget)</code> that carries two things: the current enabled flag and a <code>ValueNotifier&lt;bool&gt;</code> that broadcasts changes.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// Rest of the code</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TickerMode</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatefulWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> enabled</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">static</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">of</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> c</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> c</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token generic-function" style="color:#87aff4">dependOn</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">_EffectiveTickerMode</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token operator" style="color:#00bff9">?</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">enabled </span><span class="token operator" style="color:#00bff9">?</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">static</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ValueListenable</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">bool</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">getNotifier</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> c</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      c</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token generic-function" style="color:#87aff4">get</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">_EffectiveTickerMode</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token operator" style="color:#00bff9">?</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">notifier </span><span class="token operator" style="color:#00bff9">?</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_ConstantValueListenable</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">TickerMode</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">createState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_TickerModeState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_TickerModeState</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">TickerMode</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> _ancestor </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// TickerMode.of(context)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> _effective </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ValueNotifier</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">bool</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">didChangeDependencies</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    _ancestor </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TickerMode</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">of</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    _effective</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">value </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> _ancestor </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> widget</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">enabled</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">didUpdateWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">TickerMode</span><span class="token plain"> old</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    _effective</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">value </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> _ancestor </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> widget</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">enabled</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> _</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_EffectiveTickerMode</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    enabled</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _effective</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    notifier</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _effective</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> widget</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">child</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// Inherited carrier</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_EffectiveTickerMode</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">InheritedWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Rest of the code</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// One ticker</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">mixin</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SingleTickerProviderStateMixin</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics"> </span><span class="token generics keyword" style="color:#00bff9">extends</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">StatefulWidget</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">on</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">implements</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TickerProvider</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Rest of the code</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// Many tickers</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">mixin</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TickerProviderStateMixin</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics"> </span><span class="token generics keyword" style="color:#00bff9">extends</span><span class="token generics"> </span><span class="token generics class-name" style="color:#7fdbca">StatefulWidget</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">on</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">T</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">implements</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TickerProvider</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Rest of the code</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>When <code>TickerMode.enabled == false</code>, tickers are muted under that subtree. Animations don’t "rewind" or lose time; their tick callbacks just stop firing while muted. Time still progresses.</p>
<p>When enabled flips back to true, tickers resume and controllers continue from the current time.</p>
<p>On the consumer side, the standard mixins you already use for animations are ticker-mode–aware:</p>
<ul>
<li class=""><code>SingleTickerProviderStateMixin</code> (one controller)</li>
<li class=""><code>TickerProviderStateMixin</code> (many controllers)</li>
</ul>
<p>both call <code>TickerMode.getNotifier(context)</code> and subscribe. Whenever the ticker mode changes, they set <code>ticker.muted = !enabled</code>. This is why simply placing a <code>TickerMode(enabled: false, child: ...)</code> above your screen pauses all animations created with the widget-aware providers—no extra plumbing.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="tickermode-practical-full-example">TickerMode Practical Full Example<a href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/#tickermode-practical-full-example" class="hash-link" aria-label="Direct link to TickerMode Practical Full Example" title="Direct link to TickerMode Practical Full Example" translate="no">​</a></h4>
<p>Here's a practical example showing <code>TickerMode</code> in action that you have seen in the video above:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/material.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'dart:math'</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">as</span><span class="token plain"> math</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">main</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token function" style="color:#87aff4">runApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MaterialApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      debugShowCheckedModeBanner</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      home</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TickerModeExample</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TickerModeExample</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatefulWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TickerModeExample</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">TickerModeExample</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">createState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_TickerModeExampleState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_TickerModeExampleState</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">TickerModeExample</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999">// A boolean to control the TickerMode's `enabled` property.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> _animationsEnabled </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Scaffold</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      appBar</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AppBar</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">title</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'TickerMode Demo'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      body</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Center</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Column</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          mainAxisAlignment</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MainAxisAlignment</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">center</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token comment" style="color:#999999">// This Switch controls the TickerMode below.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token class-name" style="color:#7fdbca">Row</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              mainAxisAlignment</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MainAxisAlignment</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">center</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  _animationsEnabled </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Animations ON'</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Animations OFF'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  style</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextStyle</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">fontSize</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">18</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">width</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">10</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token class-name" style="color:#7fdbca">Switch</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  value</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _animationsEnabled</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  onChanged</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                    </span><span class="token function" style="color:#87aff4">setState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                      _animationsEnabled </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> value</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">50</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token comment" style="color:#999999">// The TickerMode widget.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token comment" style="color:#999999">// It will enable or disable animations for everything inside it.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token class-name" style="color:#7fdbca">TickerMode</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              enabled</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _animationsEnabled</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SpinningContainer</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">/// A widget with a continuous, repeating animation.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SpinningContainer</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatefulWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SpinningContainer</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">SpinningContainer</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">createState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_SpinningContainerState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_SpinningContainerState</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">SpinningContainer</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">with</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SingleTickerProviderStateMixin</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">late</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AnimationController</span><span class="token plain"> _controller</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">initState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">initState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    _controller </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AnimationController</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      vsync</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      duration</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Duration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">seconds</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">5</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">repeat</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// The animation starts repeating immediately.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">dispose</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    _controller</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">dispose</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">dispose</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AnimatedBuilder</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      animation</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _controller</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      builder</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Transform</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">rotate</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          angle</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _controller</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">value </span><span class="token operator" style="color:#00bff9">*</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">*</span><span class="token plain"> math</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">pi</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Container</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            width</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">150</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">150</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">blue</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Center</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token string-literal string" style="color:#e1ffe4">'I am animating!'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                style</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextStyle</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">white</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> fontSize</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">16</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p><code>TickerMode</code> is incredibly useful when you want to optimize performance by disabling animations that are not currently visible to the user, or when implementing accessibility features for users who prefer reduced motion.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="enforcing-new-widgets-for-advanced-use-cases">Enforcing New Widgets for Advanced Use Cases<a href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/#enforcing-new-widgets-for-advanced-use-cases" class="hash-link" aria-label="Direct link to Enforcing New Widgets for Advanced Use Cases" title="Direct link to Enforcing New Widgets for Advanced Use Cases" translate="no">​</a></h3>
<p>Discovering a powerful widget like <code>TickerMode</code> is great, but how do you ensure your entire team starts using it and stops using an old, custom-built, or less-efficient alternative?</p>
<p>Perhaps your codebase already has a custom <code>MyAnimationPauser</code> widget that developers are used to. This is where a static analysis tool like <a href="https://dcm.dev/" target="_blank" rel="noopener noreferrer" class="">DCM</a> becomes essential for scaling knowledge.</p>
<p>Using <a href="https://dcm.dev/docs/rules/common/banned-usage/" target="_blank" rel="noopener noreferrer" class="">DCM's banned-usage rule</a>, you can gently guide your entire team to adopt this new, better widget. You would simply add a rule to your <code>analysis_options.yaml</code>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">rules</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">banned-usage</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">entries</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">type</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> MyAnimationPauser</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token key atrule" style="color:#6dbdfa">entries</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> new</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token key atrule" style="color:#6dbdfa">description</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  'Deprecated. Use the built</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">in TickerMode widget instead to</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  pause/resume animations in a subtree.'</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> call</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token key atrule" style="color:#6dbdfa">description</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  'Deprecated. Use the built</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">in TickerMode widget instead to</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  pause/resume animations in a subtree.'</span><br></span></code></pre></div></div>
<p>Now, any time a developer on your team tries to use the old <code>MyAnimationPauser</code>, the linter will immediately flag it,</p>
<p><img decoding="async" loading="lazy" alt="banned-usage  rule" src="https://dcm.dev/assets/images/banned-usage-demo-c197da8a60e95206ade3ae7d3a96fd34.webp" width="2006" height="614" class="img_ev3q"></p>
<p>show them the reason right in their IDE, and point them to <code>TickerMode</code>.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">$ dcm analyze .</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">lib/main.dart </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">1</span><span class="token plain"> issue</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain">:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">WARNING   Deprecated. Use the built-in TickerMode widget instead to pause/resume animations </span><span class="token keyword" style="color:#00bff9">in</span><span class="token plain"> a subtree. </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">MyAnimationPauser.new is banned</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain">.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          at lib/main.dart:51:13</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          banned-usage </span><span class="token builtin class-name" style="color:#7fdbca">:</span><span class="token plain"> https://dcm.dev/docs/rules/common/banned-usage</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Scanned folders: </span><span class="token number" style="color:#8dec95">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Scanned files: </span><span class="token number" style="color:#8dec95">42</span><br></span></code></pre></div></div>
<p>It’s a fantastic way to enforce new best practices and make sure these "hidden gems" actually get used.</p>
<div class="wrapper_plzk"><p>DCM is a code quality tool that helps your team move faster by reducing the time spent on code reviews, finding tricky bugs, identifying complex code, and unifying code style.</p><div class="heroButtons_DVKJ"><a class="button button--primary button--md" href="https://dcm.dev/pricing/">Start for Free</a><a class="button button--secondary button--md demo-button" href="https://dcm.dev/demo/"><svg width="12" height="17" viewBox="0 0 12 17" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M11.4742 7.67501C12.054 8.0722 12.054 8.92781 11.4742 9.32499L1.60147 16.0881C0.937832 16.5427 0.0363247 16.0675 0.0363247 15.2631L0.0363253 1.73691C0.0363253 0.932494 0.937834 0.457306 1.60147 0.911917L11.4742 7.67501Z" fill="#000"></path></svg>Watch Demo</a></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sensitivecontent">SensitiveContent<a href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/#sensitivecontent" class="hash-link" aria-label="Direct link to SensitiveContent" title="Direct link to SensitiveContent" translate="no">​</a></h2>
<p>The SensitiveContent widget is a security-focused widget introduced for Android 15+ that marks parts of your UI as containing sensitive information. Its primary purpose is to signal to the operating system that the screen should be obscured during screen sharing or screen recording to protect user privacy.</p>
<center><video width="65%" controls="" autoplay="" playsinline=""><source src="/video/2025-10-30/sensitivecontent.mp4"></video></center>
<p>Think of it as the digital equivalent of covering a document when someone is looking over your shoulder. When your app displays passwords, financial details, or personal messages, you can wrap that content in SensitiveContent to prevent accidental exposure during screen capture sessions.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">SensitiveContent</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  sensitivityLevel</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ContentSensitivity</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">sensitive</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextField</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    obscureText</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    decoration</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">InputDecoration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      labelText</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Password'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      hintText</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Enter your password'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><br></span></code></pre></div></div>
<p>The <code>SensitiveContent</code> widget supports three sensitivity levels:</p>
<ul>
<li class=""><code>ContentSensitivity.sensitive</code>: The highest priority setting that ensures the screen remains obscured</li>
<li class=""><code>ContentSensitivity.autoSensitive</code>: Second priority, relies on system heuristics to determine sensitivity</li>
<li class=""><code>ContentSensitivity.notSensitive</code>: Lowest priority, explicitly marks content as not sensitive</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="sensitivecontent-under-the-hood">SensitiveContent Under the Hood<a href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/#sensitivecontent-under-the-hood" class="hash-link" aria-label="Direct link to SensitiveContent Under the Hood" title="Direct link to SensitiveContent Under the Hood" translate="no">​</a></h4>
<p>Here is the <a href="https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/widgets/sensitive_content.dart" target="_blank" rel="noopener noreferrer" class="">source code for SensitiveContent</a>:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// Counters for what's currently in the tree (priority: sensitive &gt; auto &gt; not)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_ContentSensitivitySetting</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">int</span><span class="token plain"> sensitive </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> auto </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> notSensitive </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">add</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">ContentSensitivity</span><span class="token plain"> s</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"> </span><span class="token comment" style="color:#999999">/* ++counter for s */</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">remove</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">ContentSensitivity</span><span class="token plain"> s</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"> </span><span class="token comment" style="color:#999999">/* --counter for s (assert non-negative) */</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">get</span><span class="token plain"> hasWidgets </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">sensitive </span><span class="token operator" style="color:#00bff9">+</span><span class="token plain"> auto </span><span class="token operator" style="color:#00bff9">+</span><span class="token plain"> notSensitive</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">ContentSensitivity</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">get</span><span class="token plain"> current </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">sensitive </span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ContentSensitivity</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">sensitive</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">auto </span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ContentSensitivity</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">autoSensitive</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">notSensitive </span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ContentSensitivity</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">notSensitive</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// Process coordinator + platform bridge (singleton)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SensitiveContentHost</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> instance </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SensitiveContentHost</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">_</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">SensitiveContentHost</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">_</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> _svc </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SensitiveContentService</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain">               </span><span class="token comment" style="color:#999999">// platform channel</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> _counts </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_ContentSensitivitySetting</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> _isSupported</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain">                                   </span><span class="token comment" style="color:#999999">// cached capability</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">ContentSensitivity</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> _fallback</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain">                        </span><span class="token comment" style="color:#999999">// platform’s pre-existing mode</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">static</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics keyword" style="color:#00bff9">void</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">register</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">ContentSensitivity</span><span class="token plain"> s</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> instance</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">_register</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">s</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">static</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics keyword" style="color:#00bff9">void</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">unregister</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">ContentSensitivity</span><span class="token plain"> s</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> instance</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">_unregister</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">s</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics keyword" style="color:#00bff9">void</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_register</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">ContentSensitivity</span><span class="token plain"> s</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    _isSupported </span><span class="token operator" style="color:#00bff9">?</span><span class="token operator" style="color:#00bff9">?</span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> _svc</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">isSupported</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">onError</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> __</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token operator" style="color:#00bff9">!</span><span class="token plain">_isSupported</span><span class="token operator" style="color:#00bff9">!</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">return</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    _fallback </span><span class="token operator" style="color:#00bff9">?</span><span class="token operator" style="color:#00bff9">?</span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> _svc</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">getContentSensitivity</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">onError</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> __</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ContentSensitivity</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">notSensitive</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> before </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> _counts</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">current </span><span class="token operator" style="color:#00bff9">?</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> _fallback</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    _counts</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">add</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">s</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> after </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> _counts</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">current</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">after </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> after </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> before</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> _svc</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">setContentSensitivity</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">after</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">catchError</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_report</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics keyword" style="color:#00bff9">void</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_unregister</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">ContentSensitivity</span><span class="token plain"> s</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">assert</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_isSupported </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain">                        </span><span class="token comment" style="color:#999999">// must have registered first</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token operator" style="color:#00bff9">!</span><span class="token plain">_isSupported</span><span class="token operator" style="color:#00bff9">!</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">return</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> before </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> _counts</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">current</span><span class="token operator" style="color:#00bff9">!</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    _counts</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">remove</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">s</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token operator" style="color:#00bff9">!</span><span class="token plain">_counts</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">hasWidgets</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_fallback </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> before</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> _svc</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">setContentSensitivity</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_fallback</span><span class="token operator" style="color:#00bff9">!</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">catchError</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_report</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">return</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> restore </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> _counts</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">current</span><span class="token operator" style="color:#00bff9">!</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">restore </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> before</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> _svc</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">setContentSensitivity</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">restore</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">catchError</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_report</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_report</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Object</span><span class="token plain"> e</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"> </span><span class="token comment" style="color:#999999">/* FlutterError.reportError(...) */</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// Public widget: participates in global sensitivity via Host</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SensitiveContent</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatefulWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ContentSensitivity</span><span class="token plain"> sensitivity</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> child</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SensitiveContent</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">sensitivity</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">child</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">createState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_SensitiveContentState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_SensitiveContentState</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">SensitiveContent</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics keyword" style="color:#00bff9">void</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> _pending </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Future</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">value</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">initState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">initState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    _pending </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SensitiveContentHost</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">register</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">widget</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">sensitivity</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">didUpdateWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">SensitiveContent</span><span class="token plain"> old</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">didUpdateWidget</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">old</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">old</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">sensitivity </span><span class="token operator" style="color:#00bff9">!=</span><span class="token plain"> widget</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">sensitivity</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      _pending </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SensitiveContentHost</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">register</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">widget</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">sensitivity</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">await</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SensitiveContentHost</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">unregister</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">old</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">sensitivity</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">dispose</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">SensitiveContentHost</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">unregister</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">widget</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">sensitivity</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">dispose</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> _</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">FutureBuilder</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">future</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _pending</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> builder</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> snap</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      snap</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">connectionState </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ConnectionState</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">done </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> widget</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">child </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">shrink</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p><code>SensitiveContent</code> works by coordinating with a global singleton called <strong><code>SensitiveContentHost</code></strong>, which keeps track of all widgets that declare themselves as sensitive.</p>
<p>When a widget mounts, it <strong>registers</strong> its sensitivity level (<code>sensitive</code>, <code>autoSensitive</code>, or <code>notSensitive</code>) with the host. The host maintains simple counters for each type and determines the <strong>effective mode</strong> using a priority rule:
<code>sensitive &gt; autoSensitive &gt; notSensitive</code>.</p>
<p>If the effective mode changes, the host calls <code>SensitiveContentService.setContentSensitivity()</code> on the platform side, which tells Android to obscure or reveal the screen appropriately. When the last sensitive widget is removed, it restores the platform’s original sensitivity.</p>
<p>The widget itself manages this lifecycle automatically, it registers in <code>initState</code>, re-registers if the sensitivity changes, and unregisters on <code>dispose</code>. A small <code>FutureBuilder</code> delay ensures the content is shown only after registration completes, reducing the risk of sensitive data flashing briefly.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="sensitivecontent-practical-full-example">SensitiveContent Practical Full Example<a href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/#sensitivecontent-practical-full-example" class="hash-link" aria-label="Direct link to SensitiveContent Practical Full Example" title="Direct link to SensitiveContent Practical Full Example" translate="no">​</a></h4>
<p>Here's a practical example demonstrating <code>SensitiveContent</code> usage but you must run that on Android device:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/material.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/services.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// Required for ContentSensitivity</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">main</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token function" style="color:#87aff4">runApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MaterialApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      debugShowCheckedModeBanner</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      home</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SensitiveContentExample</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SensitiveContentExample</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatefulWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SensitiveContentExample</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">SensitiveContentExample</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">createState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token class-name" style="color:#7fdbca">_SensitiveContentExampleState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_SensitiveContentExampleState</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">SensitiveContentExample</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> _isSecretVisible </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Scaffold</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      appBar</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AppBar</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">title</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'SensitiveContent Demo'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      body</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Center</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Padding</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          padding</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">EdgeInsets</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">20.0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Column</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            mainAxisAlignment</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MainAxisAlignment</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">center</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token string-literal string" style="color:#e1ffe4">'This is public information that can always be seen.'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                textAlign</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextAlign</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">center</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                style</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextStyle</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">fontSize</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">18</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">30</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token class-name" style="color:#7fdbca">ElevatedButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                onPressed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token function" style="color:#87aff4">setState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                    _isSecretVisible </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">!</span><span class="token plain">_isSecretVisible</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_isSecretVisible </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Hide Secret'</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Show Secret'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">30</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token comment" style="color:#999999">// This is the widget that conditionally displays the sensitive info.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_isSecretVisible</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token comment" style="color:#999999">// The SensitiveContent widget wraps our secret data.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token class-name" style="color:#7fdbca">SensitiveContent</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token comment" style="color:#999999">// We mark the content as 'sensitive'.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  sensitivity</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ContentSensitivity</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">sensitive</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Container</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                    padding</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">EdgeInsets</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">20</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                    decoration</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BoxDecoration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                      color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">red</span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token number" style="color:#8dec95">100</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                      border</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Border</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">red</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                      borderRadius</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BorderRadius</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">circular</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">8</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                    child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Column</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                      children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                        </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                          </span><span class="token string-literal string" style="color:#e1ffe4">'SECRET CODE:'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                          style</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextStyle</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                            fontSize</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">16</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                            fontWeight</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">FontWeight</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">bold</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                            color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">red</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                        </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">8</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                        </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                          </span><span class="token string-literal string" style="color:#e1ffe4">'123-456-789'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                          style</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextStyle</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                            fontSize</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">24</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                            fontWeight</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">FontWeight</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">bold</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                      </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>Important Note: <code>SensitiveContent</code> currently only works on Android API 35+ (Android 15). On lower Android versions and other platforms, it has no effect. You can check if the device supports this feature using <code>SensitiveContentService.isSupported</code></p>
<div class="formWrapper_FeQU"><p class="formTitle_o9oT">Enjoying this article?</p><p>Subscribe to get our latest articles and product updates by email.</p><form class="footerForm_u4Zn"><input class="trialInput_rT6u" type="email" placeholder="Email address" name="blogEmail"><button type="submit" class="button button--primary button--sm formButton_cuTv">Subscribe</button></form></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="blocksemantics">BlockSemantics<a href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/#blocksemantics" class="hash-link" aria-label="Direct link to BlockSemantics" title="Direct link to BlockSemantics" translate="no">​</a></h2>
<p>The BlockSemantics widget is an accessibility control tool that prevents screen readers from accessing individual widgets within its child tree. Think of it as placing a "Do Not Disturb" sign on a group of widgets, screen readers will see the sign and ignore everything behind it.</p>
<center><video width="65%" controls="" autoplay="" playsinline=""><source src="/video/2025-10-30/semanticblock.mp4"></video></center>
<p>This widget is particularly useful when you have widgets that are visually behind other widgets (like a modal dialog overlay) but are still part of the widget tree. Without <code>BlockSemantics</code>, screen readers might read out potentially confusing or redundant information from widgets that aren't currently relevant to the user.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">BlockSemantics</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Container</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Column</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'This text will be ignored by screen readers'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token class-name" style="color:#7fdbca">ElevatedButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          onPressed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'This button will also be ignored'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="blocksemantics-under-the-hood">BlockSemantics Under the Hood<a href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/#blocksemantics-under-the-hood" class="hash-link" aria-label="Direct link to BlockSemantics Under the Hood" title="Direct link to BlockSemantics Under the Hood" translate="no">​</a></h4>
<p>The BlockSemantics widget works by creating a semantics boundary that prevents the propagation of semantic information from its children. It effectively creates a semantic "black hole" where accessibility services cannot penetrate to read the individual child widgets.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BlockSemantics</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SingleChildRenderObjectWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BlockSemantics</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">blocking </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">child</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> blocking</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">RenderBlockSemantics</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">createRenderObject</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token class-name" style="color:#7fdbca">RenderBlockSemantics</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">blocking</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> blocking</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">updateRenderObject</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">RenderBlockSemantics</span><span class="token plain"> renderObject</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    renderObject</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">blocking </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> blocking</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">debugFillProperties</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">DiagnosticPropertiesBuilder</span><span class="token plain"> properties</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:#999999">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>The render object <code>RenderBlockSemantics</code> overrides the semantic annotation methods to prevent child semantics from being included in the accessibility tree.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="blocksemantics-practical-full-example">BlockSemantics Practical Full Example<a href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/#blocksemantics-practical-full-example" class="hash-link" aria-label="Direct link to BlockSemantics Practical Full Example" title="Direct link to BlockSemantics Practical Full Example" translate="no">​</a></h4>
<p>Here's a complete example showing <code>BlockSemantics</code> in a modal dialog scenario:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/material.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">main</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token function" style="color:#87aff4">runApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MaterialApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      debugShowCheckedModeBanner</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      home</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BlockSemanticsDemo</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BlockSemanticsDemo</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatefulWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BlockSemanticsDemo</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">BlockSemanticsDemo</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">createState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_BlockSemanticsDemoState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">_BlockSemanticsDemoState</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">State</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">BlockSemanticsDemo</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> _showDialog </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> _useBlockSemantics </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_toggleDialog</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token function" style="color:#87aff4">setState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      _showDialog </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">!</span><span class="token plain">_showDialog</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_toggleBlockSemantics</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token function" style="color:#87aff4">setState</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      _useBlockSemantics </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">!</span><span class="token plain">_useBlockSemantics</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Scaffold</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      appBar</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AppBar</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        title</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'BlockSemantics Demo'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      body</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Stack</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token comment" style="color:#999999">// Background content</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token function" style="color:#87aff4">_buildBackgroundContent</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token comment" style="color:#999999">// Modal dialog overlay</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_showDialog</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_buildModalOverlay</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_buildBackgroundContent</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> backgroundContent </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Padding</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      padding</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">EdgeInsets</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">16.0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Column</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        crossAxisAlignment</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CrossAxisAlignment</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">stretch</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Card</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Padding</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              padding</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">EdgeInsets</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">16.0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Column</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                crossAxisAlignment</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CrossAxisAlignment</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">start</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                    </span><span class="token string-literal string" style="color:#e1ffe4">'Background Content'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                    style</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextStyle</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">fontSize</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">18</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> fontWeight</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">FontWeight</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">bold</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">8</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                    </span><span class="token string-literal string" style="color:#e1ffe4">'This content should be ignored by screen readers when the dialog is open.'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">16</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token class-name" style="color:#7fdbca">SwitchListTile</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            title</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Use BlockSemantics'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            subtitle</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Toggle to see accessibility difference'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            value</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _useBlockSemantics</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            onChanged</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_toggleBlockSemantics</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">16</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token class-name" style="color:#7fdbca">ElevatedButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            onPressed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _toggleDialog</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_showDialog </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Hide Dialog'</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Show Dialog'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">20</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token string-literal string" style="color:#e1ffe4">'Additional Background Elements'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            style</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextStyle</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">fontSize</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">16</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> fontWeight</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">FontWeight</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">bold</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">8</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token class-name" style="color:#7fdbca">ElevatedButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            onPressed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Background Action 1'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">8</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token class-name" style="color:#7fdbca">ElevatedButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            onPressed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Background Action 2'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">8</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextField</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            decoration</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">InputDecoration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              labelText</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Background Input'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              hintText</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'This should be blocked when dialog is open'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:#999999">// Apply BlockSemantics when dialog is shown and option is enabled</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">_showDialog </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> _useBlockSemantics</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BlockSemantics</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> backgroundContent</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> backgroundContent</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_buildModalOverlay</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Container</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">black54</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Center</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Card</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          margin</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">EdgeInsets</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">32.0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Padding</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            padding</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">EdgeInsets</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">24.0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Column</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              mainAxisSize</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MainAxisSize</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">min</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token string-literal string" style="color:#e1ffe4">'Modal Dialog'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  style</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextStyle</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">fontSize</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">20</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> fontWeight</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">FontWeight</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">bold</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">16</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token string-literal string" style="color:#e1ffe4">'This dialog should be the focus of screen readers. '</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token string-literal string" style="color:#e1ffe4">'Background content should be blocked from accessibility.'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">20</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token class-name" style="color:#7fdbca">Row</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  mainAxisAlignment</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MainAxisAlignment</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">spaceEvenly</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                    </span><span class="token class-name" style="color:#7fdbca">ElevatedButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                      onPressed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _toggleDialog</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Cancel'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                    </span><span class="token class-name" style="color:#7fdbca">ElevatedButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                      onPressed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> _toggleDialog</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                      child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Confirm'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p><code>BlockSemantics</code> is essential for creating accessible modal experiences where you want to ensure screen reader users focus only on the relevant content and aren't distracted by background elements.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="beveledrectangleborder">BeveledRectangleBorder<a href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/#beveledrectangleborder" class="hash-link" aria-label="Direct link to BeveledRectangleBorder" title="Direct link to BeveledRectangleBorder" translate="no">​</a></h2>
<p>The <code>BeveledRectangleBorder</code> is a shape class that creates rectangular shapes with angled, "cut-off" corners instead of the usual rounded or squared corners. This gives widgets a distinctive, sharp-edged appearance that's perfect for creating unique design elements with a geometric, cut-out style.</p>
<center><video width="65%" controls="" autoplay="" playsinline=""><source src="/video/2025-10-30/beveledrectangleborders.mp4"></video></center>
<p>You'll commonly use <code>BeveledRectangleBorder</code> with widgets like buttons, cards, and containers through their shape property to achieve that distinctive beveled look.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">Container</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  decoration</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ShapeDecoration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">blue</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    shape</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BeveledRectangleBorder</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      borderRadius</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BorderRadius</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">circular</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">16</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      side</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BorderSide</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">purple</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> width</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Beveled Container'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><br></span></code></pre></div></div>
<p>There are two key properties:</p>
<ul>
<li class=""><code>borderRadius</code>: Takes a BorderRadius value that determines how far from the corner the bevel begins. Larger radius values create more dramatic cut-off corners.</li>
<li class=""><code>side</code>: Allows you to define a border stroke around the shape, including color, width, and style</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="beveledrectangleborder-under-the-hood">BeveledRectangleBorder Under the Hood<a href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/#beveledrectangleborder-under-the-hood" class="hash-link" aria-label="Direct link to BeveledRectangleBorder Under the Hood" title="Direct link to BeveledRectangleBorder Under the Hood" translate="no">​</a></h4>
<p>The BeveledRectangleBorder extends <code>OutlinedBorder</code> and implements the <code>ShapeBorder</code> interface. Here is complete <a href="https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/painting/beveled_rectangle_border.dart" target="_blank" rel="noopener noreferrer" class="">source code</a> from the Flutter repository on Github.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BeveledRectangleBorder</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">OutlinedBorder</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BorderRadiusGeometry</span><span class="token plain"> borderRadius</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">ShapeBorder</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">scale</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">t</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BeveledRectangleBorder</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    side</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> side</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">scale</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">t</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> borderRadius</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> borderRadius </span><span class="token operator" style="color:#00bff9">*</span><span class="token plain"> t</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">ShapeBorder</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> lerpFrom</span><span class="token operator" style="color:#00bff9">/</span><span class="token class-name" style="color:#7fdbca">To</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">other</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> t</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> sameType</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BeveledRectangleBorder</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        side</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BorderSide</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">lerp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        borderRadius</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BorderRadiusGeometry</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">lerp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">lerpFrom</span><span class="token operator" style="color:#00bff9">/</span><span class="token class-name" style="color:#7fdbca">To</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">BeveledRectangleBorder</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">copyWith</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain">side</span><span class="token operator" style="color:#00bff9">?</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> borderRadius</span><span class="token operator" style="color:#00bff9">?</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Path</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_getPath</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">RRect</span><span class="token plain"> r</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:#999999">// Clamp radii to &gt;= 0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:#999999">// Build 8 vertices by “cutting” each corner toward the side center</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> verts </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Offset</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token comment" style="color:#999999">// TL edge points toward left &amp; top centers</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token comment" style="color:#999999">// TR, BR, BL similarly…</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Path</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">addPolygon</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">verts</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Path</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">getOuterPath</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Rect</span><span class="token plain"> rect</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token class-name" style="color:#7fdbca">TextDirection</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> td</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token function" style="color:#87aff4">_getPath</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">borderRadius</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">resolve</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">td</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">toRRect</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">rect</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Path</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">getInnerPath</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Rect</span><span class="token plain"> rect</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token class-name" style="color:#7fdbca">TextDirection</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> td</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token function" style="color:#87aff4">_getPath</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">borderRadius</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">resolve</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">td</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">toRRect</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">rect</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">deflate</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">side</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">strokeInset</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">paint</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Canvas</span><span class="token plain"> c</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Rect</span><span class="token plain"> rect</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token class-name" style="color:#7fdbca">TextDirection</span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> td</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">side</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">style </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BorderStyle</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">solid </span><span class="token operator" style="color:#00bff9">&amp;&amp;</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">!</span><span class="token plain">rect</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">isEmpty</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">RRect</span><span class="token plain"> r </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> borderRadius</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">resolve</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">td</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">toRRect</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">rect</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">RRect</span><span class="token plain"> inflated </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> r</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">inflate</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">side</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token plain">strokeOutset</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Path</span><span class="token plain"> stroke </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">_getPath</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">inflated</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">addPath</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token function" style="color:#87aff4">getInnerPath</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">rect</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> textDirection</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> td</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Offset</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">zero</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      c</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">drawPath</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">stroke</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> side</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">toPaint</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// ...</span><br></span></code></pre></div></div>
<p>This border is like <code>RoundedRectangleBorder</code>, but corners are straight cuts instead of arcs <code>_getPath</code> computes an octagon: <code>8 vertices</code> created by sliding along each side toward its side-center, limited by the provided per-corner <code>radii</code> (clamped to ≥ 0). If <code>radii</code> are huge, the diagonals meet and you get a diamond. <code>getOuterPath/getInnerPath</code> resolve the <code>BorderRadiusGeometry</code> with <code>TextDirection</code>, convert to <code>RRect</code>, then build the outer/inner beveled polygon (inner uses deflate for stroke thickness). and finally <code>paint</code> inflates for stroke outset, builds a path that is outer minus inner, and draws it with <code>side.toPaint()</code>.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="beveledrectangleborder-practical-full-example">BeveledRectangleBorder Practical Full Example<a href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/#beveledrectangleborder-practical-full-example" class="hash-link" aria-label="Direct link to BeveledRectangleBorder Practical Full Example" title="Direct link to BeveledRectangleBorder Practical Full Example" translate="no">​</a></h4>
<p>Here's a comprehensive example showing different <code>BeveledRectangleBorder</code> variations:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/material.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">main</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token function" style="color:#87aff4">runApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MyApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">MaterialApp</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      debugShowCheckedModeBanner</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      home</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Scaffold</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        appBar</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">AppBar</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          title</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'BeveledRectangleBorder Demo'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        body</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SingleChildScrollView</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          padding</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">EdgeInsets</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">16.0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Column</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            crossAxisAlignment</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CrossAxisAlignment</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">stretch</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token string-literal string" style="color:#e1ffe4">'BeveledRectangleBorder Examples'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                style</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextStyle</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">fontSize</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">24</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> fontWeight</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">FontWeight</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">bold</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                textAlign</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextAlign</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">center</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">20</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token class-name" style="color:#7fdbca">BeveledExample</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                title</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Small Bevel (8px)'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                borderRadius</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">8</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">red</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">16</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token class-name" style="color:#7fdbca">BeveledExample</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                title</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Medium Bevel (16px)'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                borderRadius</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">16</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">green</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">16</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token class-name" style="color:#7fdbca">BeveledExample</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                title</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'Large Bevel (24px)'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                borderRadius</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">24</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">blue</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">16</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token class-name" style="color:#7fdbca">BeveledExample</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                title</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'With Border'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                borderRadius</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">20</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">amber</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                hasBorder</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">16</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token class-name" style="color:#7fdbca">BeveledButtonExample</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">16</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token class-name" style="color:#7fdbca">BeveledCardExample</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BeveledExample</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> title</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">double</span><span class="token plain"> borderRadius</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Color</span><span class="token plain"> color</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> hasBorder</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BeveledExample</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">title</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">borderRadius</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">required</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">color</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">hasBorder </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Column</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      crossAxisAlignment</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CrossAxisAlignment</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">start</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          title</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          style</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextStyle</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">fontSize</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">16</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> fontWeight</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">FontWeight</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">w600</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">8</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token class-name" style="color:#7fdbca">Container</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">80</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          decoration</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ShapeDecoration</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> color</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">withOpacity</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">0.3</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            shape</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BeveledRectangleBorder</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              borderRadius</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BorderRadius</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">circular</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">borderRadius</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              side</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> hasBorder</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token operator" style="color:#00bff9">?</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BorderSide</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> color</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> width</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">3</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BorderSide</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">none</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Center</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token string-literal string" style="color:#e1ffe4">'Radius: </span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">${</span><span class="token string-literal interpolation expression">borderRadius</span><span class="token string-literal interpolation punctuation" style="color:#a7dbf7">}</span><span class="token string-literal string" style="color:#e1ffe4">px'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              style</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextStyle</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> color</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">withOpacity</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">0.8</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                fontWeight</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">FontWeight</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">bold</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BeveledButtonExample</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BeveledButtonExample</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Column</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      crossAxisAlignment</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CrossAxisAlignment</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">start</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token string-literal string" style="color:#e1ffe4">'Beveled Button'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          style</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextStyle</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">fontSize</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">16</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> fontWeight</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">FontWeight</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">w600</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">8</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token class-name" style="color:#7fdbca">ElevatedButton</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          onPressed</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          style</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">ElevatedButton</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">styleFrom</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            backgroundColor</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">purple</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            foregroundColor</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">white</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            shape</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BeveledRectangleBorder</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              borderRadius</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BorderRadius</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Radius</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">circular</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">12</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            padding</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">EdgeInsets</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">symmetric</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">horizontal</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">24</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> vertical</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">12</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Beveled Button'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BeveledCardExample</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">StatelessWidget</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BeveledCardExample</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token keyword" style="color:#00bff9">super</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">key</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">Widget</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">build</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">BuildContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">return</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Column</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      crossAxisAlignment</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CrossAxisAlignment</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">start</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token string-literal string" style="color:#e1ffe4">'Beveled Card'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          style</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextStyle</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">fontSize</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">16</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> fontWeight</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">FontWeight</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">w600</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">8</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token class-name" style="color:#7fdbca">Card</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          shape</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BeveledRectangleBorder</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            borderRadius</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BorderRadius</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token class-name" style="color:#7fdbca">Radius</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">circular</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">16</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            side</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">BorderSide</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">color</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Colors</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">grey</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> width</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Padding</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            padding</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">EdgeInsets</span><span class="token number" style="color:#8dec95">.</span><span class="token function" style="color:#87aff4">all</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">16.0</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Column</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              crossAxisAlignment</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CrossAxisAlignment</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">start</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token string-literal string" style="color:#e1ffe4">'Card with Beveled Corners'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  style</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">TextStyle</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">fontSize</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">16</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> fontWeight</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">FontWeight</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">bold</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">8</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token string-literal string" style="color:#e1ffe4">'This card uses BeveledRectangleBorder to create unique, '</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                  </span><span class="token string-literal string" style="color:#e1ffe4">'angular corners instead of the typical rounded corners.'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">              </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p><code>BeveledRectangleBorder</code> is perfect when you want to create distinctive UI elements that stand out from the typical rounded rectangle aesthetic. It's particularly effective in design systems that favor geometric, angular styles.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://dcm.dev/blog/2025/10/30/eight-flutter-widgets-not-using-but-should-be/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>In this blog, we've explored 8 powerful but often overlooked Flutter widgets or classes that can solve specific development challenges. The beauty of these widgets lies not just in their functionality, but in how they showcase Flutter's consistent design patterns. Whether it's performance optimization, accessibility, security, or unique visual effects, Flutter provides elegant, widget-based solutions that integrate seamlessly into your application architecture.</p>
<p>As you continue your Flutter journey, remember that the framework is full of these hidden gems. The official documentation, source code exploration, and community discussions are treasure troves of solutions waiting to be discovered. Keep exploring, keep building, and don't hesitate to dive into the source code when you want to understand how these powerful tools work behind the scenes.</p>
<blockquote>
<p>The complete source code for all examples in this series is available in the <a href="https://github.com/mhadaily/flutter_test_cases" target="_blank" rel="noopener noreferrer" class="">flutter test cases repository</a>, where you can explore, experiment, and build upon these concepts in your own projects.</p>
</blockquote>
<p>I am committed to bring you more of these widgets in the future, so stay updated, sign up to our newsletter.</p>
<div class="formWrapper_FeQU"><p class="formTitle_o9oT">Enjoying this article?</p><p>Subscribe to get our latest articles and product updates by email.</p><form class="footerForm_u4Zn"><input class="trialInput_rT6u" type="email" placeholder="Email address" name="blogEmail"><button type="submit" class="button button--primary button--sm formButton_cuTv">Subscribe</button></form></div>]]></content>
        <author>
            <name>Majid Hajian</name>
            <uri>https://dcm.dev</uri>
        </author>
        <category label="blog" term="blog"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Getting Started with Flutter Lint and Static Analysis]]></title>
        <id>https://dcm.dev/blog/2025/10/21/getting-started-flutter-static-analytics-lints/</id>
        <link href="https://dcm.dev/blog/2025/10/21/getting-started-flutter-static-analytics-lints/"/>
        <updated>2025-10-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Learn how to set up and master Flutter linting and static analysis to improve code quality and enforce best practices in Dart projects.]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="Cover" src="https://dcm.dev/assets/images/2025-10-21-cover-e0020888b0206f0eb2fdc4ed6d9f6bf4.jpg" width="1050" height="561" class="img_ev3q"></p>
<p>Static analysis in Flutter (and Dart) is the process of examining code for errors and style issues without running the app. It allows you to catch bugs and enforce best practices early, before executing a single line of code.</p>
<p>Adopting static analysis represents a fundamental "shift left" in the software development lifecycle (SDLC). This philosophy advocates for moving quality assurance and testing activities to the earliest possible stages of development.</p>
<p>Linting is a subset of static analysis that focuses on style and best-practice rules. Flutter’s analysis tool (often called the Dart/Flutter analyzer) uses a set of rules (called lints) to ensure your code follows the Dart style guide and <a href="https://dart.dev/effective-dart" target="_blank" rel="noopener noreferrer" class="">Effective Dart</a> recommendations.</p>
<p>This guide will walk you through setting up and mastering Flutter's linting and static analysis capabilities, from the basics to advanced configurations.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-anatomy-of-flutter-static-analysis">The Anatomy of Flutter Static Analysis<a href="https://dcm.dev/blog/2025/10/21/getting-started-flutter-static-analytics-lints/#the-anatomy-of-flutter-static-analysis" class="hash-link" aria-label="Direct link to The Anatomy of Flutter Static Analysis" title="Direct link to The Anatomy of Flutter Static Analysis" translate="no">​</a></h2>
<p>Let's start by exploring different parts of static analysis in Flutter.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-core-engine-the-dart-analyzer">The Core Engine: The Dart Analyzer<a href="https://dcm.dev/blog/2025/10/21/getting-started-flutter-static-analytics-lints/#the-core-engine-the-dart-analyzer" class="hash-link" aria-label="Direct link to The Core Engine: The Dart Analyzer" title="Direct link to The Core Engine: The Dart Analyzer" translate="no">​</a></h3>
<p>Everything starts with the <code>Dart Analyzer</code>, the engine that analyzes your code. It’s not just a command-line tool; it’s the backbone behind the instant feedback you see in your IDE. When you mistype a variable or mix incompatible types, it’s the analyzer that notices.</p>
<p>It does this by turning your source code into an Abstract Syntax Tree (AST), a structured model of your code. From there, it scans and validates everything against a defined set of rules. This tight connection between the analyzer, your IDE, and your project setup creates an immediate feedback loop where that familiar wavy underline appears the moment something's off.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-rulebook-analysis_optionsyaml">The Rulebook: <code>analysis_options.yaml</code><a href="https://dcm.dev/blog/2025/10/21/getting-started-flutter-static-analytics-lints/#the-rulebook-analysis_optionsyaml" class="hash-link" aria-label="Direct link to the-rulebook-analysis_optionsyaml" title="Direct link to the-rulebook-analysis_optionsyaml" translate="no">​</a></h3>
<p>The behavior of the analyzer is governed by one file: <code>analysis_options.yaml</code>. Sitting at the root of your Flutter project, it tells the analyzer what to enforce and what to ignore. You can enable or disable rules, adjust their severity, and even exclude certain files or directories.</p>
<p>In teams, this file becomes the single source of truth for maintaining consistent code quality and style across all contributors.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-official-starting-point-flutter_lints">The Official Starting Point: <code>flutter_lints</code><a href="https://dcm.dev/blog/2025/10/21/getting-started-flutter-static-analytics-lints/#the-official-starting-point-flutter_lints" class="hash-link" aria-label="Direct link to the-official-starting-point-flutter_lints" title="Direct link to the-official-starting-point-flutter_lints" translate="no">​</a></h3>
<p>Beyond language-level checks, Flutter also encourages best practices through linter rules. The easiest way to get started is with the <a href="https://docs.flutter.dev/release/breaking-changes/flutter-lints-package" target="_blank" rel="noopener noreferrer" class=""><code>flutter_lints</code></a> package, Google’s officially recommended rule set for Flutter apps.</p>
<p>Built on top of the general Dart lints, it gives you a strong foundation that matches the Dart Style Guide and Effective Dart recommendations. Instead of debating style or rule configurations, you can start coding with confidence, knowing your project already follows community standards for readability and maintainability.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="going-beyond-defaults-to-build-incredible-applications">Going Beyond Defaults to Build Incredible Applications<a href="https://dcm.dev/blog/2025/10/21/getting-started-flutter-static-analytics-lints/#going-beyond-defaults-to-build-incredible-applications" class="hash-link" aria-label="Direct link to Going Beyond Defaults to Build Incredible Applications" title="Direct link to Going Beyond Defaults to Build Incredible Applications" translate="no">​</a></h3>
<p>While <code>flutter_lints</code> provides an excellent foundation, production-grade applications and growing teams quickly hit its limits. You need more than just style checking; you need to enforce architecture, manage code complexity, and ensure long-term maintainability. This is where <a href="https://dcm.dev/" target="_blank" rel="noopener noreferrer" class="">dcm.dev</a> comes in a complete static analysis designed specifically for Dart and Flutter.</p>
<p>DCM is a <strong>productivity and efficiency tool</strong>. Instead of spending weeks developing rules or searching for rules that probably don't exist, you can plug DCM in and gain access to:</p>
<ul>
<li class="">
<p><strong><a href="https://dcm.dev/docs/rules/" target="_blank" rel="noopener noreferrer" class="">450+ Pre-Built Rules in Addition to Flutter Lint Rules</a>:</strong> A massive, well-tested library of rules covering performance, style, leaks, and best practices for both Dart and Flutter. Many of the rules comes with auto-fix that can save hours of effort!</p>
</li>
<li class="">
<p><strong><a href="https://dcm.dev/features/analyze/#metrics" target="_blank" rel="noopener noreferrer" class="">Advanced Code Metrics</a>:</strong> Go beyond simple lints with metrics like <a href="https://dcm.dev/docs/metrics/function/cyclomatic-complexity/" target="_blank" rel="noopener noreferrer" class="">Cyclomatic Complexity</a>, Lines of Code, and others to objectively measure code health and identify areas for refactoring.
<img decoding="async" loading="lazy" src="https://dcm.dev/img/metrics-html-report-alt.webp" alt="DCM Metrics" class="img_ev3q"></p>
</li>
<li class="">
<p><a href="https://dcm.dev/docs/dashboards/" target="_blank" rel="noopener noreferrer" class=""><strong>Monitor Your Code Quality Trends</strong></a>: With DCM Dashboard, quickly access the latest state of all open issues across all your projects with your organization and observe changes over time to easily spot unexpected changes and act quickly to resolve them.</p>
</li>
</ul>
<p><img decoding="async" loading="lazy" src="https://dcm.dev/assets/images/issues-overview-7c206ea0a7164925d072ac4181739429.webp" alt="DCM Dashboard" class="img_ev3q"></p>
<ul>
<li class=""><a href="https://dcm.dev/features/" target="_blank" rel="noopener noreferrer" class=""><strong>More Features</strong></a>: That's not all, DCM has loads of other features including assets quality check, health commands including finding unused code and files, integrating with AI assisted tooling to ensure high quality code generation via MCP server and more to explore and more to come!</li>
</ul>
<p>In short, <strong>dcm.dev</strong> allows your team to stand on the shoulders of static analysis experts, letting you focus your valuable time and energy on what matters most: <strong>building incredible applications</strong>.</p>
<div class="wrapper_plzk"><p>DCM is a code quality tool that helps your team move faster by reducing the time spent on code reviews, finding tricky bugs, identifying complex code, and unifying code style.</p><div class="heroButtons_DVKJ"><a class="button button--primary button--md" href="https://dcm.dev/pricing/">Start for Free</a><a class="button button--secondary button--md demo-button" href="https://dcm.dev/demo/"><svg width="12" height="17" viewBox="0 0 12 17" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M11.4742 7.67501C12.054 8.0722 12.054 8.92781 11.4742 9.32499L1.60147 16.0881C0.937832 16.5427 0.0363247 16.0675 0.0363247 15.2631L0.0363253 1.73691C0.0363253 0.932494 0.937834 0.457306 1.60147 0.911917L11.4742 7.67501Z" fill="#000"></path></svg>Watch Demo</a></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="setting-up-flutter-static-analysis-flutter-lint-rules">Setting Up Flutter Static Analysis (Flutter lint rules)<a href="https://dcm.dev/blog/2025/10/21/getting-started-flutter-static-analytics-lints/#setting-up-flutter-static-analysis-flutter-lint-rules" class="hash-link" aria-label="Direct link to Setting Up Flutter Static Analysis (Flutter lint rules)" title="Direct link to Setting Up Flutter Static Analysis (Flutter lint rules)" translate="no">​</a></h2>
<p>Setting up static analysis (linting) in Flutter is straightforward, especially with the official lint rule sets provided by Dart and Flutter. Recent versions of Flutter come with a default set of lint rules out-of-the-box. If you created your project with <strong>Flutter 2.5 (stable) or newer</strong>, you likely already have static analysis enabled by default.</p>
<p>You can verify this by checking your <code>pubspec.yaml</code> for <code>flutter_lints</code></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">pubspec.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token key atrule" style="color:#6dbdfa">dev_dependencies</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">flutter_test</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">sdk</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> flutter</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">flutter_lints</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> ^6.0.0</span><br></span></code></pre></div></div>
<p>and looking for an <code>analysis_options.yaml</code> file in the project root (next to <code>pubspec</code>).</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">...</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ├── android</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ├── assets</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ├── build</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ├── ios</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ├── lib</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ├── linux</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ├── macos</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ├── pubspec.lock</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ├── pubspec.yaml</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ├── analysis_options.yaml</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ├── test</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ├── web</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  └── windows</span><br></span></code></pre></div></div>
<p>If your project is older or missing these, follow these steps to enable the latest Flutter lints:</p>
<ul>
<li class="">
<p>In your project root, run the command:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token builtin class-name" style="color:#7fdbca">flutter</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">pub</span><span class="token plain"> add --dev flutter_lints</span><br></span></code></pre></div></div>
</li>
<li class="">
<p>Create a file named <code>analysis_options.yaml</code> at the root of your project (in the same directory as your <code>pubspec.yaml</code>). In this file, include the recommended Flutter lint rules by adding a single line:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token key atrule" style="color:#6dbdfa">include</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> package</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain">flutter_lints/flutter.yaml</span><br></span></code></pre></div></div>
</li>
<li class="">
<p>After adding the file, run <code>flutter pub get</code> (if you added the dependency manually) to ensure the package is installed. The analyzer will automatically start using these rules in your IDE. You can also run the analyzer manually (see next section) to verify everything is set up correctly.</p>
</li>
</ul>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token builtin class-name" style="color:#7fdbca">flutter</span><span class="token plain"> analyze</span><br></span></code></pre></div></div>
<p>Below is an example <code>analysis_options.yaml</code> content for a Flutter project. This is similar to what Flutter’s template provides by default.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">analysis_options.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999"># Activate recommended lints for Flutter apps (from flutter_lints package)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule" style="color:#6dbdfa">include</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> package</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain">flutter_lints/flutter.yaml</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule" style="color:#6dbdfa">linter</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:#999999"># You can customize the lint rules below</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">rules</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:#999999"># avoid_print: false  # Uncomment to disable the `avoid_print` rule</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:#999999"># prefer_single_quotes: true  # Uncomment to enable the `prefer_single_quotes` rule</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="running-the-analyzer-and-interpreting-results">Running the Analyzer and Interpreting Results<a href="https://dcm.dev/blog/2025/10/21/getting-started-flutter-static-analytics-lints/#running-the-analyzer-and-interpreting-results" class="hash-link" aria-label="Direct link to Running the Analyzer and Interpreting Results" title="Direct link to Running the Analyzer and Interpreting Results" translate="no">​</a></h2>
<p>With the setup complete, the analysis can be run in two primary ways, both of which yield the same results.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="from-the-command-line">From the Command Line<a href="https://dcm.dev/blog/2025/10/21/getting-started-flutter-static-analytics-lints/#from-the-command-line" class="hash-link" aria-label="Direct link to From the Command Line" title="Direct link to From the Command Line" translate="no">​</a></h3>
<p>To perform a static analysis of the entire project from the terminal, run the following command from the project's root directory:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token builtin class-name" style="color:#7fdbca">flutter</span><span class="token plain"> analyze</span><br></span></code></pre></div></div>
<p>This command invokes the Dart analyzer, which will scan all Dart files in the project according to the rules defined in <code>analysis_options.yaml</code>.</p>
<p>For example, if you had a stray semicolon after an <code>if</code> statement, the analyzer might output a warning like this:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">Analyzing flutter_test_cases...</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   info • Constructors for public widgets should have a named 'key' parameter •</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          lib/widgets/repaint_boundary_to_image.dart:22:7 • use_key_in_widget_constructors</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   info • Invalid use of a private type in a public API • lib/widgets/repaint_boundary_to_image.dart:24:3</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          • library_private_types_in_public_api</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   info • Don't invoke 'print' in production code • lib/widgets/snapshot_widget.dart:112:5 • avoid_print</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   info • Don't invoke 'print' in production code • lib/widgets/snapshot_widget.dart:132:5 • avoid_print</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">4 issues found. (ran in 1.5s)</span><br></span></code></pre></div></div>
<p>In this example, it flags an unnecessary semicolon and cites the <code>empty_statements</code> rule. Similarly, if you use a print statement and the <code>avoid_print</code> lint is enabled, you would see a message warning:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">info • Don't invoke 'print' in production code • lib/widgets/snapshot_widget.dart:132:5 • avoid_print</span><br></span></code></pre></div></div>
<p>Each issue includes the file, line number, and the name of the lint rule (so you can look up details if needed).</p>
<p>Running <code>flutter analyze</code> regularly (or having your IDE’s analysis on) is highly recommended. It gives you quick feedback on code quality and potential errors. If issues are found, you can fix them as you go. In fact, some lint warnings have automated fixes, you can run</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token builtin class-name" style="color:#7fdbca">dart</span><span class="token plain"> fix --dry-run</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token builtin class-name" style="color:#7fdbca">dart</span><span class="token plain"> fix --apply</span><br></span></code></pre></div></div>
<p>to auto-apply trivial fixes suggested by the analyzer. This can update your code (for example, adding missing const keywords or removing unused imports) according to the linter’s recommendations.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="getting-started-with-dcm">Getting Started with DCM<a href="https://dcm.dev/blog/2025/10/21/getting-started-flutter-static-analytics-lints/#getting-started-with-dcm" class="hash-link" aria-label="Direct link to Getting Started with DCM" title="Direct link to Getting Started with DCM" translate="no">​</a></h2>
<p>You might want to go beyond defaults and start with DCM as explained earlier. Getting started with DCM is super simple!</p>
<ul>
<li class="">
<p>Get a <a href="https://dcm.dev/pricing/" target="_blank" rel="noopener noreferrer" class="">proper license</a> that works for you and your team. You can start for <a href="https://dcm.dev/pricing/" target="_blank" rel="noopener noreferrer" class="">free</a> or request a <a href="https://dcm.dev/request-license/" target="_blank" rel="noopener noreferrer" class="">trial for your team</a></p>
</li>
<li class="">
<p><a href="https://dcm.dev/docs/getting-started/for-developers/installation/" target="_blank" rel="noopener noreferrer" class="">Install DCM depending on your operating system</a></p>
</li>
<li class="">
<p>Setup your IDE whether is <a href="https://dcm.dev/docs/getting-started/for-developers/setup-ide/" target="_blank" rel="noopener noreferrer" class="">VS Code or IntelliJ</a></p>
</li>
<li class="">
<p>Activate your DCM license <code>dcm activate --license-key=YOUR_KEY</code></p>
</li>
<li class="">
<p>And finally you can simply integrate with DCM by simply starting with our <code>recommended</code> set of rules or enable over 450+ rule, run advanced code health commands, enable metrics, integrate with your AI assisted tool and many more.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">analysis_options.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">extends</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> recommended</span><br></span></code></pre></div></div>
</li>
</ul>
<p>Now go ahead and run DCM commands.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">Available commands:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  analyze                      Analyze Dart code for lint rule violations.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  analyze-assets               Analyze image assets for incorrect formats, names, exceeding size, and missing high-resolution images.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  analyze-structure            Analyze Dart project structure.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  analyze-widgets              Analyze Flutter widgets for quality, usages, and duplication.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  calculate-metrics            Collect code metrics for Dart code.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  check-code-duplication       Check for duplicate functions, methods, and test cases.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  check-dependencies           Check for missing, under-promoted, over-promoted, and unused dependencies.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  check-exports-completeness   Check for exports completeness in *.dart files.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  check-parameters             Check for various issues with function, method and constructor parameters.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  check-unused-code            Check for unused code in *.dart files.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  check-unused-files           Check for unused *.dart files.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  check-unused-l10n            Check for unused localization in *.dart files.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  fix                          Apply fixes for fixable analysis issues.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  format                       Format *.dart files.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  init                         Set up DCM.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  run                          Run multiple passed DCM commands at once.</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="inside-the-ide">Inside the IDE<a href="https://dcm.dev/blog/2025/10/21/getting-started-flutter-static-analytics-lints/#inside-the-ide" class="hash-link" aria-label="Direct link to Inside the IDE" title="Direct link to Inside the IDE" translate="no">​</a></h3>
<p>The true power of the analyzer is its real-time integration with IDEs. As code is written in VS Code or Android Studio, the analyzer runs continuously in the background. Any violations of the rules in <code>analysis_options.yaml</code> will appear almost instantly:</p>
<ul>
<li class=""><strong>Inline Highlighting:</strong> The specific line of code with the issue will be underlined. Hovering over the underlined code will display a tooltip with the same error message seen on the command line.</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Inline Highlighting" src="https://dcm.dev/assets/images/highlight-653a94531c17a8ee1049bea1e5c5ecba.webp" width="1654" height="262" class="img_ev3q"></p>
<ul>
<li class=""><strong>Problems/Dart Analysis Tab:</strong> A dedicated panel in the IDE (e.g., the "Problems" tab in VS Code) will aggregate all issues across the entire project, allowing for easy navigation to each problem area.</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Problem View" src="https://dcm.dev/assets/images/problem-94e5feb631fb29899d09fd472a5cb3e8.webp" width="2488" height="848" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="from-defaults-to-custom-configuration">From Defaults to Custom Configuration<a href="https://dcm.dev/blog/2025/10/21/getting-started-flutter-static-analytics-lints/#from-defaults-to-custom-configuration" class="hash-link" aria-label="Direct link to From Defaults to Custom Configuration" title="Direct link to From Defaults to Custom Configuration" translate="no">​</a></h2>
<p>While the <code>flutter_lints</code> package provides an excellent default, professional development often requires a more tailored approach. Customizing the <code>analysis_options.yaml</code> file allows a team to enforce stricter checks, adopt specific coding conventions, and ultimately take full ownership of their code quality standards.</p>
<p>This file becomes more than just a configuration; it evolves into a living document that codifies a team's development philosophy, defining "what good code looks like" for their specific project.</p>
<p>Let's see what we can do!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="enforcing-maximum-type-safety">Enforcing Maximum Type Safety<a href="https://dcm.dev/blog/2025/10/21/getting-started-flutter-static-analytics-lints/#enforcing-maximum-type-safety" class="hash-link" aria-label="Direct link to Enforcing Maximum Type Safety" title="Direct link to Enforcing Maximum Type Safety" translate="no">​</a></h3>
<p>Dart's type system is powerful, but the analyzer can be configured to be even stricter, catching potential runtime errors during development. This is done using the language key under the analyzer entry in <code>analysis_options.yaml</code>.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">analysis_options.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token key atrule" style="color:#6dbdfa">analyzer</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">language</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">strict-casts</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#8dec95">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">strict-inference</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#8dec95">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">strict-raw-types</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#8dec95">true</span><br></span></code></pre></div></div>
<ul>
<li class="">
<p><code>strict-casts: true</code>: This flag ensures that the analyzer reports a potential error when an implicit downcast might fail at runtime. For example, if a <code>List&lt;Object&gt;</code> is implicitly cast to a <code>List&lt;String&gt;</code>, this flag will raise an issue because the cast could fail if the list contains non-string elements.</p>
</li>
<li class="">
<p><code>strict-inference: true</code>: This forces the type inference engine to be more conservative. It will report an issue if it cannot determine a precise type and would otherwise default to dynamic. This encourages developers to be more explicit with their type annotations, reducing ambiguity.</p>
</li>
<li class="">
<p><code>strict-raw-types: true</code>: This flag ensures that when a generic class is used, a type argument is always provided. For example, it would flag <code>List myList</code> and encourage the developer to specify the type, such as <code>List&lt;int&gt;</code> or <code>List&lt;dynamic&gt;</code>, making the code's intent maintainable.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="customizing-flutter-linter-rules">Customizing Flutter Linter Rules<a href="https://dcm.dev/blog/2025/10/21/getting-started-flutter-static-analytics-lints/#customizing-flutter-linter-rules" class="hash-link" aria-label="Direct link to Customizing Flutter Linter Rules" title="Direct link to Customizing Flutter Linter Rules" translate="no">​</a></h3>
<p>Beyond the top-level analyzer settings, individual <code>linter</code> rules can be managed under the linter key. This allows for fine-grained control over the project's coding style and conventions.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">analysis_options.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token key atrule" style="color:#6dbdfa">include</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> package</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain">flutter_lints/flutter.yaml</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule" style="color:#6dbdfa">linter</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">rules</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:#999999"># Disable a rule from the included set</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">avoid_print</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#8dec95">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:#999999"># Enable an additional rule</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">require_trailing_commas</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#8dec95">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">avoid_positional_boolean_parameters</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#8dec95">true</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="managing-code-exclusions-and-severity">Managing Code Exclusions and Severity<a href="https://dcm.dev/blog/2025/10/21/getting-started-flutter-static-analytics-lints/#managing-code-exclusions-and-severity" class="hash-link" aria-label="Direct link to Managing Code Exclusions and Severity" title="Direct link to Managing Code Exclusions and Severity" translate="no">​</a></h3>
<p>Sometimes, a specific rule must be violated in a controlled manner, or a rule's importance needs to be elevated. The analyzer provides mechanisms for both scenarios.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="suppressing-flutter-rules">Suppressing Flutter Rules<a href="https://dcm.dev/blog/2025/10/21/getting-started-flutter-static-analytics-lints/#suppressing-flutter-rules" class="hash-link" aria-label="Direct link to Suppressing Flutter Rules" title="Direct link to Suppressing Flutter Rules" translate="no">​</a></h4>
<p>There are two ways to exclude code from a specific analysis rule:</p>
<ul>
<li class="">
<p><strong>For a single line:</strong> Place a comment directly above the line of code.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// ignore: avoid_print</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'Debug log'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><br></span></code></pre></div></div>
</li>
<li class="">
<p><strong>For an entire file:</strong> Add a comment at the top of the Dart file.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:#999999">// ignore_for_file: prefer_const_constructors</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'package:flutter/material.dart'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:#999999">// ... rest of the file</span><br></span></code></pre></div></div>
</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="changing-lint-rule-severity">Changing Lint Rule Severity<a href="https://dcm.dev/blog/2025/10/21/getting-started-flutter-static-analytics-lints/#changing-lint-rule-severity" class="hash-link" aria-label="Direct link to Changing Lint Rule Severity" title="Direct link to Changing Lint Rule Severity" translate="no">​</a></h4>
<p>It is also possible to change the severity of a rule. For example, a team might decide that a specific style violation is so important that it should be treated as an error, not just a warning. This is configured under the <code>analyzer.errors</code> key.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">analysis_options.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token key atrule" style="color:#6dbdfa">analyzer</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">errors</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:#999999"># Treat missing required parameters as an error instead of a warning</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">missing_required_param</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> error</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:#999999"># Just warn (not error) if const could be used</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">prefer_const_constructors</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> warning </span><span class="token comment" style="color:#999999"># (opt-in if you want const guidance)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:#999999"># set the 'lines_longer_than_80_chars' warning to just info</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">lines_longer_than_80_chars</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> info</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="exclude-files-or-directories">Exclude files or directories<a href="https://dcm.dev/blog/2025/10/21/getting-started-flutter-static-analytics-lints/#exclude-files-or-directories" class="hash-link" aria-label="Direct link to Exclude files or directories" title="Direct link to Exclude files or directories" translate="no">​</a></h4>
<p>Sometimes you might want to ignore generated code or specific files (say, your <code>.g.dart</code> files or <code>build/</code> directory) from analysis to avoid false warnings. You can add an <code>exclude</code> list under the <code>analyzer</code> section:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">analysis_options.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token key atrule" style="color:#6dbdfa">analyzer</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">exclude</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> build/</span><span class="token important">**</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> lib/generated_plugin_registrant.dart</span><br></span></code></pre></div></div>
<p>This level of control allows teams to fine-tune the analyzer's behavior to match their project's specific quality gates and priorities.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dcm-rule-and-metric-configuration">DCM Rule and Metric Configuration<a href="https://dcm.dev/blog/2025/10/21/getting-started-flutter-static-analytics-lints/#dcm-rule-and-metric-configuration" class="hash-link" aria-label="Direct link to DCM Rule and Metric Configuration" title="Direct link to DCM Rule and Metric Configuration" translate="no">​</a></h3>
<p>Going beyond defaults and using an advanced lint tool for Flutter like DCM also comes with huge benefits of configuring lots of rules and metrics to tailor to your specific needs.</p>
<p>Here is just one example from all those 450+ rules which <a href="https://dcm.dev/docs/rules/common/avoid-banned-imports/" target="_blank" rel="noopener noreferrer" class="">avoid-banned-imports</a>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">analysis_options.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">rules</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">avoid-banned-imports</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">entries</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">paths</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token string" style="color:#e1ffe4">'some/folder/.*\.dart'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">'another/folder/.*\.dart'</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token key atrule" style="color:#6dbdfa">deny</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token string" style="color:#e1ffe4">'package:flutter/material.dart'</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token key atrule" style="color:#6dbdfa">message</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">'Do not import Flutter Material Design library, we should not depend on it!'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token key atrule" style="color:#6dbdfa">severity</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> error</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">paths</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token string" style="color:#e1ffe4">'core/.*\.dart'</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token key atrule" style="color:#6dbdfa">deny</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token string" style="color:#e1ffe4">'package:flutter_bloc/flutter_bloc.dart'</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token key atrule" style="color:#6dbdfa">message</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">'State management should be not used inside "core" folder.'</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="integrating-static-analysis-into-your-workflow">Integrating Static Analysis into Your Workflow<a href="https://dcm.dev/blog/2025/10/21/getting-started-flutter-static-analytics-lints/#integrating-static-analysis-into-your-workflow" class="hash-link" aria-label="Direct link to Integrating Static Analysis into Your Workflow" title="Direct link to Integrating Static Analysis into Your Workflow" translate="no">​</a></h2>
<p>Once the ruleset is defined in <code>analysis_options.yaml</code>, the next step is to integrate static analysis deeply into the development workflow. This involves providing more context to the analyzer through code annotations and automating checks to ensure that quality standards are consistently upheld by the entire team.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-power-of-annotations">The Power of Annotations<a href="https://dcm.dev/blog/2025/10/21/getting-started-flutter-static-analytics-lints/#the-power-of-annotations" class="hash-link" aria-label="Direct link to The Power of Annotations" title="Direct link to The Power of Annotations" translate="no">​</a></h3>
<p>The <code>meta</code> package provides a set of special annotations that allow developers to communicate their intentions directly to the analysis tools. These annotations provide hints that the analyzer cannot deduce on its own, enabling it to provide more accurate and helpful warnings.</p>
<p>To use them, first add the package as a dependency:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token builtin class-name" style="color:#7fdbca">flutter</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">pub</span><span class="token plain"> add meta</span><br></span></code></pre></div></div>
<p>Key annotations include:</p>
<ul>
<li class="">
<p><code>@immutable</code>: When applied to a class, this annotation asserts that all of its fields are <code>final</code>. The analyzer will then flag any subclasses that are not also marked as immutable. This is essential for Flutter widgets to ensure their properties cannot change after construction, which is a core principle of the framework's declarative UI.</p>
</li>
<li class="">
<p><code>@mustCallSuper</code>: When a method in a subclass overrides a method from a superclass that is annotated with <code>@mustCallSuper</code>, the analyzer will issue a warning if the subclass's method does not include a call to the superclass's method (e.g., <code>super.dispose()</code>). This is critical for preventing resource leaks in <code>StatefulWidget</code> lifecycle.</p>
</li>
</ul>
<p>Read more about annotations in the <a href="https://pub.dev/packages/meta" target="_blank" rel="noopener noreferrer" class="">Flutter <code>meta</code> package</a> documentation.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="preparing-for-publication-the-pana-score">Preparing for Publication: The pana Score<a href="https://dcm.dev/blog/2025/10/21/getting-started-flutter-static-analytics-lints/#preparing-for-publication-the-pana-score" class="hash-link" aria-label="Direct link to Preparing for Publication: The pana Score" title="Direct link to Preparing for Publication: The pana Score" translate="no">​</a></h3>
<p>For developers who intend to publish packages to the official Dart package repository, pub.dev, static analysis plays a direct and visible role in how the package is perceived by the community. When a package is published, an automated tool called <code>pana</code> (Package ANAlysis) runs a series of checks to generate a quality score, which is prominently displayed on the package's page</p>
<p>A key category in this evaluation is "Pass static analysis," which executes dart analyze (or <code>flutter analyze</code>) on the package's code. A clean analysis report is essential for achieving a high score. This score acts as a powerful social signal; it tells other developers that the package author is disciplined, adheres to community best practices, and has produced code that is likely to be reliable and well-maintained.</p>
<p>Therefore, mastering static analysis is not just about internal code quality; it is a critical component of building a positive public reputation within the Flutter ecosystem.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="flutter-lint-rules-and-automation-with-continuous-integration-cicd">Flutter Lint Rules and Automation with Continuous Integration (CI/CD)<a href="https://dcm.dev/blog/2025/10/21/getting-started-flutter-static-analytics-lints/#flutter-lint-rules-and-automation-with-continuous-integration-cicd" class="hash-link" aria-label="Direct link to Flutter Lint Rules and Automation with Continuous Integration (CI/CD)" title="Direct link to Flutter Lint Rules and Automation with Continuous Integration (CI/CD)" translate="no">​</a></h3>
<p>The ultimate safety net for maintaining code quality is to automate the analysis process using a Continuous Integration (CI) pipeline. The goal is to create an automated, impartial gatekeeper that prevents code violating the established analysis rules from ever being merged into the project's main branch.</p>
<p>For teams using platforms like GitHub, this can be achieved with a GitHub Actions workflow. The following is a simple, copy-paste-ready example of a workflow file (.github/workflows/analyze.yml) that runs flutter analyze on every push and pull request to the main branch:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token key atrule" style="color:#6dbdfa">name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> Flutter Analyze</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule" style="color:#6dbdfa">on</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">push</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">branches</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain">main</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">pull_request</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">branches</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain">main</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule" style="color:#6dbdfa">jobs</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">analyze</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">runs-on</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> ubuntu</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">latest</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">steps</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">uses</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> actions/checkout@v3</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">uses</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> subosito/flutter</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">action@v2</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">with</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token key atrule" style="color:#6dbdfa">channel</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">'stable'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">run</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> flutter pub get</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">run</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> flutter analyze</span><br></span></code></pre></div></div>
<p>You can repeat this workflow on your desired and favorite CI tool as well.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dcm-and-your-favorite-cdci-platform-goes-beyond-basic">DCM and Your Favorite CD/CI Platform Goes Beyond Basic<a href="https://dcm.dev/blog/2025/10/21/getting-started-flutter-static-analytics-lints/#dcm-and-your-favorite-cdci-platform-goes-beyond-basic" class="hash-link" aria-label="Direct link to DCM and Your Favorite CD/CI Platform Goes Beyond Basic" title="Direct link to DCM and Your Favorite CD/CI Platform Goes Beyond Basic" translate="no">​</a></h3>
<p>DCM also works seamlessly with major CI/CD platforms like GitHub Actions, GitLab CI/CD, Azure DevOps, Bitbucket Pipelines and Codemagic.</p>
<p>More importantly, DCM provides flexible output formats for CI pipelines: <code>console</code>, <code>JSON</code>, <code>Checkstyle</code>, <code>Code Climate</code>, <code>GitLab</code>, <code>GitHub</code>, so you can integrate into your existing build dashboards or pipelines easily.</p>
<p>Check out more details on our <a href="https://dcm.dev/docs/ci-integrations/" target="_blank" rel="noopener noreferrer" class="">DCM CI/CD Integrations</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://dcm.dev/blog/2025/10/21/getting-started-flutter-static-analytics-lints/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>By properly configuring <code>package:flutter_lints</code> and customizing your <code>analysis_options.yaml</code> file, you create a robust development environment that catches issues early and guides your team toward Flutter best practices.</p>
<p>Remember that linting is not about rigid enforcement but about creating a consistent, readable, and maintainable codebase that your entire team can work with effectively. Choose rules that make sense for your project and team, and don't hesitate to adjust them as your project evolves.</p>
<div class="formWrapper_FeQU"><p class="formTitle_o9oT">Enjoying this article?</p><p>Subscribe to get our latest articles and product updates by email.</p><form class="footerForm_u4Zn"><input class="trialInput_rT6u" type="email" placeholder="Email address" name="blogEmail"><button type="submit" class="button button--primary button--sm formButton_cuTv">Subscribe</button></form></div>]]></content>
        <author>
            <name>Majid Hajian</name>
            <uri>https://dcm.dev</uri>
        </author>
        <category label="blog" term="blog"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[What’s new in DCM 1.32.0]]></title>
        <id>https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/</id>
        <link href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/"/>
        <updated>2025-10-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[DCM 1.32.0 includes 12 new rules, 21 new quick fix, optimized memory consumption for remaining DCM commands, improved support for pubspec rules across all DCM features, new metrics config to pass multiple thresholds for different paths, new "unset" metric threshold, new role for accessing only a selected number of projects in DCM Dashboards and improved UX for adding new seats to your subscription, and more!]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="Cover" src="https://dcm.dev/assets/images/2025-10-15-cover-bd56563df5f4eb31dbd59811eb9c14d3.jpg" width="1400" height="736" class="img_ev3q"></p>
<p>With a little delay, we are excited to announce the release of DCM 1.32.0!</p>
<p>This release includes 12 new rules, 21 new quick fix, optimized memory consumption for remaining DCM commands, improved support for pubspec rules across all DCM features, new metrics config to pass multiple thresholds for different paths, new "unset" metric threshold, new role for accessing only a selected number of projects in DCM Dashboards and improved UX for adding new seats to your subscription, and more!</p>
<p>Let’s go through the highlights of this release (and the full list of changes is <a class="" href="https://dcm.dev/changelog/#1.32.0">in our changelog</a>)!</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dashboard-improvements">Dashboard Improvements<a href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/#dashboard-improvements" class="hash-link" aria-label="Direct link to Dashboard Improvements" title="Direct link to Dashboard Improvements" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-role-and-external-users">New Role and External Users<a href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/#new-role-and-external-users" class="hash-link" aria-label="Direct link to New Role and External Users" title="Direct link to New Role and External Users" translate="no">​</a></h3>
<p>To help you granularly manage access to your DCM projects, this release includes a new "View Selected" role for which you can select a list of projects a particular user or developer can access:</p>
<video width="100%" controls="" autoplay="" playsinline=""><source src="/video/new-role.mp4"></video>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>We've also removed the "Dashboards access" toggle and made the UX for managing developers and users more similar.</p></div></div>
<p>Additionally, you can now invite external users (users with an email address that does not match your account domain address), but their role is limited to "View Selected" only:</p>
<p><img decoding="async" loading="lazy" alt="External Users" src="https://dcm.dev/assets/images/external-users-09dffaba325dea724e062a2f0d4d311b.webp" width="2076" height="682" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="improved-baseline">Improved Baseline<a href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/#improved-baseline" class="hash-link" aria-label="Direct link to Improved Baseline" title="Direct link to Improved Baseline" translate="no">​</a></h3>
<p>To reduce confusion between regular and baselined issues, cards with the active baseline state now have several distinctive elements:</p>
<video width="100%" controls="" autoplay="" playsinline=""><source src="/video/improved-baseline.mp4"></video>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="updated-billing-page-and-seat-selection">Updated Billing Page and Seat Selection<a href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/#updated-billing-page-and-seat-selection" class="hash-link" aria-label="Direct link to Updated Billing Page and Seat Selection" title="Direct link to Updated Billing Page and Seat Selection" translate="no">​</a></h3>
<p>The Billing page also got a few improvements.</p>
<p>First, it shows more details about the current plan and the numbers of added developers, users and projects:</p>
<p><img decoding="async" loading="lazy" alt="Improved Billing Page" src="https://dcm.dev/assets/images/improved-billing-f81ef2dd1833f1737c307f1624b7d1f6.webp" width="2274" height="1696" class="img_ev3q"></p>
<p>When it comes to adding new seats to your subscription, the modal dialog now includes more information about the cost of each seat and the billing interval.</p>
<p><img decoding="async" loading="lazy" alt="Improved Seats Selection" src="https://dcm.dev/assets/images/seats-selection-f6e48e972809fbdfecff1a103ce157f5.webp" width="1922" height="1368" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="metrics-improvements">Metrics Improvements<a href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/#metrics-improvements" class="hash-link" aria-label="Direct link to Metrics Improvements" title="Direct link to Metrics Improvements" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>If you have any feedback or feature requests for current metrics, any metric-related features or new metrics, please let us know on <a href="https://discord.gg/Vzjprgk4sb" target="_blank" rel="noopener noreferrer" class="">our Discord</a> or via email <a href="mailto:info@dcm.dev" target="_blank" rel="noopener noreferrer" class="">info@dcm.dev</a>.</p><p>We plan to ship a lot of changes and improvements (including documentation updates, new metrics and more) in the upcoming 2 releases (1.33 and 1.34), so your feedback can help us make metrics even better!</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="multiple-threshold">Multiple Threshold<a href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/#multiple-threshold" class="hash-link" aria-label="Direct link to Multiple Threshold" title="Direct link to Multiple Threshold" translate="no">​</a></h3>
<p>With this release we are introducing a new configuration for all metrics to accept multiple thresholds for different paths:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">analysis_options.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">metrics</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">cyclomatic-complexity</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token key atrule" style="color:#6dbdfa">threshold</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">20</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token key atrule" style="color:#6dbdfa">entries</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">threshold</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">10</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token key atrule" style="color:#6dbdfa">paths</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">'.*some_folder.*'</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">'.*some_file.dart'</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">threshold</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">15</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token key atrule" style="color:#6dbdfa">paths</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">'.*another_folder'</span></span><br></span></code></pre></div></div>
<p>For the example above, all files and folders that match <code>.*some_folder.*</code> or <code>.*some_file.dart</code> will have the cyclomatic complexity threshold equal to <code>10</code>, the ones that match <code>.*another_folder</code> - <code>15</code>, and for all other files the threshold will be <code>20</code>.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p><strong>Configuring the main threshold is required</strong> as that threshold will be used for file that are not covered by the <code>entries</code> config (if no threshold is set, the default threshold will be used instead).</p></div></div>
<p>We hope this change will make metrics usage even more convenient especially for cases when you want one set of thresholds for your UI widgets and another for business logic.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="unset-threshold">"unset" Threshold<a href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/#unset-threshold" class="hash-link" aria-label="Direct link to &quot;unset&quot; Threshold" title="Direct link to &quot;unset&quot; Threshold" translate="no">​</a></h3>
<p>On top of the multiple thresholds, you can now set a metric threshold to "unset" to avoid getting any violations.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">analysis_options.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">metrics</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">cyclomatic-complexity</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token key atrule" style="color:#6dbdfa">threshold</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> unset</span></span><br></span></code></pre></div></div>
<p>or for multiple thresholds:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">analysis_options.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">metrics</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">cyclomatic-complexity</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token key atrule" style="color:#6dbdfa">threshold</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">20</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">      </span><span class="token key atrule" style="color:#6dbdfa">entries</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">threshold</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">10</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token key atrule" style="color:#6dbdfa">paths</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">'.*some_folder.*'</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">'.*some_file.dart'</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">threshold</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> unset</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token key atrule" style="color:#6dbdfa">paths</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">            </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">'.*another_folder'</span></span><br></span></code></pre></div></div>
<p>This threshold can be helpful if you want to simply collect metric values (for example, when uploading to DCM Dashboards).</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="maximum-nesting-level-updates">"maximum-nesting-level" Updates<a href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/#maximum-nesting-level-updates" class="hash-link" aria-label="Direct link to &quot;maximum-nesting-level&quot; Updates" title="Direct link to &quot;maximum-nesting-level&quot; Updates" translate="no">​</a></h3>
<p>The <code>maximum-nesting-level</code> metric now covers additional cases (such as multiline list, map and set literals, if and for collection elements and switch cases without a block body).</p>
<p>For example, prior to this release, the code below had a nesting level of 1 (which is clearly not the case).</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token class-name" style="color:#7fdbca">Expanded</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  child</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Column</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    crossAxisAlignment</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">CrossAxisAlignment</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">start</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token class-name" style="color:#7fdbca">Text</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">height</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">8</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token class-name" style="color:#7fdbca">Row</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        children</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token keyword" style="color:#00bff9">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">var</span><span class="token plain"> i </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">0</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> i </span><span class="token operator" style="color:#00bff9">&lt;</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">5</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> i</span><span class="token operator" style="color:#00bff9">++</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SizedBox</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">width</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">4</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">,</span><br></span></code></pre></div></div>
<p>Now, it has a nesting level of 5 (with 3 list literals and 1 collection for element).</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="improved-html-reports">Improved HTML Reports<a href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/#improved-html-reports" class="hash-link" aria-label="Direct link to Improved HTML Reports" title="Direct link to Improved HTML Reports" translate="no">​</a></h3>
<p>The metrics HTML report got a few UX improvements as well.</p>
<p>For example, the single file shows a summary for each metrics on the left (same as for other pages) and each summary now includes a threshold.</p>
<p>Plus, you can now open the file in VS Code with just one click by clicking "Open in VS Code".</p>
<p><img decoding="async" loading="lazy" alt="Updated HTML Reporter" src="https://dcm.dev/assets/images/updated-html-reporter-eec1d37f7d3094bccc62bc79733fa848.webp" width="2790" height="1706" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="memory-usage-improvements-part-2">Memory Usage Improvements (part 2)<a href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/#memory-usage-improvements-part-2" class="hash-link" aria-label="Direct link to Memory Usage Improvements (part 2)" title="Direct link to Memory Usage Improvements (part 2)" translate="no">​</a></h2>
<p>If you have checked out our previous release, there was a separate section <a class="" href="https://dcm.dev/blog/2025/08/18/whats-new-in-dcm-1-31-0/#memory-usage-improvements">dedicated to memory optimizations</a>.</p>
<p>Unfortunately, that release didn't include a fix for all commands (and <code>check-parameters</code> and <code>analyze-widgets</code> were left without an optimization).</p>
<p>Now, all commands support the optimization and you should see the results of it when running <code>dcm run --all .</code></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="better-support-for-pubspec-rules">Better Support for Pubspec Rules<a href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/#better-support-for-pubspec-rules" class="hash-link" aria-label="Direct link to Better Support for Pubspec Rules" title="Direct link to Better Support for Pubspec Rules" translate="no">​</a></h2>
<p>With this release, all pubspec rules now have better integration with all other DCM features.</p>
<p>For example, you can now apply quick fixes and add <code># ignore_for_file:</code> and <code># ignore:</code> comments:</p>
<video width="100%" controls="" autoplay="" playsinline=""><source src="/video/pubspec-fixes.mp4"></video>
<p>Plus, they are now fully supported in the <code>analysis_options.yaml</code> config (including autocompletion, code actions and configuration validation):</p>
<video width="100%" controls="" autoplay="" playsinline=""><source src="/video/pub-rules-actions.mp4"></video>
<p>And last but not least, pubspec rules are now shown in the results of <code>dcm init lints-preview</code> and are applied with built-in presets!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="improved-detection-of-pub-cache-and-flutter-sdk">Improved Detection of Pub Cache and Flutter SDK<a href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/#improved-detection-of-pub-cache-and-flutter-sdk" class="hash-link" aria-label="Direct link to Improved Detection of Pub Cache and Flutter SDK" title="Direct link to Improved Detection of Pub Cache and Flutter SDK" translate="no">​</a></h2>
<p>If you are using tools like <code>asdf</code>, with the release we are happy to announce an improved support for automatic Flutter SDK detection and the overall improvement of our SDK detection logic.</p>
<p>Now, if the tool fails to locate the SDK in your PATH, here is the list of all places it checks to locate the SDK (in that particular order):</p>
<ol>
<li class=""><code>--sdk-path</code> CLI option (if present)</li>
<li class="">the <code>DCM_SDK_PATH</code> env variable (if present)</li>
<li class="">the <code>FLUTTER_ROOT</code> env variable (if present)</li>
<li class=""><code>fvm</code> configuration</li>
<li class=""><code>.dart_tool/package_config.json</code></li>
<li class=""><code>which flutter</code> / <code>where flutter</code> (depending on the platform)</li>
</ol>
<p>We hope this change reduces the need of passing <code>--sdk-path</code> manually even more!</p>
<p>Additionally, we've improved the detection of external code (the tool treats all code from pub.dev packages as external) and it now correctly picks up the standard <code>PUB_CACHE</code> environment variable <a href="https://dart.dev/tools/pub/environment-variables" target="_blank" rel="noopener noreferrer" class="">recognized by pub</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-rules">New Rules<a href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/#new-rules" class="hash-link" aria-label="Direct link to New Rules" title="Direct link to New Rules" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="common">Common<a href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/#common" class="hash-link" aria-label="Direct link to Common" title="Direct link to Common" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-unremovable-callbacks-in-listeners"><a class="" href="https://dcm.dev/docs/rules/common/avoid-unremovable-callbacks-in-listeners/"><code>avoid-unremovable-callbacks-in-listeners</code></a><a href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/#avoid-unremovable-callbacks-in-listeners" class="hash-link" aria-label="Direct link to avoid-unremovable-callbacks-in-listeners" title="Direct link to avoid-unremovable-callbacks-in-listeners" translate="no">​</a></h4>
<p>Warns when an <code>addListener</code> invocation receives a callback that cannot be unregistered.</p>
<p>Since no function expression <code>(() =&gt; ... or () { ... })</code> is equal to any other function expression, passing it to <code>addListener</code> creates a callback that cannot be unregistered via <code>removeListener</code> and thus leads to a memory leak.</p>
<p>Same applies to extension method tear-offs as they are never equal to each other (including methods with the same signature).</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">SomeClass</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> _someListener </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Listener</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">work</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// LINT: Avoid passing function expressions as callbacks since they are never equal to each other and can't be unregistered.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    _someListener</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">addListener</span><span class="token punctuation" style="color:#a7dbf7">(</span><mark class="code-warning"><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token punctuation" style="color:#a7dbf7">}</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// LINT: Avoid passing function expressions as callbacks since they are never equal to each other and can't be unregistered</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    _someListener</span><span class="token punctuation" style="color:#a7dbf7">.</span><span class="token function" style="color:#87aff4">addListener</span><span class="token punctuation" style="color:#a7dbf7">(</span><mark class="code-warning"><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">null</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>To fix that, assign the function expression to a field or variable and use that field or variable in both <code>addListener</code> and <code>removeListener</code>.</p>
<p>You can also configure this rule to pass additional methods (for example, if you have a custom method that adds a listener).</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-constant-switches"><a class="" href="https://dcm.dev/docs/rules/common/avoid-constant-switches/"><code>avoid-constant-switches</code></a><a href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/#avoid-constant-switches" class="hash-link" aria-label="Direct link to avoid-constant-switches" title="Direct link to avoid-constant-switches" translate="no">​</a></h4>
<p>Warns when a switch expression or statement has a constant expression.</p>
<p>Constant expressions in switches always evaluate to the same value and usually indicate a typo or a bug.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: This expression is constant and will always evaluate to the same value.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Try changing this expression.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> value </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">Some</span><span class="token number" style="color:#8dec95">._</span><span class="token plain">val</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: This expression is constant and will always evaluate to the same value.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Try changing this expression.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><mark class="code-warning"><span class="token plain">_another</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">abstract</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Some</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> _val </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'1'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> _another </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">10</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<p>To fix this issue, try either using a different value or replacing the switch statement/expression with the branch that matches the constant value.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-constant-conditions"><a class="" href="https://dcm.dev/docs/rules/common/avoid-constant-conditions/"><code>avoid-constant-conditions</code></a><a href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/#avoid-constant-conditions" class="hash-link" aria-label="Direct link to avoid-constant-conditions" title="Direct link to avoid-constant-conditions" translate="no">​</a></h4>
<p>Warns when both sides of a binary expression are constant.</p>
<p>Constant conditions always evaluate to <code>true</code> or <code>false</code> and usually indicate a typo or a bug.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: This condition is constant and will always evaluate to 'false'.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Try changing this condition.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><mark class="code-warning"><span class="token plain">_another </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">11</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">value</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: This condition is constant and will always evaluate to 'true'.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Try changing this condition.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">Some</span><span class="token number" style="color:#8dec95">._</span><span class="token plain">val </span><span class="token operator" style="color:#00bff9">==</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'1'</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'hello'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'hi'</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">abstract</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Some</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> _val </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e1ffe4">'1'</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> _another </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">10</span><span class="token punctuation" style="color:#a7dbf7">;</span></span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="avoid-unused-local-variable"><a class="" href="https://dcm.dev/docs/rules/common/avoid-unused-local-variable/"><code>avoid-unused-local-variable</code></a><a href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/#avoid-unused-local-variable" class="hash-link" aria-label="Direct link to avoid-unused-local-variable" title="Direct link to avoid-unused-local-variable" translate="no">​</a></h4>
<p>Warns when a local variable is not referenced and can be removed or renamed to <code>_</code>.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">fn</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">var</span><span class="token plain"> a </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: This local variable is not used. Try removing the variable or using it.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><mark class="code-warning"><span class="token keyword" style="color:#00bff9">var</span><span class="token plain"> b </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> a</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">a</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">withRecord</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: This local variable is not used. Try removing the variable or using it.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">a</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><mark class="code-warning"><span class="token plain">b</span></mark><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token function" style="color:#87aff4">print</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">a</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="match-base-class-default-value"><a class="" href="https://dcm.dev/docs/rules/common/match-base-class-default-value/"><code>match-base-class-default-value</code></a><a href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/#match-base-class-default-value" class="hash-link" aria-label="Direct link to match-base-class-default-value" title="Direct link to match-base-class-default-value" translate="no">​</a></h4>
<p>Warns when the default value of a parameter in an overridden method does not match the default value of the base class parameter.</p>
<p>Changing the default value of a parameter can lead to subtle bugs when some subclasses of the base class have different behavior due to different default values. Additionally, this rule helps spot changes in the base class default values that have not been propagated to subclasses.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">A</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">work</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> defaultValue </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">false</span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">B</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">implements</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">A</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">// LINT: This default value does not match the default value of the base class parameter.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token comment" style="color:#999999">//  Try changing it to match the base class default value.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">work</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">{</span><mark class="code-warning"><span class="token class-name" style="color:#7fdbca">bool</span><span class="token plain"> defaultValue </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span></mark><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token number" style="color:#8dec95">.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>This rule comes with an <strong>IDE fix</strong>.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="prefer-test-structure"><a class="" href="https://dcm.dev/docs/rules/common/prefer-test-structure/"><code>prefer-test-structure</code></a><a href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/#prefer-test-structure" class="hash-link" aria-label="Direct link to prefer-test-structure" title="Direct link to prefer-test-structure" translate="no">​</a></h4>
<p>Warns when a test is not separated in three sections: <code>arrange</code>, <code>act</code>, <code>assert</code>.</p>
<p>Using those sections in your tests helps keep the same structure for all tests and ensures that tests are not doing multiple rounds of arrange and act.</p>
<p>For example,</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">main</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token function" style="color:#87aff4">test</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'bad unit test'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// act</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><mark class="code-warning"><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> a </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// LINT: This test is missing an arrange section before this act section. Try refactoring this test.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> b </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// arrange</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> c </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> a </span><span class="token operator" style="color:#00bff9">+</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// assert</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><mark class="code-warning"><span class="token function" style="color:#87aff4">expect</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">b</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> c</span><span class="token punctuation" style="color:#a7dbf7">)</span></mark><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// LINT: This test is missing an act section before this assert section. Try refactoring this test.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>is expected to be</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token keyword" style="color:#00bff9">void</span><span class="token plain"> </span><span class="token function" style="color:#87aff4">main</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token function" style="color:#87aff4">test</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token string-literal string" style="color:#e1ffe4">'good unit test'</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// arrange</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> a </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> b </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">2</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// act</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> c </span><span class="token operator" style="color:#00bff9">=</span><span class="token plain"> a </span><span class="token operator" style="color:#00bff9">+</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">1</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token comment" style="color:#999999">// assert</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token function" style="color:#87aff4">expect</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token plain">b</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> c</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="equatable">Equatable<a href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/#equatable" class="hash-link" aria-label="Direct link to Equatable" title="Direct link to Equatable" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="prefer-equatable-mixin"><a class="" href="https://dcm.dev/docs/rules/equatable/prefer-equatable-mixin/"><code>prefer-equatable-mixin</code></a><a href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/#prefer-equatable-mixin" class="hash-link" aria-label="Direct link to prefer-equatable-mixin" title="Direct link to prefer-equatable-mixin" translate="no">​</a></h4>
<p>Warns when a class extends <code>Equatable</code> instead of mixing in the <code>EquatableMixin</code>.</p>
<p>There is no upside in extending <code>Equatable</code>, but using the mixin allows you to also extend another class while keeping all equatable features.</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token comment" style="color:#999999">// LINT: The class should mix in 'EquatableMixin' instead of extending 'Equatable'.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token keyword" style="color:#00bff9">class</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Person</span><span class="token plain"> </span><mark class="code-warning"><span class="token keyword" style="color:#00bff9">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Equatable</span></mark><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">const</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">Person</span><span class="token punctuation" style="color:#a7dbf7">(</span><span class="token keyword" style="color:#00bff9">this</span><span class="token number" style="color:#8dec95">.</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">)</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token keyword" style="color:#00bff9">final</span><span class="token plain"> </span><span class="token class-name" style="color:#7fdbca">String</span><span class="token plain"> name</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token metadata function" style="color:#87aff4">@override</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token class-name" style="color:#7fdbca">List</span><span class="token generics punctuation" style="color:#a7dbf7">&lt;</span><span class="token generics class-name" style="color:#7fdbca">Object</span><span class="token generics punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00bff9">get</span><span class="token plain"> props </span><span class="token operator" style="color:#00bff9">=</span><span class="token operator" style="color:#00bff9">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token plain">name</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token punctuation" style="color:#a7dbf7">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span></span><br></span></code></pre></div></div>
<p>This rule comes with an <strong>IDE fix</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="pub">Pub<a href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/#pub" class="hash-link" aria-label="Direct link to Pub" title="Direct link to Pub" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="dependencies-ordering"><a class="" href="https://dcm.dev/docs/rules/pub/dependencies-ordering/"><code>dependencies-ordering</code></a><a href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/#dependencies-ordering" class="hash-link" aria-label="Direct link to dependencies-ordering" title="Direct link to dependencies-ordering" translate="no">​</a></h4>
<p>Suggests sorting pubspec dependencies in alphabetical order (A to Z).</p>
<p>Works for <code>dependencies</code>, <code>dev_dependencies</code> and <code>dependency_overrides</code> pubspec section.</p>
<p>For example,</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">pubspec.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token key atrule" style="color:#6dbdfa">name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> some_package</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token key atrule" style="color:#6dbdfa">description</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">...</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token key atrule" style="color:#6dbdfa">version</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> 1.0.0</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token key atrule" style="color:#6dbdfa">dependencies</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">xml</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">'&gt;=5.3.0 &lt;7.0.0'</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">yaml</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> 3.1.0+1</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">test</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> 1.22.2 </span><span class="token comment" style="color:#999999"># LINT: Dependencies are not sorted alphabetically. Try sorting them from A to Z.</span></span><br></span></code></pre></div></div>
<p>is expected to be</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">pubspec.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token key atrule" style="color:#6dbdfa">name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> some_package</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token key atrule" style="color:#6dbdfa">description</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">...</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token key atrule" style="color:#6dbdfa">version</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> 1.0.0</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token key atrule" style="color:#6dbdfa">dependencies</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">test</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> 1.22.2</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">xml</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">'&gt;=5.3.0 &lt;7.0.0'</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">yaml</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> 3.1.0+1</span></span><br></span></code></pre></div></div>
<p>Additionally, this rule supports a config option called <code>flutter</code> to separately configure the order of flutter-related dependencies.</p>
<p>For example,</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">analysis_options.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">pubspec-rules</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">dependencies-ordering</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">flutter</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> first</span></span><br></span></code></pre></div></div>
<p>will require <code>flutter</code> dependencies be first regardless of the alphabetical order.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">pubspec.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token key atrule" style="color:#6dbdfa">name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> some_package</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token key atrule" style="color:#6dbdfa">description</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">...</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token key atrule" style="color:#6dbdfa">version</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> 1.0.0</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token key atrule" style="color:#6dbdfa">dependencies</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">flutter</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">sdk</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> flutter</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">collection</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> ^1.18.0</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">xml</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">'&gt;=5.3.0 &lt;7.0.0'</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">yaml</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> 3.1.0+1</span></span><br></span></code></pre></div></div>
<p>This rule comes with an <strong>IDE fix</strong>.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="newline-before-pubspec-entry"><a class="" href="https://dcm.dev/docs/rules/pub/newline-before-pubspec-entry/"><code>newline-before-pubspec-entry</code></a><a href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/#newline-before-pubspec-entry" class="hash-link" aria-label="Direct link to newline-before-pubspec-entry" title="Direct link to newline-before-pubspec-entry" translate="no">​</a></h4>
<p>Enforces a blank line between the configured pubspec entries.</p>
<p>For example,</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">analysis_options.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token key atrule" style="color:#6dbdfa">dcm</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">pubspec-rules</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">newline-before-pubspec-entry</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">entries</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> environment</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> dependencies</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> dev_dependencies</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> flutter</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> dependencies</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain">collection</span></span><br></span></code></pre></div></div>
<p>will highligh the following cases</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">pubspec.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token key atrule" style="color:#6dbdfa">name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> some_package</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token key atrule" style="color:#6dbdfa">description</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">...</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token key atrule" style="color:#6dbdfa">version</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> 1.0.0</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token key atrule" style="color:#6dbdfa">environment</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token comment" style="color:#999999"># LINT: Missing a blank line before this entry. Try adding it.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">sdk</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">'&gt;=3.6.0 &lt;4.0.0'</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">flutter</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">'&gt;=3.27.1'</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token key atrule" style="color:#6dbdfa">dependencies</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token comment" style="color:#999999"># LINT: Missing a blank line before this entry. Try adding it.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">flutter</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">sdk</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> flutter</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">collection</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> ^1.18.0 </span><span class="token comment" style="color:#999999"># LINT: Missing a blank line before this entry. Try adding it.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">meta</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> ^1.12.0</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">ordered_set</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> ^8.0.0</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">vector_math</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> ^2.1.4</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token key atrule" style="color:#6dbdfa">dev_dependencies</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token comment" style="color:#999999"># LINT: Missing a blank line before this entry. Try adding it.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">benchmark_harness</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> ^2.3.1</span></span><br></span></code></pre></div></div>
<p>until they are formatted to</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">pubspec.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token key atrule" style="color:#6dbdfa">name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> some_package</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token key atrule" style="color:#6dbdfa">description</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">...</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token key atrule" style="color:#6dbdfa">version</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> 1.0.0</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token key atrule" style="color:#6dbdfa">environment</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">sdk</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">'&gt;=3.6.0 &lt;4.0.0'</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">flutter</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">'&gt;=3.27.1'</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token key atrule" style="color:#6dbdfa">dependencies</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">flutter</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">sdk</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> flutter</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">collection</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> ^1.18.0</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">meta</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> ^1.12.0</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">ordered_set</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> ^8.0.0</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">vector_math</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> ^2.1.4</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token key atrule" style="color:#6dbdfa">dev_dependencies</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">benchmark_harness</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> ^2.3.1</span></span><br></span></code></pre></div></div>
<p>This rule comes with an <strong>IDE fix</strong>.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="pubspec-ordering"><a class="" href="https://dcm.dev/docs/rules/pub/pubspec-ordering/"><code>pubspec-ordering</code></a><a href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/#pubspec-ordering" class="hash-link" aria-label="Direct link to pubspec-ordering" title="Direct link to pubspec-ordering" translate="no">​</a></h4>
<p>Suggests sorting pubspec entries in the configured order.</p>
<p>For example,</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">pubspec.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token key atrule" style="color:#6dbdfa">version</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> 1.0.0</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token key atrule" style="color:#6dbdfa">description</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">...</span><span class="token plain"> </span><span class="token comment" style="color:#999999"># LINT: 'description' should be before 'version'</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token key atrule" style="color:#6dbdfa">name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> some_package </span><span class="token comment" style="color:#999999"># LINT: 'name' should be before 'description'</span></span><br></span></code></pre></div></div>
<p>is expected to be</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">pubspec.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token key atrule" style="color:#6dbdfa">name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> some_package</span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token key atrule" style="color:#6dbdfa">description</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">...</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token key atrule" style="color:#6dbdfa">version</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> 1.0.0</span></span><br></span></code></pre></div></div>
<p>This rule comes with an <strong>IDE fix</strong>.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="add-resolution-workspace"><a class="" href="https://dcm.dev/docs/rules/pub/add-resolution-workspace/"><code>add-resolution-workspace</code></a><a href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/#add-resolution-workspace" class="hash-link" aria-label="Direct link to add-resolution-workspace" title="Direct link to add-resolution-workspace" translate="no">​</a></h4>
<p>Warns when a package is missing the <code>resolution: workspace</code> entry.</p>
<p>If you are using <a href="https://dart.dev/tools/pub/workspaces" target="_blank" rel="noopener noreferrer" class="">pub workspaces</a>, this rule helps to ensure that all subpackages are included into the workspace.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">pubspec.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token key atrule" style="color:#6dbdfa">name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> some_package </span><span class="token comment" style="color:#999999"># LINT: Add 'resolution: workspace' to include the package into your pub workspace.</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token key atrule" style="color:#6dbdfa">description</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">...</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain"></span><span class="token key atrule" style="color:#6dbdfa">version</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> 1.0.0</span></span><br></span></code></pre></div></div>
<p>This rule comes with an <strong>IDE fix</strong>.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="prefer-correct-topics"><a class="" href="https://dcm.dev/docs/rules/pub/prefer-correct-topics/"><code>prefer-correct-topics</code></a><a href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/#prefer-correct-topics" class="hash-link" aria-label="Direct link to prefer-correct-topics" title="Direct link to prefer-correct-topics" translate="no">​</a></h4>
<p>Warns when the <code>topics</code> section has incorrect entries.</p>
<p>You can find all requirements for this section on <a href="https://dart.dev/tools/pub/pubspec#topics" target="_blank" rel="noopener noreferrer" class="">the official website</a>.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">pubspec.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token key atrule" style="color:#6dbdfa">topics</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Network </span><span class="token comment" style="color:#999999"># LINT: The topic name should only use lowercase alphanumeric characters or hyphens and must start with a lowercase alphabet character</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_iPqp" style="color:#d6deeb"><span class="codeLineNumber_F4P7"></span><span class="codeLineContent_pOih"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> A </span><span class="token comment" style="color:#999999"># LINT: The topic name should have between 2 and 32 characters</span></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What’s next<a href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/#whats-next" class="hash-link" aria-label="Direct link to What’s next" title="Direct link to What’s next" translate="no">​</a></h2>
<p>To learn more about upcoming features, keep an eye on our <a href="https://dcm.featurebase.app/roadmap" target="_blank" rel="noopener noreferrer" class="">public roadmap</a>.</p>
<p>And to learn more about our upcoming videos and "Rules of the Week" content, subscribe to our <a href="https://www.youtube.com/@DCMAnalyzer" target="_blank" rel="noopener noreferrer" class="">Youtube Channel</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sharing-your-feedback">Sharing your feedback<a href="https://dcm.dev/blog/2025/10/15/whats-new-in-dcm-1-32-0/#sharing-your-feedback" class="hash-link" aria-label="Direct link to Sharing your feedback" title="Direct link to Sharing your feedback" translate="no">​</a></h2>
<p>If there is something you miss from DCM right now, want us to make something better, or have any general feedback — <a href="https://discord.gg/Vzjprgk4sb" target="_blank" rel="noopener noreferrer" class="">join our Discord server</a>! We’d love to hear from you.</p>]]></content>
        <author>
            <name>Dmitry Zhifarsky</name>
            <uri>https://dcm.dev</uri>
        </author>
        <category label="product-update" term="product-update"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Let Your AI Assistant Tame Your Tech Debt (with Dart, Flutter and DCM MCP Servers)]]></title>
        <id>https://dcm.dev/blog/2025/08/25/agentic-code-quality-dcm-mcp/</id>
        <link href="https://dcm.dev/blog/2025/08/25/agentic-code-quality-dcm-mcp/"/>
        <updated>2025-08-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[AI-generated code is creating tech debt. Learn how to build an agentic workflow that makes your AI assistant clean up after itself. This guide for Dart and Flutter developers uses DCM and MCP to automate code quality, fix inconsistencies, and keep your project maintainable.]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="Cover" src="https://dcm.dev/assets/images/2025-08-25-cover-9a5834cdda1628282a61f9f17616adba.jpg" width="1050" height="561" class="img_ev3q"></p>
<p>AI code generation is creating technical debt faster than ever before. Every AI-suggested shortcut, style inconsistency, and missed best practice taxes your team weeks later. Quality is no longer just a periodic check; it's a continuous, automated loop needed to keep a codebase sane</p>
<p>AI Assistants and Agents can orchestrate the quality loop end-to-end, which boosts velocity and more importantly consistency. The key is integration: when your assistant can call real, trusted tools through a clean interface, quality becomes a repeatable team habit.</p>
<p>That’s exactly what MCP enables and where <a href="https://dcm.dev/docs/ide-integrations/mcp-server/" target="_blank" rel="noopener noreferrer" class="">DCM’s MCP server</a> and the <a href="https://dart.dev/tools/mcp-server" target="_blank" rel="noopener noreferrer" class="">Dart/Flutter MCP server</a> step in which give agents structured access to analyze, fix, and verify and an ultimate code quality gatekeeper.</p>
<p>In this article, we are going through how you can leverage DCM together with Dart &amp; Flutter MCP server to make your AI assistant a trustworthy code agent. We will introduce reusable and sharable prompts that helps your team to leverage similar workable tasks and boost your productivity.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dartflutter-and-dcm-mcp-server">Dart/Flutter and DCM MCP Server<a href="https://dcm.dev/blog/2025/08/25/agentic-code-quality-dcm-mcp/#dartflutter-and-dcm-mcp-server" class="hash-link" aria-label="Direct link to Dart/Flutter and DCM MCP Server" title="Direct link to Dart/Flutter and DCM MCP Server" translate="no">​</a></h2>
<p>If quality is the habit, MCP is the plug. <a href="https://github.com/modelcontextprotocol" target="_blank" rel="noopener noreferrer" class="">Model Context Protocol</a> is the “USB-C for AI tools”: a small, open contract that lets an assistant discover local capabilities (“tools”), read context (“resources”), and understand the active workspace (“roots”), then call those tools predictably, usually over a simple standard input/output (stdio) channel.</p>
<p>Instead of editor plugins for every task, you expose one server and any MCP aware assistant can orchestrate the work. Think of it as moving from “I type commands” to “I ask for an outcome and my assistant drives DCM or Dart/Flutter through a well-defined set of tools.”</p>
<img src="https://dcm.dev/blog/2025-08-25/mcp-flow-light.webp" alt="MCP Server" class="themedComponent_mlkZ themedComponent--light_NVdE" width="2689" height="862" style="margin-bottom:20px;height:auto"><img src="https://dcm.dev/blog/2025-08-25/mcp-flow-dark.webp" alt="MCP Server" class="themedComponent_mlkZ themedComponent--dark_xIcU" width="2689" height="862" style="margin-bottom:20px;height:auto">
<p>Together, the two servers give your assistant a clean split of concerns: Dart/Flutter MCP for language/runtime actions and DCM MCP for code-quality work. The result is the same habit we’ve always wanted fast, consistent, team sharable quality loops, that is now wired into an agent that doesn’t forget the steps.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="enabling-the-dartflutter-mcp-server">Enabling the Dart/Flutter MCP Server<a href="https://dcm.dev/blog/2025/08/25/agentic-code-quality-dcm-mcp/#enabling-the-dartflutter-mcp-server" class="hash-link" aria-label="Direct link to Enabling the Dart/Flutter MCP Server" title="Direct link to Enabling the Dart/Flutter MCP Server" translate="no">​</a></h2>
<p>By default, the Dart extension uses the VS Code MCP API to register the Dart and Flutter MCP server, as well as a tool to provide the URI for the active Dart Tooling Daemon.</p>
<p>Explicitly enable or disable the Dart and Flutter MCP server by configuring the <code>dart.mcpServer</code> setting in your VS Code settings.</p>
<p>In VS Code, you can update your global setting or workspace by adding</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ...</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token property" style="color:#91dacd">"dart.mcpServer"</span><span class="token operator" style="color:#00bff9">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ...</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>and for Cursor you can add <code>~/.cursor/mcp.json</code></p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token property" style="color:#91dacd">"mcpServers"</span><span class="token operator" style="color:#00bff9">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token property" style="color:#91dacd">"dart"</span><span class="token operator" style="color:#00bff9">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token property" style="color:#91dacd">"command"</span><span class="token operator" style="color:#00bff9">:</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">"dart"</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token property" style="color:#91dacd">"args"</span><span class="token operator" style="color:#00bff9">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token string" style="color:#e1ffe4">"mcp-server"</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">"--force-roots-fallback"</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>For Windsurf, you can also add manually to <code>~/.codeium/windsurf/mcp_config.json</code></p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">~/.codeium/windsurf/mcp_config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token property" style="color:#91dacd">"mcpServers"</span><span class="token operator" style="color:#00bff9">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token property" style="color:#91dacd">"dcm"</span><span class="token operator" style="color:#00bff9">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token property" style="color:#91dacd">"command"</span><span class="token operator" style="color:#00bff9">:</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">"dcm"</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token property" style="color:#91dacd">"args"</span><span class="token operator" style="color:#00bff9">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token string" style="color:#e1ffe4">"start-mcp-server"</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">"--force-roots-fallback"</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">"--client=windsurf"</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="enabling-the-dcm-mcp-server">Enabling the DCM MCP Server<a href="https://dcm.dev/blog/2025/08/25/agentic-code-quality-dcm-mcp/#enabling-the-dcm-mcp-server" class="hash-link" aria-label="Direct link to Enabling the DCM MCP Server" title="Direct link to Enabling the DCM MCP Server" translate="no">​</a></h2>
<p>Practically, you don’t “install” a new binary; you tell your MCP client to start DCM in MCP mode over stdio. What you need is:</p>
<ul>
<li class="">DCM 1.31.0+ installed and on your PATH.</li>
<li class="">An MCP-capable client or integration (for example Cursor, GitHub Copilot, JetBrains IDEs, or Gemini CLI).</li>
</ul>
<p>Here is the setting in Cursor:</p>
<p><img decoding="async" loading="lazy" alt="Cursor and DCM MCP server" src="https://dcm.dev/assets/images/cursor-setting-bb5e7cb5d45527f92b6168c1c19060e5.webp" width="4038" height="2286" class="img_ev3q"></p>
<p>alternatively add that in <code>~/.cursor/mcp.json</code></p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token property" style="color:#91dacd">"mcpServers"</span><span class="token operator" style="color:#00bff9">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token property" style="color:#91dacd">"dcm"</span><span class="token operator" style="color:#00bff9">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token property" style="color:#91dacd">"command"</span><span class="token operator" style="color:#00bff9">:</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">"dcm"</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token property" style="color:#91dacd">"args"</span><span class="token operator" style="color:#00bff9">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a7dbf7">[</span><span class="token string" style="color:#e1ffe4">"start-mcp-server"</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"> </span><span class="token string" style="color:#e1ffe4">"--force-roots-fallback"</span><span class="token punctuation" style="color:#a7dbf7">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:#a7dbf7">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>or you can add the configuration to VS Code and access the DCM MCP server via GitHub Copilot:</p>
<p><img decoding="async" loading="lazy" alt="GitHub Copilot and DCM MCP server" src="https://dcm.dev/assets/images/copilot-setting-d1196b1f150340bf17c4db4658858f3a.webp" width="3680" height="1472" class="img_ev3q"></p>
<p>By default, the DCM extension uses the VS Code MCP API to register the DCM MCP server. Explicitly enable or disable the DCM MCP server by configuring the <code>dcm.enableMcpServer</code> setting in your VS Code settings.</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">settings.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token punctuation" style="color:#a7dbf7">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ...</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token property" style="color:#91dacd">"dcm.enableMcpServer"</span><span class="token operator" style="color:#00bff9">:</span><span class="token plain"> </span><span class="token boolean" style="color:#8dec95">true</span><span class="token punctuation" style="color:#a7dbf7">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ...</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:#a7dbf7">}</span><br></span></code></pre></div></div>
<p>If you are a Windsurf user, you can also find the MCP server in the setting via custom integration:</p>
<p><img decoding="async" loading="lazy" alt="Windsurf and DCM MCP server" src="https://dcm.dev/assets/images/windsurf_setting-3da0656e615bd4db4a5919cc64496b10.webp" width="2654" height="928" class="img_ev3q"></p>
<p>To learn more on how you can install and enable DCM on all possible clients with details, please visit our <a href="https://dcm.dev/docs/ide-integrations/mcp-server/" target="_blank" rel="noopener noreferrer" class="">DCM MCP Server</a> documentation.</p>
<p>Note, for this article example and demos we will use the following configuration:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">analysis_options.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token key atrule" style="color:#6dbdfa">include</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> package</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain">flutter_lints/flutter.yaml</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule" style="color:#6dbdfa">dart_code_metrics</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">extends</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> recommended</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">rules</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> avoid</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">slow</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">collection</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">methods</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> avoid</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">single</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">child</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">column</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">or</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">row</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> prefer</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">bytes</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">builder</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> prefer</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">declaring</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">const</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">constructor</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> avoid</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">map</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">keys</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">contains</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> avoid</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">border</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">all</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> avoid</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">incorrect</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">image</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">opacity</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> avoid</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">returning</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">widgets</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> avoid</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">unnecessary</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">setstate</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> pass</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">existing</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">future</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">to</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">future</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">builder</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> pass</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">existing</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">stream</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">to</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">stream</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">builder</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> prefer</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">const</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">border</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">radius</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> prefer</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">dedicated</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">media</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">query</span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain">methods</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">prefer-match-file-name</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#8dec95">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">avoid-undisposed-instances</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">ignored-instances</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> SomeClass</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">ignored-invocations</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> WithAutoDispose</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#6dbdfa">arguments-ordering</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">alphabetize</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#8dec95">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">first</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> some</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> name</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule" style="color:#6dbdfa">last</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> child</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> children</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">exclude</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">parameters</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:#a7dbf7">-</span><span class="token plain"> lib/generated/</span><span class="token important">**</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule" style="color:#6dbdfa">metrics</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">halstead-volume</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">50</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">cyclomatic-complexity</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">10</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">lines-of-code</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">10</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule" style="color:#6dbdfa">maximum-nesting-level</span><span class="token punctuation" style="color:#a7dbf7">:</span><span class="token plain"> </span><span class="token number" style="color:#8dec95">5</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="debugging-with-dart--flutter-mcp-server">Debugging with Dart / Flutter MCP Server<a href="https://dcm.dev/blog/2025/08/25/agentic-code-quality-dcm-mcp/#debugging-with-dart--flutter-mcp-server" class="hash-link" aria-label="Direct link to Debugging with Dart / Flutter MCP Server" title="Direct link to Debugging with Dart / Flutter MCP Server" translate="no">​</a></h2>
<p>The Dart and Flutter MCP server comes with so many great tools.</p>
<p>One of the most powerful parts of the Dart / Flutter MCP server is that it can surface <strong>runtime errors</strong> and even expand the widget tree context around a failing frame.</p>
<p>Instead of scanning logs manually, you can let the agent collect the right signals, point you at the exact file and line, and even re-run with a hot reload to confirm your changes.</p>
<p>Here’s a reusable prompt you can use as a debugging recipe:</p>
<div class="language-md codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-md codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token list punctuation" style="color:#a7dbf7">1.</span><span class="token plain"> Connect to the running app (Dart MCP: tooling daemon).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">2.</span><span class="token plain"> Fetch current runtime errors + stack traces (</span><span class="token code-snippet code keyword" style="color:#00bff9">`get_runtime_errors`</span><span class="token plain">).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">3.</span><span class="token plain"> Expand the widget tree at the top frame (</span><span class="token code-snippet code keyword" style="color:#00bff9">`get_widget_tree`</span><span class="token plain">).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">4.</span><span class="token plain"> Suggest the minimal code edits to fix the issue.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">5.</span><span class="token plain"> Run a </span><span class="token code-snippet code keyword" style="color:#00bff9">`hot_reload`</span><span class="token plain"> and re-fetch errors to confirm resolution.</span><br></span></code></pre></div></div>
<p>This is just the beginning, let's continue and see how you can leverage but Dart/Flutter MCP server along with DCM MCP server for high standard code quality checks in your codebase.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="generated-code--code-quality">Generated Code &amp; Code Quality<a href="https://dcm.dev/blog/2025/08/25/agentic-code-quality-dcm-mcp/#generated-code--code-quality" class="hash-link" aria-label="Direct link to Generated Code &amp; Code Quality" title="Direct link to Generated Code &amp; Code Quality" translate="no">​</a></h2>
<p>Every day, more of our code is AI-generated.</p>
<p>According to <a href="https://www.gitclear.com/ai_assistant_code_quality_2025_research" target="_blank" rel="noopener noreferrer" class="">GitClear AI Copilot Code Quality Research</a>: "4x more code cloning, "copy/paste" exceeds "moved" code for first time in history. Includes 2025 projections. Stack Overflow's 2024 Developer Survey showed that 63% of professional developers are currently using AI in their development process, with another 14% saying they plan to begin using AI soon.".</p>
<img src="https://dcm.dev/blog/2025-08-25/duplicate-by-yearlight-light.webp" alt="AI generated code" class="themedComponent_mlkZ themedComponent--light_NVdE" width="2689" height="862" style="margin-bottom:20px;height:auto"><img src="https://dcm.dev/blog/2025-08-25/duplicate-by-yearlight-dark.webp" alt="AI generated code" class="themedComponent_mlkZ themedComponent--dark_xIcU" width="2689" height="862" style="margin-bottom:20px;height:auto">
<p>That’s great for speed, but it also means more inconsistency that don’t follow our best practices, miss lint rules, or sneak in unsafe defaults. In practice, the code often needs a cleanup pass right after it’s produced.</p>
<p>This is exactly where an agentic loop helps.</p>
<p>Instead of manually chasing warnings, we let the assistant run the tools we already trust through MCP. With the DCM MCP server handling quality (analyze → safe autofix → format → re-analyze) and the Dart/Flutter MCP server surfacing analyzer issues, we can take fresh, generated code and bring it up to our bar in one predictable sweep before it ever hits a PR.</p>
<img src="https://dcm.dev/blog/2025-08-25/agent-mcp-light.webp" alt="Agent &amp; DCM MCP" class="themedComponent_mlkZ themedComponent--light_NVdE" width="2689" height="862" style="margin-bottom:20px;height:auto"><img src="https://dcm.dev/blog/2025-08-25/agent-mcp-dark.webp" alt="Agent &amp; DCM MCP" class="themedComponent_mlkZ themedComponent--dark_xIcU" width="2689" height="862" style="margin-bottom:20px;height:auto">
<p>We also keep sensible guardrails: skip known codegen artifacts (<code>*.g.dart</code>, <code>*.freezed.dart</code>, <code>build/**</code>) unless we explicitly opt in, and never stage or commit automatically.</p>
<p>The payoff is simple: faster iteration, fewer "surprise" reviews, and a codebase that stays readable and maintainable even as generation ramps up. In this section, we will share a few prompts that can be used as instruction for agents while they generate code and in upcoming section, we also provide reusable prompts that you can use for agentic approach to complete a series of tasks.</p>
<p>But let's start with instruction and guardrails on code quality.</p>
<div class="language-md codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">generated-code-quality.instruction.md</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-md codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">Instructions</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Run Dart/Flutter </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">analyzer</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain"> and </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">AutoFix</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain"> on the new/modified files.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Run </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">DCM analyze</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain"> on the same files → apply </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">safe</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain"> DCM autofixes → re-analyze.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Run Dart/Flutter </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">format</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Ensure formatting strictly follows project rules (re-run format if needed).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> If any analyzer </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">error</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain"> or DCM </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">error</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain"> remains, refine/regenerate and repeat the loop.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Separately analyze </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">generated artifacts</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain"> (e.g., </span><span class="token code-snippet code keyword" style="color:#00bff9">`**/*.g.dart`</span><span class="token plain">, </span><span class="token code-snippet code keyword" style="color:#00bff9">`**/*.freezed.dart`</span><span class="token plain">, </span><span class="token code-snippet code keyword" style="color:#00bff9">`build/**`</span><span class="token plain">) using:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token code-snippet code keyword" style="color:#00bff9">`dcm init lints-preview`</span><span class="token plain"> for modified files / new files to detect </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">high-priority rules not currently enabled</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain"> that would have caught issues especially performance, memory leaks risks but do </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">not</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain"> modify generated artifacts; propose upstream fixes or rule enablement instead.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Autofix warnings and style issues that DCM can automatically fix on modified / new files</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Stop when</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Errors = 0. Warnings are acceptable if reasonable; prefer small follow-up suggestions over disabling rules.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Output</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">Short summary</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain"> of what changed and which rules were fixed.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">Remaining warnings</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain"> (if any) with one-line suggestions.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">Lints-preview recommendations table</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain"> for generated artifacts:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  | rule_id | category | why it matters (perf/correctness/etc.) | suggested action (enable / tune) |</span><br></span></code></pre></div></div>
<p>While you can always write this instruction in your prompts or copy and paste, in different clients you may find possibilities that always can be taken into account for generated code.</p>
<p>For example, in VSCode GitHub Copilot, you can add <code>.github/copilot-instructions.md</code> and write this instruction where always on top of every request will be taken into account. or you may add custom instruction <code>*.instructions.md</code> under <code>.github/instructions</code> folder.</p>
<video width="100%" controls="" autoplay="" playsinline=""><source src="/video/05-instructions.mp4"></video>
<p>You can use the same instructions in other clients (such as Cursor). However, adding instructions in some clients may work differently.</p>
<p>Let's take Cursor as an example. There are a few steps you need to take:</p>
<ul>
<li class="">You can create project-wide <a href="https://docs.cursor.com/en/context/rules" target="_blank" rel="noopener noreferrer" class="">cursor rules</a></li>
<li class="">Add your instruction as <code>.mdc</code> file</li>
<li class="">Add the instruction into context when you want to generate code and use it in your project</li>
</ul>
<video width="100%" controls="" autoplay="" playsinline=""><source src="/video/06-cursor-rule.mp4"></video>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prompt-library">Prompt Library<a href="https://dcm.dev/blog/2025/08/25/agentic-code-quality-dcm-mcp/#prompt-library" class="hash-link" aria-label="Direct link to Prompt Library" title="Direct link to Prompt Library" translate="no">​</a></h2>
<p>Prompts are your team’s muscle memory in text form. Instead of “remember to run X with flags Y,” you ask for an outcome and let the agent orchestrate DCM via MCP. Each prompt below starts with a quick why/when, then a ready-to-paste block. By doing this, we make sure that agent can achieve what is expected in the best and fastest ways.</p>
<p>Each of the prompts is designed in a way that you can copy and paste them or download our list of prompts so that you can use in your projects.</p>
<p>Let's start with something simpler then move on to more advanced use cases with chain of commands.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="discovery--sharable-prompts">Discovery &amp; Sharable prompts<a href="https://dcm.dev/blog/2025/08/25/agentic-code-quality-dcm-mcp/#discovery--sharable-prompts" class="hash-link" aria-label="Direct link to Discovery &amp; Sharable prompts" title="Direct link to Discovery &amp; Sharable prompts" translate="no">​</a></h3>
<p>One of the simplest way to use DCM MCP server is to leverage the ability of turing our natural language into DCM specific features. For example, what if you want to look for specific rules for specific categories. Take this prompt as an example:</p>
<div class="language-md codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-md codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">Show me the list of available DCM rule tags</span><br></span></code></pre></div></div>
<p>or what if you say something like</p>
<div class="language-md codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-md codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">Show me all DCM rules that are related to performance and memory leaks and also targeting security issues in Flutter or Dart</span><br></span></code></pre></div></div>
<video width="100%" controls="" autoplay="" playsinline=""><source src="/video/01-discovery.mp4"></video>
<p>Now we can turn this simple prompts into more reusable and sharable prompt that everyone in our team also can use:</p>
<div class="language-dcm codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">discover-rules-by-intent.md</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dcm codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">Goal: Propose DCM rules that fit my intent, with YAML-ready IDs.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Context:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">- Use the DCM MCP rule catalog (ids, categories, severity, autofixable, short description).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">- If rules live in a dedicated DCM config, target that. Otherwise, prepare an analysis_options.yaml snippet.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">- Do NOT commit anything.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">- rules are always in analysis_options.yaml file and under dart_code_metrics as following example:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    dart_code_metrics:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      extends:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        - presets-name, e.g recommended</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      rules:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        - rule-id e.g avoid-slow-collection-methods # Comment</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      metrics:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        metric-id e.g lines-of-code: metric value e.g 10</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Steps:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">1) Query the rule catalog and filter rules based on {{["performance", "memory-leaks"]}} only on category {{["common", "flutter"]}}</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">2) Output a table:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   | rule_id | category | severity | autofixable | why it matches my keywords |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">3) Output a YAML-ready rules' Ids with same-line comments</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">4) Suggest what to try first (autofixable rules).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Output:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">- Markdown table with link to documentation</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">- Using reporter yaml to output analysis_option.yaml ready rules with only rules' IDs with no extra config</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">- A 3–5 line recommendation (“Start with these X rules because…”).</span><br></span></code></pre></div></div>
<video width="100%" controls="" autoplay="" playsinline=""><source src="/video/08-discovery.mp4"></video>
<p>For example, you can turn this template now into a sharable "GitHub Copilot Prompt" that can be checked out into the repository and everyone in the team can reuse it.</p>
<p>The steps for doing that is easy:</p>
<p><img decoding="async" loading="lazy" alt="Prompt file in VS Code and GitHub Copilot" src="https://dcm.dev/assets/images/chat-prompt-file-7214ba2bfa7365419fb51dacc3b31a40.webp" width="3586" height="1248" class="img_ev3q"></p>
<p>Either use Prompt Palette in VS Code and create a new "Prompt File" or create a folder under <code>.github</code> which is the root of the project and name it "prompts" and simply copy and paste the the template above into a markdown file.</p>
<video width="100%" controls="" autoplay="" playsinline=""><source src="/video/02-sharable-prompt.mp4"></video>
<p>For other editors, you can still use the same sharable prompt that you have created in your project. For example, you can use the same markdown file in Cursor as it shows below:</p>
<video width="100%" controls="" autoplay="" playsinline=""><source src="/video/03-sharable-prompt.mp4"></video>
<p>Now that we have seen how you can use prompts that can be reused in your team or even can be shared as a package let's explore more possibilities and more complex scenarios.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="workspace-quality-pass-analyze--autofix--pr">Workspace Quality Pass (Analyze → Autofix → PR)<a href="https://dcm.dev/blog/2025/08/25/agentic-code-quality-dcm-mcp/#workspace-quality-pass-analyze--autofix--pr" class="hash-link" aria-label="Direct link to Workspace Quality Pass (Analyze → Autofix → PR)" title="Direct link to Workspace Quality Pass (Analyze → Autofix → PR)" translate="no">​</a></h3>
<p>Use this as your everyday "make it clean and consistent" flow with no surprises, verified at the end.</p>
<div class="language-md codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">workspace-quality-pass.md</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-md codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">Goal: Run a full DCM quality pass across the whole branch: analyze → safe autofix → format → re-analyze → propose a PR commit message → list remaining issues with links.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Context</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Use DCM MCP tools for analyze/fix/format. Do NOT stage or commit.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Respect an existing baseline if present; call out only-new issues when relevant.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Output is in chat only (no files written).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Steps</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">1.</span><span class="token plain"> Analyze (whole workspace on current branch):</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Run DCM analyze across the entire workspace (minus .g.dart files and excluded files and folders).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Collect machine-readable findings and summarize:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">     • totals by severity</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">     • top rules by count</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">     • top files by count</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">2.</span><span class="token plain"> Safe Autofix:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Apply only safe/autofixable changes.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Show a unified diff preview (do NOT stage/commit).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> If the diff exceeds 200 lines, pause and ask before applying.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">3.</span><span class="token plain"> Format:Format files that were changed by autofixes.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">4.</span><span class="token plain"> Verify:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Re-run DCM analyze on the whole workspace.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Show before/after counts, noting any residual “error” severity.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">5.</span><span class="token plain"> Propose PR Commit Message:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Conventional header:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">     chore(dcm): apply safe autofixes across branch</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Bullets summarizing fixed rules with counts (e.g., </span><span class="token code-snippet code keyword" style="color:#00bff9">`avoid-unsafe-reduce: 7`</span><span class="token plain">).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Note: “safe fixes only; no files staged or committed.”</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">6.</span><span class="token plain"> Report Remaining Issues (with links):</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Produce a Markdown table:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">     | file | line | rule_id | message | link |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> For GitHub/GitLab/ADO remotes, construct a URL to the current {{branch}} at the line.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Otherwise, provide </span><span class="token code-snippet code keyword" style="color:#00bff9">`relative/path.dart:line`</span><span class="token plain">.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Constraints</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Never stage or commit automatically.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Only apply changes considered safe/autofixable by DCM.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Keep the chat output concise; collapse long logs into summaries.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Output</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Proposed PR commit message (fenced).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Summary of applied fixes (rule → count).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Table of remaining findings with links (file, line, rule_id, message, link).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> One-line next step (e.g., “open these files” or “run the tuning prompt”).</span><br></span></code></pre></div></div>
<p>Let's see this in action below:</p>
<video width="100%" controls="" autoplay="" playsinline=""><source src="/video/04-quality-check.mp4"></video>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="branch-quality-gate-dartflutter--dcm-mcp-servers">Branch Quality Gate (Dart/Flutter + DCM MCP Servers)<a href="https://dcm.dev/blog/2025/08/25/agentic-code-quality-dcm-mcp/#branch-quality-gate-dartflutter--dcm-mcp-servers" class="hash-link" aria-label="Direct link to Branch Quality Gate (Dart/Flutter + DCM MCP Servers)" title="Direct link to Branch Quality Gate (Dart/Flutter + DCM MCP Servers)" translate="no">​</a></h3>
<p>Now we’re entering a focused and very common flow. You only care about what you touched, and you want zero Dart/Flutter analyzer errors and zero DCM lint blockers before opening a PR.</p>
<p>This is where Dart MCP (analyzer) and DCM MCP (analyze → safe autofix → format → re-analyze) work together to clean up the diff and hand you a paste-ready PR summary.</p>
<div class="language-md codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">branch-quality-checks.md</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-md codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">Goal</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Scan all Dart files in the workspace with both Dart/Flutter analyzer and DCM.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Apply SAFE DCM autofixes and format, then re-check.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Produce a PR-ready summary and a proposed commit message.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> List anything still failing with links.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Context</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Use BOTH MCP servers:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Dart MCP server → run analyzer across all </span><span class="token code-snippet code keyword" style="color:#00bff9">`.dart`</span><span class="token plain"> files; surface errors/warnings (don’t auto-apply analyzer fixes).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> DCM MCP server → analyze + safe autofix + format + re-analyze across the workspace.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Treat diffs &gt; 200 changed lines as “large” and ASK before applying DCM autofixes.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Do NOT stage or commit changes automatically.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Output is in chat only (no files written).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Steps</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">1.</span><span class="token plain"> Discover targets:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Find all </span><span class="token code-snippet code keyword" style="color:#00bff9">`*.dart`</span><span class="token plain"> files in the workspace.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Exclude common generated/build outputs (e.g., </span><span class="token code-snippet code keyword" style="color:#00bff9">`/*.g.dart`</span><span class="token plain">, </span><span class="token code-snippet code keyword" style="color:#00bff9">`/*.freezed.dart`</span><span class="token plain">, </span><span class="token code-snippet code keyword" style="color:#00bff9">`build/`</span><span class="token plain">).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">2.</span><span class="token plain"> Dart/Flutter analyzer (via Dart MCP):</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Run analyzer on all discovered Dart files.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Collect errors/warnings with file, line, code, and message.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">3.</span><span class="token plain"> DCM pass (via DCM MCP) on the workspace:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Run DCM analyze; summarize by severity and rule.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Apply SAFE autofixes only; show a unified diff preview. If the diff exceeds 200 lines, pause and ask.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Format changed files.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Re-run DCM analyze to verify; show before/after counts.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">4.</span><span class="token plain"> Compose outputs:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Proposed commit message (conventional):</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">     """</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">     chore(quality): safe DCM autofixes + formatting (workspace)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">     </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> fixed:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">       </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token tag punctuation" style="color:#a7dbf7">&lt;</span><span class="token tag" style="color:#7fdbca">rule_id</span><span class="token tag punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain">: </span><span class="token tag punctuation" style="color:#a7dbf7">&lt;</span><span class="token tag" style="color:#7fdbca">count</span><span class="token tag punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">       </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token tag punctuation" style="color:#a7dbf7">&lt;</span><span class="token tag" style="color:#7fdbca">rule_id</span><span class="token tag punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain">: </span><span class="token tag punctuation" style="color:#a7dbf7">&lt;</span><span class="token tag" style="color:#7fdbca">count</span><span class="token tag punctuation" style="color:#a7dbf7">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">     </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> note: only safe DCM fixes applied; nothing staged/committed</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">       """</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> PR Summary (paste-ready):</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">     • Scope: all Dart files in workspace  </span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">     • DCM fixed: per-rule counts  </span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">     • Analyzer results: remaining errors/warnings  </span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">     • Remaining issues table (merged Dart/Flutter + DCM):</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">     | file | line | source | code/rule | message | link |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">     </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> For GitHub/GitLab/ADO, build URLs to the current HEAD line; else use </span><span class="token code-snippet code keyword" style="color:#00bff9">`relative/path.dart:line`</span><span class="token plain">.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Next steps: concise checklist for any residual error severity.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Constraints</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Never stage or commit automatically.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Only apply DCM-labeled safe/autofixable changes.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Keep output concise; collapse verbose logs into summaries.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Output</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Proposed PR commit message (fenced).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> PR Summary block (paste-ready).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Table of remaining issues with links (file, line, source=</span><span class="token code-snippet code keyword" style="color:#00bff9">`dart|flutter|dcm`</span><span class="token plain">, code/rule, message, link).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> One-line next step.</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="commands-combination">Commands Combination<a href="https://dcm.dev/blog/2025/08/25/agentic-code-quality-dcm-mcp/#commands-combination" class="hash-link" aria-label="Direct link to Commands Combination" title="Direct link to Commands Combination" translate="no">​</a></h3>
<p>Now that we have seen a few examples and templates of different scenarios, let's explore how you can combine multiple commands in one prompts and potentially re-use those prompts.</p>
<p>Essentially a combination of Flutter and Dart MCP server together with DCM MCP server gives even more powerful tasks to be executed by agents. Below are just a few examples. These are just prompt-openers which means you can add more tasks and responsibilities into these and make them even more autonomous.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="runtime-crashoverflow-to-fix-dart-mcp--dcm--hot-reload">Runtime Crash/Overflow to Fix (Dart MCP + DCM + Hot Reload)<a href="https://dcm.dev/blog/2025/08/25/agentic-code-quality-dcm-mcp/#runtime-crashoverflow-to-fix-dart-mcp--dcm--hot-reload" class="hash-link" aria-label="Direct link to Runtime Crash/Overflow to Fix (Dart MCP + DCM + Hot Reload)" title="Direct link to Runtime Crash/Overflow to Fix (Dart MCP + DCM + Hot Reload)" translate="no">​</a></h4>
<p>It might happen that a screen blows up with a RenderFlex overflow or null at runtime and you will miss the error logs. This is where asking the agent can be quite helpful to pull runtime errors and the widget subtree via Dart MCP, run targeted static checks with DCM MCP, apply only safe fixes, then hot-reload and confirm it’s gone.</p>
<p>Here is a template prompt that can make our branch before making a PR:</p>
<div class="language-md codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">runtime-issues.md</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-md codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">Goal</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Triage a runtime error (e.g., RenderFlex overflow, NPE), propose a fix, apply safe changes, and verify via hot reload.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Steps</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">1.</span><span class="token plain"> Connect to the Dart Tooling Daemon and fetch current runtime errors and stack traces (Dart MCP).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">2.</span><span class="token plain"> Expand the failing widget context (get_widget_tree at the stack’s top frame), capture key props (Dart MCP).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">3.</span><span class="token plain"> Open implicated files and run static checks (DCM analyze) only on those files.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">4.</span><span class="token plain"> Propose minimal code edits. Apply </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">only safe/autofixable</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain"> DCM fixes; format (DCM).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">5.</span><span class="token plain"> Hot-reload the app and re-query runtime errors (Dart MCP).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">6.</span><span class="token plain"> If still failing, show next-best edits; otherwise summarize: what changed, which DCM rules fired, before/after runtime status.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   Constraints</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Never stage/commit. Ask if edits exceed 200 changed lines.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  Output</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Short summary + diff snippet + linkable file:line list.</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="safe-dependency-upgrade--migration-gate">Safe Dependency Upgrade &amp; Migration Gate<a href="https://dcm.dev/blog/2025/08/25/agentic-code-quality-dcm-mcp/#safe-dependency-upgrade--migration-gate" class="hash-link" aria-label="Direct link to Safe Dependency Upgrade &amp; Migration Gate" title="Direct link to Safe Dependency Upgrade &amp; Migration Gate" translate="no">​</a></h4>
<p>It's quite often that we upgrade our packages. However, it might happen that after upgrade issues occur, that's one of the tasks that you can automate with and offload it to agents to do that for you and ensure everything is looking good even after upgrade:</p>
<p>Here is an example:</p>
<div class="language-md codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">dep-upgrade-check.md</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-md codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">Goal &amp; Context</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Use both always </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">Dart MCP</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain"> and </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">DCM MCP</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain"> to perform a safe package upgrade, apply fixes, and ensure no regressions slip in.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Steps</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">1.</span><span class="token plain"> </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">Plan upgrade</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain">:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Run MCP outdated dart pub command.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Propose a MCP dart pub upgrade --major-versions plan with preview output.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">2.</span><span class="token plain"> </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">Apply in isolation</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain">:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Apply upgrades in a </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">temporary patch</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain">.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Run analyzer across the workspace (Dart MCP: analyze_files).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">3.</span><span class="token plain"> </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">Fix candidates</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain">:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Propose fix --apply changes.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Show a unified diff preview and </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">ask before applying</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain">.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">4.</span><span class="token plain"> </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">Quality sweep</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain">:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Run DCM analyze.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Apply </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">safe autofixes</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain"> + format.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Re-analyze to verify.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">5.</span><span class="token plain"> </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">Summarize</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain">:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Highlight analyzer findings and any new DCM “error” severity issues.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Draft a PR message with upgraded packages, fixed rules, and follow-up recommendations.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Constraints</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Never stage or commit automatically.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Pause if the diff exceeds 400 lines.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Output</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">PR summary</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain"> including:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> List of upgraded packages.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Applied analyzer fixes (Dart MCP).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Applied DCM fixes with rule counts.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Remaining issues table: file, line, source=</span><span class="token code-snippet code keyword" style="color:#00bff9">`dart|dcm`</span><span class="token plain">, code/rule, message.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Recommended follow-ups.</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="performance--assets-health-metrics--widgets--assets">Performance &amp; Assets Health (metrics + widgets + assets)<a href="https://dcm.dev/blog/2025/08/25/agentic-code-quality-dcm-mcp/#performance--assets-health-metrics--widgets--assets" class="hash-link" aria-label="Direct link to Performance &amp; Assets Health (metrics + widgets + assets)" title="Direct link to Performance &amp; Assets Health (metrics + widgets + assets)" translate="no">​</a></h4>
<p>Having an agent to always take a look at the assets optimization and issues as well as running metrics to ensure you are on top of performance and maintainability of your codebase can boost your productivity.</p>
<p>Here is one example prompt:</p>
<div class="language-md codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">performance-assets-health.md</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-md codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">Goal</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Identify static performance risks and waste in UI/assets, propose quick wins, and verify.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Steps</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">1.</span><span class="token plain"> Calculate complexity metrics and list fns &gt; threshold (DCM metrics).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">2.</span><span class="token plain"> Run widget analysis for rebuild/structure smells and missing semantics (DCM analyze_widgets).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">3.</span><span class="token plain"> Audit image/asset issues (oversized, wrong formats/dimensions) (DCM analyze_assets).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">4.</span><span class="token plain"> Propose small refactors (extract methods, keys, consts), and image actions (compress/resize/convert).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">5.</span><span class="token plain"> Apply </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">safe</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain"> DCM fixes (if any) + format, then re-analyze to verify deltas.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   Output</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Markdown table of hotspots: (file | function/widget | issue | quick win) + suggested PR checklist.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  Constraints</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> No auto-commit; keep edits minimal and safe.</span><br></span></code></pre></div></div>
<p>You will see that even after getting the result, the code agent can suggest you how to fix some of the issues. Moreover, you can modify your favorite tool and get the agent fix the assets and performance issues.</p>
<video width="100%" controls="" autoplay="" playsinline=""><source src="/video/07-assets.mp4"></video>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="internationalization-audit-dart--dcm">Internationalization Audit (Dart + DCM)<a href="https://dcm.dev/blog/2025/08/25/agentic-code-quality-dcm-mcp/#internationalization-audit-dart--dcm" class="hash-link" aria-label="Direct link to Internationalization Audit (Dart + DCM)" title="Direct link to Internationalization Audit (Dart + DCM)" translate="no">​</a></h4>
<p>Missing translations and unused localization strings are common issues in Flutter projects. An agent equipped with the right tools can audit your code, flag these problems, and even suggest fixes, saving hours of manual effort and simplifying maintenance.</p>
<p>Here is an example that uses DCM to find unused i10n and help get them fixed or report back:</p>
<div class="language-md codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">i18n-audit.md</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-md codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">Goal</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Find hard-coded user-facing strings, clean up unused l10n, and align gen-l10n with analyzer.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Steps</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">1.</span><span class="token plain"> Scan for l10n issues and </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">unused l10n</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain"> (DCM: check_unused_l10n + analyze).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">2.</span><span class="token plain"> Detect hard-coded strings in UI files; propose extraction points and ARB keys (DCM findings + heuristics).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">3.</span><span class="token plain"> Validate l10n setup with analyzer (Dart MCP: analyze_files); report missing delegates/locale configs.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">4.</span><span class="token plain"> Offer a staged plan:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> generate/merge ARB entries,</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> replace literals with lookups (provide line-level edits),</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> remove unused keys.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">5.</span><span class="token plain"> Apply </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">safe</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain"> replacements where trivial; format; re-analyze (both).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   Output</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Checklist: new keys, replacements, remaining manual items with file:line links.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  Constraints</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Don’t auto-modify ARB files without confirmation.</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-custom-copilot-agent-chat-mode-for-dart--dcm">A Custom Copilot Agent (Chat Mode) for Dart + DCM<a href="https://dcm.dev/blog/2025/08/25/agentic-code-quality-dcm-mcp/#a-custom-copilot-agent-chat-mode-for-dart--dcm" class="hash-link" aria-label="Direct link to A Custom Copilot Agent (Chat Mode) for Dart + DCM" title="Direct link to A Custom Copilot Agent (Chat Mode) for Dart + DCM" translate="no">​</a></h2>
<p>GitHub Copilot lets you define custom chat modes (repo-scoped “agents” with their own instructions), and Copilot can also use MCP servers so your agent can call real tools (Dart/Flutter MCP, DCM MCP) from chat. This is great, as you can now always use your custom agents for different purposes and agents will always load and remember your system prompts and context.</p>
<p>In VS Code, you create a <code>.chatmode.md</code> file (or prompt/instructions files) and select it in the Copilot Chat UI; from there, the mode can invoke MCP tools and preconfigured MCP prompts.</p>
<p>Let's start by creating one <strong>Quality Gatekeeper</strong></p>
<p>This custom mode acts like a quality agent: analyze only the files you touched, suggest safe fixes, format, re-check, and output a paste-ready PR summary. It uses Dart MCP for analyzer/format and DCM MCP for analyze/fix/verify.</p>
<div class="language-md codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">Quality Gatekeeper.chatmode.md</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-md codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token front-matter-block punctuation" style="color:#a7dbf7">---</span><span class="token front-matter-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token front-matter-block"></span><span class="token front-matter-block front-matter yaml language-yaml key atrule" style="color:#6dbdfa">description</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#a7dbf7">:</span><span class="token front-matter-block front-matter yaml language-yaml"> </span><span class="token front-matter-block front-matter yaml language-yaml string" style="color:#e1ffe4">'Changed-files quality gate for Dart/Flutter using MCP tools'</span><span class="token front-matter-block front-matter yaml language-yaml"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token front-matter-block front-matter yaml language-yaml"></span><span class="token front-matter-block front-matter yaml language-yaml key atrule" style="color:#6dbdfa">tools</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#a7dbf7">:</span><span class="token front-matter-block front-matter yaml language-yaml"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token front-matter-block front-matter yaml language-yaml">  </span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#a7dbf7">[</span><span class="token front-matter-block front-matter yaml language-yaml"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token front-matter-block front-matter yaml language-yaml">    </span><span class="token front-matter-block front-matter yaml language-yaml string" style="color:#e1ffe4">'codebase'</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#a7dbf7">,</span><span class="token front-matter-block front-matter yaml language-yaml"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token front-matter-block front-matter yaml language-yaml">    </span><span class="token front-matter-block front-matter yaml language-yaml string" style="color:#e1ffe4">'usages'</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#a7dbf7">,</span><span class="token front-matter-block front-matter yaml language-yaml"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token front-matter-block front-matter yaml language-yaml">    </span><span class="token front-matter-block front-matter yaml language-yaml string" style="color:#e1ffe4">'vscodeAPI'</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#a7dbf7">,</span><span class="token front-matter-block front-matter yaml language-yaml"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token front-matter-block front-matter yaml language-yaml">    </span><span class="token front-matter-block front-matter yaml language-yaml string" style="color:#e1ffe4">'think'</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#a7dbf7">,</span><span class="token front-matter-block front-matter yaml language-yaml"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token front-matter-block front-matter yaml language-yaml">    </span><span class="token front-matter-block front-matter yaml language-yaml string" style="color:#e1ffe4">'problems'</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#a7dbf7">,</span><span class="token front-matter-block front-matter yaml language-yaml"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token front-matter-block front-matter yaml language-yaml">    </span><span class="token front-matter-block front-matter yaml language-yaml string" style="color:#e1ffe4">'changes'</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#a7dbf7">,</span><span class="token front-matter-block front-matter yaml language-yaml"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token front-matter-block front-matter yaml language-yaml">    </span><span class="token front-matter-block front-matter yaml language-yaml string" style="color:#e1ffe4">'testFailure'</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#a7dbf7">,</span><span class="token front-matter-block front-matter yaml language-yaml"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token front-matter-block front-matter yaml language-yaml">    </span><span class="token front-matter-block front-matter yaml language-yaml string" style="color:#e1ffe4">'terminalSelection'</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#a7dbf7">,</span><span class="token front-matter-block front-matter yaml language-yaml"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token front-matter-block front-matter yaml language-yaml">    </span><span class="token front-matter-block front-matter yaml language-yaml string" style="color:#e1ffe4">'terminalLastCommand'</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#a7dbf7">,</span><span class="token front-matter-block front-matter yaml language-yaml"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token front-matter-block front-matter yaml language-yaml">    </span><span class="token front-matter-block front-matter yaml language-yaml string" style="color:#e1ffe4">'openSimpleBrowser'</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#a7dbf7">,</span><span class="token front-matter-block front-matter yaml language-yaml"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token front-matter-block front-matter yaml language-yaml">    </span><span class="token front-matter-block front-matter yaml language-yaml string" style="color:#e1ffe4">'fetch'</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#a7dbf7">,</span><span class="token front-matter-block front-matter yaml language-yaml"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token front-matter-block front-matter yaml language-yaml">    </span><span class="token front-matter-block front-matter yaml language-yaml string" style="color:#e1ffe4">'findTestFiles'</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#a7dbf7">,</span><span class="token front-matter-block front-matter yaml language-yaml"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token front-matter-block front-matter yaml language-yaml">    </span><span class="token front-matter-block front-matter yaml language-yaml string" style="color:#e1ffe4">'searchResults'</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#a7dbf7">,</span><span class="token front-matter-block front-matter yaml language-yaml"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token front-matter-block front-matter yaml language-yaml">    </span><span class="token front-matter-block front-matter yaml language-yaml string" style="color:#e1ffe4">'githubRepo'</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#a7dbf7">,</span><span class="token front-matter-block front-matter yaml language-yaml"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token front-matter-block front-matter yaml language-yaml">    </span><span class="token front-matter-block front-matter yaml language-yaml string" style="color:#e1ffe4">'extensions'</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#a7dbf7">,</span><span class="token front-matter-block front-matter yaml language-yaml"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token front-matter-block front-matter yaml language-yaml">    </span><span class="token front-matter-block front-matter yaml language-yaml string" style="color:#e1ffe4">'runTests'</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#a7dbf7">,</span><span class="token front-matter-block front-matter yaml language-yaml"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token front-matter-block front-matter yaml language-yaml">    </span><span class="token front-matter-block front-matter yaml language-yaml string" style="color:#e1ffe4">'editFiles'</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#a7dbf7">,</span><span class="token front-matter-block front-matter yaml language-yaml"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token front-matter-block front-matter yaml language-yaml">    </span><span class="token front-matter-block front-matter yaml language-yaml string" style="color:#e1ffe4">'runNotebooks'</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#a7dbf7">,</span><span class="token front-matter-block front-matter yaml language-yaml"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token front-matter-block front-matter yaml language-yaml">    </span><span class="token front-matter-block front-matter yaml language-yaml string" style="color:#e1ffe4">'search'</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#a7dbf7">,</span><span class="token front-matter-block front-matter yaml language-yaml"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token front-matter-block front-matter yaml language-yaml">    </span><span class="token front-matter-block front-matter yaml language-yaml string" style="color:#e1ffe4">'new'</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#a7dbf7">,</span><span class="token front-matter-block front-matter yaml language-yaml"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token front-matter-block front-matter yaml language-yaml">    </span><span class="token front-matter-block front-matter yaml language-yaml string" style="color:#e1ffe4">'runCommands'</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#a7dbf7">,</span><span class="token front-matter-block front-matter yaml language-yaml"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token front-matter-block front-matter yaml language-yaml">    </span><span class="token front-matter-block front-matter yaml language-yaml string" style="color:#e1ffe4">'runTasks'</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#a7dbf7">,</span><span class="token front-matter-block front-matter yaml language-yaml"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token front-matter-block front-matter yaml language-yaml">    </span><span class="token front-matter-block front-matter yaml language-yaml string" style="color:#e1ffe4">'Dart SDK MCP Server'</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#a7dbf7">,</span><span class="token front-matter-block front-matter yaml language-yaml"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token front-matter-block front-matter yaml language-yaml">    </span><span class="token front-matter-block front-matter yaml language-yaml string" style="color:#e1ffe4">'DCM MCP Server'</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#a7dbf7">,</span><span class="token front-matter-block front-matter yaml language-yaml"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token front-matter-block front-matter yaml language-yaml">  </span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#a7dbf7">]</span><span class="token front-matter-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token front-matter-block"></span><span class="token front-matter-block punctuation" style="color:#a7dbf7">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token title important punctuation" style="color:#a7dbf7">###</span><span class="token title important"> Identity</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">You are a cautious, fast “quality gatekeeper” for Dart/Flutter repos. You only act on changed files, apply </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">safe</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain"> fixes, and never auto-commit.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token title important punctuation" style="color:#a7dbf7">###</span><span class="token title important"> Capabilities &amp; Sources</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Use </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">Dart MCP</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain"> tools: </span><span class="token code-snippet code keyword" style="color:#00bff9">`analyze_files`</span><span class="token plain">, </span><span class="token code-snippet code keyword" style="color:#00bff9">`dart_fix`</span><span class="token plain">, </span><span class="token code-snippet code keyword" style="color:#00bff9">`dart_format`</span><span class="token plain">.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Use </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">DCM MCP</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain"> tools: </span><span class="token code-snippet code keyword" style="color:#00bff9">`analyze`</span><span class="token plain">, </span><span class="token code-snippet code keyword" style="color:#00bff9">`fix (safe)`</span><span class="token plain">, </span><span class="token code-snippet code keyword" style="color:#00bff9">`analyze (verify)`</span><span class="token plain">.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> You may call preconfigured MCP prompts via </span><span class="token code-snippet code keyword" style="color:#00bff9">`/mcp.&lt;server&gt;.&lt;prompt&gt;`</span><span class="token plain"> if present.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Respect workspace roots and excludes: </span><span class="token code-snippet code keyword" style="color:#00bff9">`**/*.g.dart`</span><span class="token plain">, </span><span class="token code-snippet code keyword" style="color:#00bff9">`**/*.freezed.dart`</span><span class="token plain">, </span><span class="token code-snippet code keyword" style="color:#00bff9">`build/**`</span><span class="token plain">.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token title important punctuation" style="color:#a7dbf7">###</span><span class="token title important"> Operating Rules</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Do </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">not</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain"> stage or commit.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> If unified diff &gt; 200 lines, ask before continuing.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Keep output concise; include a paste-ready PR summary and table of any remaining issues.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> always </span><span class="token code-snippet code keyword" style="color:#00bff9">`format`</span><span class="token plain"> codes</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token title important punctuation" style="color:#a7dbf7">###</span><span class="token title important"> Default Workflow (trigger with: "Run gate")</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">1.</span><span class="token plain"> Detect changed files (vs PR base or repo default).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">2.</span><span class="token plain"> Dart MCP:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token code-snippet code keyword" style="color:#00bff9">`analyze_files`</span><span class="token plain"> on changed files; collect </span><span class="token code-snippet code keyword" style="color:#00bff9">`file`</span><span class="token plain">, </span><span class="token code-snippet code keyword" style="color:#00bff9">`line`</span><span class="token plain">, </span><span class="token code-snippet code keyword" style="color:#00bff9">`code`</span><span class="token plain">, </span><span class="token code-snippet code keyword" style="color:#00bff9">`message`</span><span class="token plain">.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Suggest </span><span class="token code-snippet code keyword" style="color:#00bff9">`dart_fix`</span><span class="token plain"> candidates; ask before applying. Run </span><span class="token code-snippet code keyword" style="color:#00bff9">`dart_format`</span><span class="token plain"> on changed files.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">3.</span><span class="token plain"> DCM MCP:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token code-snippet code keyword" style="color:#00bff9">`analyze`</span><span class="token plain"> on the same set; summarize by severity &amp; rule.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token code-snippet code keyword" style="color:#00bff9">`fix`</span><span class="token plain"> with </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">safe</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain"> autofixes only;</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Re-run </span><span class="token code-snippet code keyword" style="color:#00bff9">`analyze`</span><span class="token plain"> to verify; show before/after counts.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">4.</span><span class="token plain"> Output:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">Proposed commit message</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain"> (conventional </span><span class="token code-snippet code keyword" style="color:#00bff9">`chore(quality): safe DCM autofixes + format (changed files)`</span><span class="token plain">).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">PR Summary</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain"> with fixed rules (counts) and remaining issues:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">     | file | line | source (dart|dcm) | code/rule | message | link |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   </span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> One-line next step for any residual “error”.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token title important punctuation" style="color:#a7dbf7">###</span><span class="token title important"> Guardrails</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> Never touch generated artifacts unless asked.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token list punctuation" style="color:#a7dbf7">-</span><span class="token plain"> If analyzer/DCM still reports </span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token bold content">errors</span><span class="token bold punctuation" style="color:#a7dbf7">**</span><span class="token plain">, stop and list blockers with links.</span><br></span></code></pre></div></div>
<video width="100%" controls="" autoplay="" playsinline=""><source src="/video/09-custom-agent.mp4"></video>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="windsurf-cascade">Windsurf Cascade<a href="https://dcm.dev/blog/2025/08/25/agentic-code-quality-dcm-mcp/#windsurf-cascade" class="hash-link" aria-label="Direct link to Windsurf Cascade" title="Direct link to Windsurf Cascade" translate="no">​</a></h2>
<p>All the examples above can run in Windsurf Cascade AI Agent. Here is one command in the chat:</p>
<p><img decoding="async" loading="lazy" alt="Windsurf MCP DCM Example" src="https://dcm.dev/assets/images/windsurf_dcm_mcp_enabled-d1c1313a30314b61bef81374b3556c1d.webp" width="3648" height="2052" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="download-prompts--contribute">Download Prompts &amp; Contribute<a href="https://dcm.dev/blog/2025/08/25/agentic-code-quality-dcm-mcp/#download-prompts--contribute" class="hash-link" aria-label="Direct link to Download Prompts &amp; Contribute" title="Direct link to Download Prompts &amp; Contribute" translate="no">​</a></h2>
<p>We have bundled all the prompts and instructions into <a href="https://github.com/CQLabs/dcm-examples/tree/main/example_app/.github" target="_blank" rel="noopener noreferrer" class="">single repository</a> and clone it to your project to get started immediately. We will continue adding more in the future, so let's keep in touch and we will inform you once we have new updates.</p>
<p>We also encourage you to contribute and add more Dart/Flutter or DCM specific prompts so that we all can benefit from your great prompts too.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://dcm.dev/blog/2025/08/25/agentic-code-quality-dcm-mcp/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>AI is already changing the way we write code, but without guardrails it can also accelerate technical debt. By wiring Dart MCP and DCM MCP into your agentic workflows, you offload the repetitive cleanup work to tools you trust, analyze, fix, format, verify, while keeping humans focused on judgment calls. The result is faster iteration, consistent quality, and a codebase that stays maintainable even as more of it is machine-generated.</p>
<p>We are committed to provide sharable prompts and instructions that can be used widely within your company and teams to ensure code quality checks and health of your codebase is met using Dart and Flutter and DCM MCP servers. Hence, we will continue proving more trainings and articles in our blog or learn more about our upcoming videos in our <a href="https://www.youtube.com/@DCMAnalyzer" target="_blank" rel="noopener noreferrer" class="">Youtube Channel</a>.</p>
<p>If there is something you miss from DCM right now, want us to make something better, or have any general feedback, <a href="https://discord.gg/Vzjprgk4sb" target="_blank" rel="noopener noreferrer" class="">join our Discord server</a>! We’d love to hear from you.</p>
<p>Happy prompting!</p>
<div class="formWrapper_FeQU"><p class="formTitle_o9oT">Enjoying this article?</p><p>Subscribe to get our latest articles and product updates by email.</p><form class="footerForm_u4Zn"><input class="trialInput_rT6u" type="email" placeholder="Email address" name="blogEmail"><button type="submit" class="button button--primary button--sm formButton_cuTv">Subscribe</button></form></div>]]></content>
        <author>
            <name>Majid Hajian</name>
            <uri>https://dcm.dev</uri>
        </author>
        <category label="blog" term="blog"/>
    </entry>
</feed>