CINXE.COM
Debug Flutter apps from code | Flutter
<!doctype html><html lang="en"><head><meta charset="utf-8"><title>Debug Flutter apps from code | Flutter</title><link rel="icon" href="/assets/images/branding/flutter/icon/64.png" eleventy:ignore><link rel="apple-touch-icon" href="/assets/images/branding/flutter/logo/flutter-logomark-320px.png" eleventy:ignore><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="theme-color" content="#ffffff"><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><meta name="google-site-verification" content="HFqxhSbf9YA_0rBglNLzDiWnrHiK_w4cqDh2YD2GEY4"><script>!function(e,t,a,n){e[n]=e[n]||[],e[n].push({"gtm.start":(new Date).getTime(),event:"gtm.js"});var g=t.getElementsByTagName(a)[0],m=t.createElement(a);m.async=!0,m.src="https://www.googletagmanager.com/gtm.js?id=GTM-ND4LWWZ",g.parentNode.insertBefore(m,g)}(window,document,"script","dataLayer")</script><script>!function(e,a,t,n,c,o,s){e.GoogleAnalyticsObject=c,e[c]=e[c]||function(){(e[c].q=e[c].q||[]).push(arguments)},e[c].l=1*new Date,o=a.createElement(t),s=a.getElementsByTagName(t)[0],o.async=1,o.src="//www.google-analytics.com/analytics.js",s.parentNode.insertBefore(o,s)}(window,document,"script",0,"ga"),ga("create","UA-67589403-1","auto"),ga("send","pageview")</script><meta name="description" content="How to enable various debugging tools from your code and at the command line."><meta name="twitter:card" content="summary_large_image"><meta name="twitter:site" content="@flutterdev"><meta property="og:title" content="Debug Flutter apps from code"><meta property="og:url" content="https://docs.flutter.dev/testing/code-debugging"><meta property="og:description" content="How to enable various debugging tools from your code and at the command line."><meta property="og:image" content="https://docs.flutter.dev/assets/images/flutter-logo-sharing.png" eleventy:ignore><link href="https://fonts.googleapis.com/css2?family=Google+Sans:wght@400;500;700&display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css2?family=Google+Sans+Text:wght@400;500;700&display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css2?family=Google+Sans+Mono:wght@400;500;700&display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0" rel="stylesheet"><script>window.__CALLBACKS=[]</script><link rel="stylesheet" href="/assets/css/main.css?v=4"></head><body><section id="cookie-notice"><div class="container"><p>docs.flutter.dev uses cookies from Google to deliver and enhance the quality of its services and to analyze traffic. <a href="https://policies.google.com/technologies/cookies" target="_blank" rel="noopener">Learn more</a>.</p><button id="cookie-consent" class="filled-button">OK, got it</button></div></section><noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-ND4LWWZ" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript><div id="site-banner" role="alert"><p>Flutter 3.29 is here with a bouquet of performance and fidelity improvements for your apps! <a href="https://medium.com/flutter/whats-new-in-flutter-3-29-f90c380c2317">Learn more</a><br></p></div><header class="site-header"><a href="#document-title" id="skip-to-main" class="filled-button" tabindex="1">Skip to main content</a><nav class="navbar"><div id="site-switcher" class="dropdown"><button class="dropdown-button site-wordmark" aria-expanded="false" aria-controls="site-switcher-menu" aria-label="Switch between Flutter and Dart sites"><img src="/assets/images/branding/flutter/logo/default.svg" alt="Flutter logo" width="28"> <span>Flutter</span> <span class="subtype">Docs</span> <span class="material-symbols" aria-hidden="true">unfold_more</span></button><div class="dropdown-content" id="site-switcher-menu"><nav class="dropdown-menu" role="menu"><ul><li role="presentation"><a href="https://flutter.dev" class="site-wordmark" role="menuitem" title="Flutter homepage" aria-label="Go to the Flutter homepage"><img src="/assets/images/branding/flutter/logo/default.svg" alt="Flutter logo" width="28"> <span>Flutter</span></a></li><li role="presentation"><a href="https://docs.flutter.dev" class="site-wordmark current-site" role="menuitem" aria-current="true" title="Flutter docs homepage" aria-label="Go to the Flutter docs homepage"><img src="/assets/images/branding/flutter/logo/default.svg" alt="Flutter logo" width="28"> <span>Flutter</span> <span class="subtype">Docs</span></a></li><li role="presentation"><a href="https://api.flutter.dev" class="site-wordmark" role="menuitem" title="Flutter API reference" aria-label="Go to the Flutter API reference"><img src="/assets/images/branding/flutter/logo/default.svg" alt="Flutter logo" width="28"> <span>Flutter</span> <span class="subtype">API</span></a></li><li aria-hidden="true" class="dropdown-divider" role="separator"></li><li role="presentation"><a href="https://dart.dev" class="site-wordmark" role="menuitem" title="Dart homepage" aria-label="Go to the Dart homepage"><img src="/assets/images/branding/dart/logo.svg" alt="Dart logo" width="28" height="28"> <span>Dart</span></a></li><li role="presentation"><a href="https://dartpad.dev" class="site-wordmark" role="menuitem" title="DartPad playground" aria-label="Go to the DartPad playground"><img src="/assets/images/branding/dart/logo.svg" alt="Dart logo" width="28" height="28"> <span>DartPad</span></a></li><li role="presentation"><a href="https://pub.dev" class="site-wordmark" role="menuitem" title="pub.dev homepage" aria-label="Go to the pub.dev homepage"><img src="/assets/images/branding/dart/logo.svg" alt="Dart logo" width="28" height="28"> <span>pub.dev</span></a></li></ul></nav></div></div><div class="navbar-contents"><ul class="navbar-nav"><li class="nav-item"><a class="nav-link" href="https://flutter.dev">Homepage</a></li><li class="nav-item"><a class="nav-link" href="https://flutter.dev/community">Community</a></li><li class="nav-item"><a class="nav-link" href="https://pub.dev">Packages</a></li><li class="nav-item"><a class="nav-link" href="https://api.flutter.dev">API reference</a></li></ul><form action="/search/" class="site-header__search"><input class="site-header__searchfield search-field" type="search" name="q" id="q" autocomplete="off" placeholder="Search" aria-label="Search"></form><a href="/search" id="fallback-search-button" class="icon-button" aria-label="Navigate to the docs search page." title="Navigate to the docs search page."><span class="material-symbols" aria-hidden="true">search</span> </a><a id="call-to-action" class="filled-button" href="/get-started/install/">Get started</a> <button id="menu-toggle" class="icon-button" type="button" aria-controls="sidenav" aria-label="Toggle navigation" title="Toggle navigation"><span class="material-symbols" aria-hidden="true">menu</span></button></div></nav></header><div id="site-below-header"><div id="site-main-row"><div id="sidenav" class="site-sidebar"><nav><ul><li class="nav-header">Get started</li><li class="nav-item"><a class="nav-link" href="/get-started/install"><div><span>Set up Flutter</span></div></a></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-3" role="button" aria-expanded="false" aria-controls="sidenav-3"><span>Learn Flutter</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-3"><li class="nav-item"><a class="nav-link" href="/get-started/learn-flutter"><div><span>Introduction</span></div></a></li><li class="nav-item"><a class="nav-link" href="/get-started/codelab"><div><span>Write your first app</span></div></a></li><li class="nav-item"><button class="nav-link collapsible" data-toggle="collapse" data-target="#sidenav-3-3" role="button" aria-expanded="true" aria-controls="sidenav-3-3"><span>Learn the fundamentals</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse show" id="sidenav-3-3"><li class="nav-item"><a class="nav-link" href="/get-started/fundamentals"><div><span>Introduction</span></div></a></li><li class="nav-item"><a class="nav-link" href="/get-started/fundamentals/dart"><div><span>Intro to Dart</span></div></a></li><li class="nav-item"><a class="nav-link" href="/get-started/fundamentals/widgets"><div><span>Widgets</span></div></a></li><li class="nav-item"><a class="nav-link" href="/get-started/fundamentals/layout"><div><span>Layout</span></div></a></li><li class="nav-item"><a class="nav-link" href="/get-started/fundamentals/state-management"><div><span>State management</span></div></a></li><li class="nav-item"><a class="nav-link" href="/get-started/fundamentals/user-input"><div><span>Handling user input</span></div></a></li><li class="nav-item"><a class="nav-link" href="/get-started/fundamentals/networking"><div><span>Networking and data</span></div></a></li><li class="nav-item"><a class="nav-link" href="/get-started/fundamentals/local-caching"><div><span>Local data and caching</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-3-4" role="button" aria-expanded="false" aria-controls="sidenav-3-4"><span>From another platform?</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-3-4"><li class="nav-item"><a class="nav-link" href="/get-started/flutter-for/android-devs"><div><span>Flutter for Android devs</span></div></a></li><li class="nav-item"><a class="nav-link" href="/get-started/flutter-for/compose-devs"><div><span>Flutter for Jetpack Compose devs</span></div></a></li><li class="nav-item"><a class="nav-link" href="/get-started/flutter-for/swiftui-devs"><div><span>Flutter for SwiftUI devs</span></div></a></li><li class="nav-item"><a class="nav-link" href="/get-started/flutter-for/uikit-devs"><div><span>Flutter for UIKit devs</span></div></a></li><li class="nav-item"><a class="nav-link" href="/get-started/flutter-for/react-native-devs"><div><span>Flutter for React Native devs</span></div></a></li><li class="nav-item"><a class="nav-link" href="/get-started/flutter-for/web-devs"><div><span>Flutter for web devs</span></div></a></li><li class="nav-item"><a class="nav-link" href="/get-started/flutter-for/xamarin-forms-devs"><div><span>Flutter for Xamarin.Forms devs</span></div></a></li><li class="nav-item"><a class="nav-link" href="/get-started/flutter-for/declarative"><div><span>Introduction to declarative UI</span></div></a></li><li class="nav-item"><a class="nav-link" href="/get-started/flutter-for/dart-swift-concurrency"><div><span>Flutter versus Swift concurrency</span></div></a></li></ul></li><div class="sidenav-divider"></div><li class="nav-item"><a class="nav-link" href="/codelabs"><div><span>Codelabs</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook"><div><span>Cookbook</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://github.com/flutter/samples" target="_blank" rel="noopener"><div><span>Demos and samples</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-4" role="button" aria-expanded="false" aria-controls="sidenav-4"><span>Stay up to date</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-4"><li class="nav-item"><a class="nav-link" href="/release/upgrade"><div><span>Upgrade</span></div></a></li><li class="nav-item"><a class="nav-link" href="/release/archive"><div><span>SDK archive</span></div></a></li><div class="sidenav-divider"></div><li class="nav-item"><a class="nav-link" href="/release/whats-new"><div><span>What's new</span></div></a></li><li class="nav-item"><a class="nav-link" href="/release/release-notes"><div><span>Release notes</span></div></a></li><li class="nav-item"><a class="nav-link" href="/release/breaking-changes"><div><span>Breaking changes</span></div></a></li><li class="nav-item"><a class="nav-link" href="/release/compatibility-policy"><div><span>Compatibility policy</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-5" role="button" aria-expanded="false" aria-controls="sidenav-5"><span>App solutions</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-5"><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-5-1" role="button" aria-expanded="false" aria-controls="sidenav-5-1"><span>AI</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-5-1"><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-5-1-1" role="button" aria-expanded="false" aria-controls="sidenav-5-1-1"><span>AI Toolkit guide</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-5-1-1"><li class="nav-item"><a class="nav-link" href="/ai-toolkit"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ai-toolkit/user-experience"><div><span>User experience</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ai-toolkit/feature-integration"><div><span>Feature integration</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ai-toolkit/custom-llm-providers"><div><span>Custom LLM providers</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ai-toolkit/chat-client-sample"><div><span>Chat client sample</span></div></a></li></ul></li><li class="nav-item"><a class="nav-link" href="https://www.youtube.com/watch?v=1AuzJEiHjO4" target="_blank" rel="noopener"><div><span>Build with Google AI Dart SDK (video)</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-5-2" role="button" aria-expanded="false" aria-controls="sidenav-5-2"><span>Firebase & Firestore</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-5-2"><li class="nav-item"><a class="nav-link" href="/data-and-backend/firebase"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://firebase.google.com/docs/flutter" target="_blank" rel="noopener"><div><span>Discover Firebase for Flutter</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://www.youtube.com/watch?v=wUSkeTaBonA" target="_blank" rel="noopener"><div><span>Get to know Firebase for Flutter</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://firebase.google.com/codelabs/firebase-auth-in-flutter-apps" target="_blank" rel="noopener"><div><span>Add a user authentication flow to a Flutter app using FirebaseUI</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://firebase.google.com/codelabs/firebase-get-to-know-web" target="_blank" rel="noopener"><div><span>Get to know Firebase for web</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-5-3" role="button" aria-expanded="false" aria-controls="sidenav-5-3"><span>Games</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-5-3"><li class="nav-item"><a class="nav-link" href="/resources/games-toolkit"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/games/achievements-leaderboard"><div><span>Add achievements and leaderboards</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://firebase.google.com/codelabs/build-leaderboards-with-firestore#0" target="_blank" rel="noopener"><div><span>Build leaderboards with Firestore</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/plugins/google-mobile-ads"><div><span>Add advertising</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/games/firestore-multiplayer"><div><span>Add multiplayer support</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://codelabs.developers.google.com/codelabs/flutter-in-app-purchases" target="_blank" rel="noopener"><div><span>Add in-app purchases</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://firebase.google.com/codelabs/firebase-auth-in-flutter-apps" target="_blank" rel="noopener"><div><span>Add user authentication</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://firebase.google.com/docs/crashlytics/get-started?platform=flutter" target="_blank" rel="noopener"><div><span>Debug using Crashlytics</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://codelabs.developers.google.com/codelabs/flutter-flame-brick-breaker" target="_blank" rel="noopener"><div><span>Intro to Flame with Flutter</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-5-4" role="button" aria-expanded="false" aria-controls="sidenav-5-4"><span>Monetization</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-5-4"><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-5-4-1" role="button" aria-expanded="false" aria-controls="sidenav-5-4-1"><span>Advertising</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-5-4-1"><li class="nav-item"><a class="nav-link" href="/resources/ads-overview"><div><span>Ads overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/plugins/google-mobile-ads"><div><span>Add advertising</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://codelabs.developers.google.com/codelabs/admob-ads-in-flutter" target="_blank" rel="noopener"><div><span>Add AdMob ads to your Flutter app</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://codelabs.developers.google.com/codelabs/admob-inline-ads-in-flutter" target="_blank" rel="noopener"><div><span>Add an AdMob banner and native inline ads</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://developers.google.com/admob/flutter/mediation" target="_blank" rel="noopener"><div><span>Google AdMob mediation</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://pub.dev/packages/interactive_media_ads" target="_blank" rel="noopener"><div><span>Interactive Media Ads SDK</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-5-4-2" role="button" aria-expanded="false" aria-controls="sidenav-5-4-2"><span>In-app purchases</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-5-4-2"><li class="nav-item"><a class="nav-link" href="/resources/in-app-purchases-overview"><div><span>In-app purchases overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://codelabs.developers.google.com/codelabs/flutter-in-app-purchases" target="_blank" rel="noopener"><div><span>Add in-app purchases</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-5-4-3" role="button" aria-expanded="false" aria-controls="sidenav-5-4-3"><span>Payments</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-5-4-3"><li class="nav-item"><a class="nav-link" href="/resources/payments-overview"><div><span>Payments overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://pub.dev/packages/pay" target="_blank" rel="noopener"><div><span>Google pay package</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li></ul></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-5-5" role="button" aria-expanded="false" aria-controls="sidenav-5-5"><span>Maps</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-5-5"><li class="nav-item"><a class="nav-link" href="https://codelabs.developers.google.com/codelabs/google-maps-in-flutter" target="_blank" rel="noopener"><div><span>Add Google maps to a Flutter app</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://developers.google.com/maps/flutter-package" target="_blank" rel="noopener"><div><span>Google Maps package</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-5-6" role="button" aria-expanded="false" aria-controls="sidenav-5-6"><span>News</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-5-6"><li class="nav-item"><a class="nav-link" href="/resources/news-toolkit"><div><span>Build a news app</span></div></a></li></ul></li></ul></li><li aria-hidden="true"><div class="sidenav-divider"></div></li><li class="nav-header">User interface</li><li class="nav-item"><a class="nav-link" href="/ui"><div><span>Introduction</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/widgets"><div><span>Widget catalog</span></div></a></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-10" role="button" aria-expanded="false" aria-controls="sidenav-10"><span>Layout</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-10"><li class="nav-item"><a class="nav-link" href="/ui/layout"><div><span>Introduction</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/layout/tutorial"><div><span>Build a layout</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-10-3" role="button" aria-expanded="false" aria-controls="sidenav-10-3"><span>Lists & grids</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-10-3"><li class="nav-item"><a class="nav-link" href="/cookbook/lists/basic-list"><div><span>Create and use lists</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/lists/horizontal-list"><div><span>Create a horizontal list</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/lists/grid-lists"><div><span>Create a grid view</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/lists/mixed-list"><div><span>Create lists with different types of items</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/lists/spaced-items"><div><span>Create lists with spaced items</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/lists/long-lists"><div><span>Work with long lists</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-10-4" role="button" aria-expanded="false" aria-controls="sidenav-10-4"><span>Scrolling</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-10-4"><li class="nav-item"><a class="nav-link" href="/ui/layout/scrolling"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/layout/scrolling/slivers"><div><span>Use slivers to achieve fancy scrolling</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/lists/floating-app-bar"><div><span>Place a floating app bar above a list</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/effects/parallax-scrolling"><div><span>Create a scrolling parallax effect</span></div></a></li></ul></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-11" role="button" aria-expanded="false" aria-controls="sidenav-11"><span>Adaptive & responsive design</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-11"><li class="nav-item"><a class="nav-link" href="/ui/adaptive-responsive"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/adaptive-responsive/general"><div><span>General approach</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/adaptive-responsive/safearea-mediaquery"><div><span>SafeArea & MediaQuery</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/adaptive-responsive/large-screens"><div><span>Large screens & foldables</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/adaptive-responsive/input"><div><span>User input & accessibility</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/adaptive-responsive/capabilities"><div><span>Capabilities & policies</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/adaptive-responsive/platform-adaptations"><div><span>Automatic platform adaptations</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/adaptive-responsive/best-practices"><div><span>Best practices</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/adaptive-responsive/more-info"><div><span>Additional resources</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-12" role="button" aria-expanded="false" aria-controls="sidenav-12"><span>Design & theming</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-12"><li class="nav-item"><a class="nav-link" href="/cookbook/design/themes"><div><span>Share styles with themes</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/design/material"><div><span>Material design</span></div></a></li><li class="nav-item"><a class="nav-link" href="/release/breaking-changes/material-3-migration"><div><span>Migrate to Material 3</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-12-4" role="button" aria-expanded="false" aria-controls="sidenav-12-4"><span>Text</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-12-4"><li class="nav-item"><a class="nav-link" href="/ui/design/text/typography"><div><span>Fonts & typography</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/design/fonts"><div><span>Use a custom font</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/design/package-fonts"><div><span>Export fonts from a package</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://pub.dev/packages/google_fonts" target="_blank" rel="noopener"><div><span>Google Fonts package</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-12-5" role="button" aria-expanded="false" aria-controls="sidenav-12-5"><span>Custom graphics</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-12-5"><li class="nav-item"><a class="nav-link" href="/ui/design/graphics/fragment-shaders"><div><span>Use custom fragment shaders</span></div></a></li></ul></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-13" role="button" aria-expanded="false" aria-controls="sidenav-13"><span>Interactivity</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-13"><li class="nav-item"><a class="nav-link" href="/ui/interactivity"><div><span>Add interactivity to your app</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-13-2" role="button" aria-expanded="false" aria-controls="sidenav-13-2"><span>Gestures</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-13-2"><li class="nav-item"><a class="nav-link" href="/ui/interactivity/gestures"><div><span>Introduction</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/gestures/handling-taps"><div><span>Handle taps</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/interactivity/gestures/drag-outside"><div><span>Drag an object outside an app</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/effects/drag-a-widget"><div><span>Drag a UI element within an app</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/gestures/ripples"><div><span>Add Material touch ripples</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/gestures/dismissible"><div><span>Implement swipe to dismiss</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-13-3" role="button" aria-expanded="false" aria-controls="sidenav-13-3"><span>Input & forms</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-13-3"><li class="nav-item"><a class="nav-link" href="/cookbook/forms/text-input"><div><span>Create and style a text field</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/forms/retrieve-input"><div><span>Retrieve the value of a text field</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/forms/text-field-changes"><div><span>Handle changes to a text field</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/forms/focus"><div><span>Manage focus in text fields</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/forms/validation"><div><span>Build a form with validation</span></div></a></li></ul></li><li class="nav-item"><a class="nav-link" href="/cookbook/design/snackbars"><div><span>Display a snackbar</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/interactivity/actions-and-shortcuts"><div><span>Implement actions & shortcuts</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/interactivity/focus"><div><span>Manage keyboard focus</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-14" role="button" aria-expanded="false" aria-controls="sidenav-14"><span>Assets & media</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-14"><li class="nav-item"><a class="nav-link" href="/ui/assets/assets-and-images"><div><span>Add assets and images</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/images/network-image"><div><span>Display images from the internet</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/images/fading-in-images"><div><span>Fade in images with a placeholder</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/plugins/play-video"><div><span>Play and pause a video</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/assets/asset-transformation"><div><span>Transform assets at build time</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-15" role="button" aria-expanded="false" aria-controls="sidenav-15"><span>Navigation & routing</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-15"><li class="nav-item"><a class="nav-link" href="/ui/navigation"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/design/tabs"><div><span>Add tabs to your app</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/navigation/navigation-basics"><div><span>Navigate to a new screen and back</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/navigation/passing-data"><div><span>Send data to a new screen</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/navigation/returning-data"><div><span>Return data from a screen</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/design/drawer"><div><span>Add a drawer to a screen</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/navigation/deep-linking"><div><span>Set up deep linking</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/navigation/set-up-app-links"><div><span>Set up app links for Android</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/navigation/set-up-universal-links"><div><span>Set up universal links for iOS</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/navigation/url-strategies"><div><span>Configure web URL strategies</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-16" role="button" aria-expanded="false" aria-controls="sidenav-16"><span>Animations & transitions</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-16"><li class="nav-item"><a class="nav-link" href="/ui/animations"><div><span>Introduction</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/animations/tutorial"><div><span>Tutorial</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/animations/implicit-animations"><div><span>Implicit animations</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/animation/animated-container"><div><span>Animate the properties of a container</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/animation/opacity-animation"><div><span>Fade a widget in and out</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/animations/hero-animations"><div><span>Hero animations</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/animation/page-route-animation"><div><span>Animate a page route transition</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/animation/physics-simulation"><div><span>Animate using a physics simulation</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/animations/staggered-animations"><div><span>Staggered animations</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/effects/staggered-menu-animation"><div><span>Create a staggered menu animation</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/animations/overview"><div><span>API overview</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-17" role="button" aria-expanded="false" aria-controls="sidenav-17"><span>Accessibility & internationalization</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-17"><li class="nav-item"><a class="nav-link" href="/ui/accessibility-and-internationalization/accessibility"><div><span>Accessibility</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/accessibility-and-internationalization/internationalization"><div><span>Internationalization</span></div></a></li></ul></li><li aria-hidden="true"><div class="sidenav-divider"></div></li><li class="nav-header">Beyond UI</li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-20" role="button" aria-expanded="false" aria-controls="sidenav-20"><span>Data & backend</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-20"><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-20-1" role="button" aria-expanded="false" aria-controls="sidenav-20-1"><span>State management</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-20-1"><li class="nav-item"><a class="nav-link" href="/data-and-backend/state-mgmt/intro"><div><span>Introduction</span></div></a></li><li class="nav-item"><a class="nav-link" href="/data-and-backend/state-mgmt/declarative"><div><span>Think declaratively</span></div></a></li><li class="nav-item"><a class="nav-link" href="/data-and-backend/state-mgmt/ephemeral-vs-app"><div><span>Ephemeral vs app state</span></div></a></li><li class="nav-item"><a class="nav-link" href="/data-and-backend/state-mgmt/simple"><div><span>Simple app state management</span></div></a></li><li class="nav-item"><a class="nav-link" href="/data-and-backend/state-mgmt/options"><div><span>Options</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-20-2" role="button" aria-expanded="false" aria-controls="sidenav-20-2"><span>Networking & http</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-20-2"><li class="nav-item"><a class="nav-link" href="/data-and-backend/networking"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/networking/fetch-data"><div><span>Fetch data from the internet</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/networking/authenticated-requests"><div><span>Make authenticated requests</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/networking/send-data"><div><span>Send data to the internet</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/networking/update-data"><div><span>Update data over the internet</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/networking/delete-data"><div><span>Delete data on the internet</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/networking/web-sockets"><div><span>Communicate with WebSockets</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-20-3" role="button" aria-expanded="false" aria-controls="sidenav-20-3"><span>Serialization</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-20-3"><li class="nav-item"><a class="nav-link" href="/data-and-backend/serialization/json"><div><span>JSON serialization</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/networking/background-parsing"><div><span>Parse JSON in the background</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-20-4" role="button" aria-expanded="false" aria-controls="sidenav-20-4"><span>Persistence</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-20-4"><li class="nav-item"><a class="nav-link" href="/cookbook/persistence/key-value"><div><span>Store key-value data on disk</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/persistence/reading-writing-files"><div><span>Read and write files</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/persistence/sqlite"><div><span>Persist data with SQLite</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-20-5" role="button" aria-expanded="false" aria-controls="sidenav-20-5"><span>Firebase</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-20-5"><li class="nav-item"><a class="nav-link" href="/data-and-backend/firebase"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://firebase.google.com/docs/flutter/setup" target="_blank" rel="noopener"><div><span>Add Firebase to your Flutter app</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li></ul></li><li class="nav-item"><a class="nav-link" href="/data-and-backend/google-apis"><div><span>Google APIs</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-21" role="button" aria-expanded="false" aria-controls="sidenav-21"><span>App architecture</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-21"><li class="nav-item"><a class="nav-link" href="/app-architecture"><div><span>Introduction</span></div></a></li><li class="nav-item"><a class="nav-link" href="/app-architecture/concepts"><div><span>Architecture concepts</span></div></a></li><li class="nav-item"><a class="nav-link" href="/app-architecture/guide"><div><span>Guide to app architecture</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-21-4" role="button" aria-expanded="false" aria-controls="sidenav-21-4"><span>Architecture case study</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-21-4"><li class="nav-item"><a class="nav-link" href="/app-architecture/case-study"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/app-architecture/case-study/ui-layer"><div><span>UI layer</span></div></a></li><li class="nav-item"><a class="nav-link" href="/app-architecture/case-study/data-layer"><div><span>Data layer</span></div></a></li><li class="nav-item"><a class="nav-link" href="/app-architecture/case-study/dependency-injection"><div><span>Dependency injection</span></div></a></li><li class="nav-item"><a class="nav-link" href="/app-architecture/case-study/testing"><div><span>Testing each layer</span></div></a></li></ul></li><li class="nav-item"><a class="nav-link" href="/app-architecture/recommendations"><div><span>Recommendations</span></div></a></li><li class="nav-item"><a class="nav-link" href="/app-architecture/design-patterns"><div><span>Design patterns</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-22" role="button" aria-expanded="false" aria-controls="sidenav-22"><span>Platform integration</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-22"><li class="nav-item"><a class="nav-link" href="/reference/supported-platforms"><div><span>Supported platforms</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/desktop"><div><span>Build desktop apps with Flutter</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/platform-channels"><div><span>Write platform-specific code</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-22-4" role="button" aria-expanded="false" aria-controls="sidenav-22-4"><span>Android</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-22-4"><li class="nav-item"><a class="nav-link" href="/platform-integration/android/install-android"><div><span>Add Android as build target</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/android/splash-screen"><div><span>Add a splash screen</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/android/predictive-back"><div><span>Add predictive back</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/android/c-interop"><div><span>Bind to native code</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/android/platform-views"><div><span>Host a native Android view</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/android/call-jetpack-apis"><div><span>Calling JetPack APIs</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/android/compose-activity"><div><span>Launch a Jetpack Compose activity</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/android/restore-state-android"><div><span>Restore state on Android</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/android/chromeos"><div><span>Target ChromeOS with Android</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-22-5" role="button" aria-expanded="false" aria-controls="sidenav-22-5"><span>iOS</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-22-5"><li class="nav-item"><a class="nav-link" href="/platform-integration/ios/install-ios"><div><span>Add iOS as build target</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/ios/ios-latest"><div><span>Flutter on latest iOS</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/ios/apple-frameworks"><div><span>Leverage Apple's system libraries</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/ios/launch-screen"><div><span>Add a launch screen</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/ios/ios-app-clip"><div><span>Add iOS App Clip support</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/ios/app-extensions"><div><span>Add iOS app extensions</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/ios/c-interop"><div><span>Bind to native code</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/ios/platform-views"><div><span>Host a native iOS view</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/ios/ios-debugging"><div><span>Enable debugging on iOS</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/ios/restore-state-ios"><div><span>Restore state on iOS</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-22-6" role="button" aria-expanded="false" aria-controls="sidenav-22-6"><span>Linux</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-22-6"><li class="nav-item"><a class="nav-link" href="/platform-integration/linux/install-linux"><div><span>Add Linux as build target</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/linux/building"><div><span>Build a Linux app</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-22-7" role="button" aria-expanded="false" aria-controls="sidenav-22-7"><span>macOS</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-22-7"><li class="nav-item"><a class="nav-link" href="/platform-integration/macos/install-macos"><div><span>Add macOS as build target</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/macos/building"><div><span>Build a macOS app</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/macos/c-interop"><div><span>Bind to native code</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/macos/platform-views"><div><span>Host a native macOS view</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-22-8" role="button" aria-expanded="false" aria-controls="sidenav-22-8"><span>Web</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-22-8"><li class="nav-item"><a class="nav-link" href="/platform-integration/web"><div><span>Web support in Flutter</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/web/install-web"><div><span>Add web as build target</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/web/building"><div><span>Build a web app</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/web/wasm"><div><span>Compile to WebAssembly</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/web/initialization"><div><span>Customize app initialization</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/web/embedding-flutter-web"><div><span>Add Flutter to any web app</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/web/web-content-in-flutter"><div><span>Web content in Flutter</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/web/renderers"><div><span>Web renderers</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/web/web-images"><div><span>Display images on the web</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/web/faq"><div><span>Web FAQ</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-22-9" role="button" aria-expanded="false" aria-controls="sidenav-22-9"><span>Windows</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-22-9"><li class="nav-item"><a class="nav-link" href="/platform-integration/windows/install-windows"><div><span>Add Windows as build target</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/windows/building"><div><span>Build a Windows app</span></div></a></li></ul></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-23" role="button" aria-expanded="false" aria-controls="sidenav-23"><span>Packages & plugins</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-23"><li class="nav-item"><a class="nav-link" href="/packages-and-plugins/using-packages"><div><span>Use packages & plugins</span></div></a></li><li class="nav-item"><a class="nav-link" href="/packages-and-plugins/developing-packages"><div><span>Develop packages & plugins</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-23-3" role="button" aria-expanded="false" aria-controls="sidenav-23-3"><span>Swift Package Manager</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-23-3"><li class="nav-item"><a class="nav-link" href="/packages-and-plugins/swift-package-manager/for-app-developers"><div><span>For app developers</span></div></a></li><li class="nav-item"><a class="nav-link" href="/packages-and-plugins/swift-package-manager/for-plugin-authors"><div><span>For plugin authors</span></div></a></li></ul></li><div class="sidenav-divider"></div><li class="nav-item"><a class="nav-link" href="/packages-and-plugins/favorites"><div><span>Flutter Favorites</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://pub.dev/flutter" target="_blank" rel="noopener"><div><span>Package repository</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link active collapsible" data-toggle="collapse" data-target="#sidenav-24" role="button" aria-expanded="true" aria-controls="sidenav-24"><span>Testing & debugging</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse show" id="sidenav-24"><li class="nav-header">Testing</li><li class="nav-item"><a class="nav-link" href="/testing/overview"><div><span>Overview</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-24-3" role="button" aria-expanded="false" aria-controls="sidenav-24-3"><span>Unit testing</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-24-3"><li class="nav-item"><a class="nav-link" href="/cookbook/testing/unit/introduction"><div><span>Introduction</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/testing/unit/mocking"><div><span>Mock dependencies</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-24-4" role="button" aria-expanded="false" aria-controls="sidenav-24-4"><span>Widget testing</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-24-4"><li class="nav-item"><a class="nav-link" href="/cookbook/testing/widget/introduction"><div><span>Introduction</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/testing/widget/finders"><div><span>Find widgets</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/testing/widget/scrolling"><div><span>Simulate scrolling</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/testing/widget/tap-drag"><div><span>Simulate user interaction</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-24-5" role="button" aria-expanded="false" aria-controls="sidenav-24-5"><span>Integration testing</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-24-5"><li class="nav-item"><a class="nav-link" href="/cookbook/testing/integration/introduction"><div><span>Introduction</span></div></a></li><li class="nav-item"><a class="nav-link" href="/testing/integration-tests"><div><span>Write and run an integration test</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/testing/integration/profiling"><div><span>Profile an integration test</span></div></a></li></ul></li><li class="nav-item"><a class="nav-link" href="/testing/testing-plugins"><div><span>Test a plugin</span></div></a></li><li class="nav-item"><a class="nav-link" href="/testing/plugins-in-tests"><div><span>Handle plugin code in tests</span></div></a></li><li class="nav-header">Debugging</li><li class="nav-item"><a class="nav-link" href="/testing/debugging"><div><span>Debugging tools</span></div></a></li><li class="nav-item"><a class="nav-link active" href="/testing/code-debugging"><div><span>Debug your app programmatically</span></div></a></li><li class="nav-item"><a class="nav-link" href="/testing/native-debugging"><div><span>Use a native language debugger</span></div></a></li><li class="nav-item"><a class="nav-link" href="/testing/common-errors"><div><span>Common Flutter errors</span></div></a></li><li class="nav-item"><a class="nav-link" href="/testing/errors"><div><span>Handle errors</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/maintenance/error-reporting"><div><span>Report errors to a service</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-25" role="button" aria-expanded="false" aria-controls="sidenav-25"><span>Performance & optimization</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-25"><li class="nav-item"><a class="nav-link" href="/perf"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/perf/impeller"><div><span>Impeller</span></div></a></li><li class="nav-item"><a class="nav-link" href="/perf/best-practices"><div><span>Performance best practices</span></div></a></li><li class="nav-item"><a class="nav-link" href="/perf/app-size"><div><span>App size</span></div></a></li><li class="nav-item"><a class="nav-link" href="/perf/deferred-components"><div><span>Deferred components</span></div></a></li><li class="nav-item"><a class="nav-link" href="/perf/rendering-performance"><div><span>Rendering performance</span></div></a></li><li class="nav-item"><a class="nav-link" href="/perf/ui-performance"><div><span>Performance profiling</span></div></a></li><li class="nav-item"><a class="nav-link" href="/perf/web-performance"><div><span>Performance profiling for web</span></div></a></li><li class="nav-item"><a class="nav-link" href="/perf/metrics"><div><span>Performance metrics</span></div></a></li><li class="nav-item"><a class="nav-link" href="/perf/isolates"><div><span>Concurrency and isolates</span></div></a></li><li class="nav-item"><a class="nav-link" href="/perf/faq"><div><span>Performance FAQ</span></div></a></li><li class="nav-item"><a class="nav-link" href="/perf/appendix"><div><span>Appendix</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-26" role="button" aria-expanded="false" aria-controls="sidenav-26"><span>Deployment</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-26"><li class="nav-item"><a class="nav-link" href="/deployment/obfuscate"><div><span>Obfuscate Dart code</span></div></a></li><li class="nav-item"><a class="nav-link" href="/deployment/flavors"><div><span>Create app flavors for Android</span></div></a></li><li class="nav-item"><a class="nav-link" href="/deployment/flavors-ios"><div><span>Create app flavors for iOS and macOS</span></div></a></li><li class="nav-item"><a class="nav-link" href="/deployment/android"><div><span>Build and release an Android app</span></div></a></li><li class="nav-item"><a class="nav-link" href="/deployment/ios"><div><span>Build and release an iOS app</span></div></a></li><li class="nav-item"><a class="nav-link" href="/deployment/macos"><div><span>Build and release a macOS app</span></div></a></li><li class="nav-item"><a class="nav-link" href="/deployment/linux"><div><span>Build and release a Linux app</span></div></a></li><li class="nav-item"><a class="nav-link" href="/deployment/windows"><div><span>Build and release a Windows app</span></div></a></li><li class="nav-item"><a class="nav-link" href="/deployment/web"><div><span>Build and release a web app</span></div></a></li><li class="nav-item"><a class="nav-link" href="/deployment/cd"><div><span>Set up continuous deployment</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-27" role="button" aria-expanded="false" aria-controls="sidenav-27"><span>Add to an existing app</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-27"><li class="nav-item"><a class="nav-link" href="/add-to-app"><div><span>Introduction</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-27-2" role="button" aria-expanded="false" aria-controls="sidenav-27-2"><span>Add to an Android app</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-27-2"><li class="nav-item"><a class="nav-link" href="/add-to-app/android/project-setup"><div><span>Set up Android project</span></div></a></li><li class="nav-item"><a class="nav-link" href="/add-to-app/android/add-flutter-screen"><div><span>Add a single Flutter screen</span></div></a></li><li class="nav-item"><a class="nav-link" href="/add-to-app/android/add-flutter-fragment"><div><span>Add a Flutter Fragment</span></div></a></li><li class="nav-item"><a class="nav-link" href="/add-to-app/android/add-flutter-view"><div><span>Add a Flutter View</span></div></a></li><li class="nav-item"><a class="nav-link" href="/add-to-app/android/plugin-setup"><div><span>Use a Flutter plugin</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-27-3" role="button" aria-expanded="false" aria-controls="sidenav-27-3"><span>Add to an iOS app</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-27-3"><li class="nav-item"><a class="nav-link" href="/add-to-app/ios/project-setup"><div><span>Set up iOS project</span></div></a></li><li class="nav-item"><a class="nav-link" href="/add-to-app/ios/add-flutter-screen"><div><span>Add a single Flutter screen</span></div></a></li></ul></li><li class="nav-item"><a class="nav-link" href="/platform-integration/web/embedding-flutter-web"><div><span>Add to a web app</span></div></a></li><li class="nav-item"><a class="nav-link" href="/add-to-app/debugging"><div><span>Debug embedded Flutter module</span></div></a></li><li class="nav-item"><a class="nav-link" href="/add-to-app/multiple-flutters"><div><span>Add multiple Flutter instances</span></div></a></li><li class="nav-item"><a class="nav-link" href="/add-to-app/performance"><div><span>Loading sequence and performance</span></div></a></li></ul></li><li aria-hidden="true"><div class="sidenav-divider"></div></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-29" role="button" aria-expanded="false" aria-controls="sidenav-29"><span>Tools & editors</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-29"><li class="nav-item"><a class="nav-link" href="/tools/android-studio"><div><span>Android Studio & IntelliJ</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/vs-code"><div><span>Visual Studio Code</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-29-3" role="button" aria-expanded="false" aria-controls="sidenav-29-3"><span>DevTools</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-29-3"><li class="nav-item"><a class="nav-link" href="/tools/devtools"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/devtools/android-studio"><div><span>Run from Android Studio & IntelliJ</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/devtools/vscode"><div><span>Run from VS Code</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/devtools/cli"><div><span>Run from command line</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/devtools/inspector"><div><span>Flutter inspector</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/devtools/legacy-inspector"><div><span>Legacy Flutter inspector</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/devtools/performance"><div><span>Performance view</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/devtools/cpu-profiler"><div><span>CPU Profiler view</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/devtools/memory"><div><span>Memory view</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/devtools/console"><div><span>Debug console view</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/devtools/network"><div><span>Network view</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/devtools/debugger"><div><span>Debugger</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/devtools/logging"><div><span>Logging view</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/devtools/app-size"><div><span>App size tool</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/devtools/extensions"><div><span>DevTools extensions</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/devtools/deep-links"><div><span>Validate deep links</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/devtools/release-notes"><div><span>Release notes</span></div></a></li></ul></li><li class="nav-item"><a class="nav-link" href="/tools/sdk"><div><span>SDK overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pubspec"><div><span>Flutter's pubspec options</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/flutter-fix"><div><span>Automated fixes</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/formatting"><div><span>Code formatting</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-30" role="button" aria-expanded="false" aria-controls="sidenav-30"><span>Flutter concepts</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-30"><li class="nav-item"><a class="nav-link" href="/resources/architectural-overview"><div><span>Architectural overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/inside-flutter"><div><span>Inside Flutter</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/layout/constraints"><div><span>Understanding constraints</span></div></a></li><li class="nav-item"><a class="nav-link" href="/testing/build-modes"><div><span>Flutter's build modes</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/hot-reload"><div><span>Hot reload</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-31" role="button" aria-expanded="false" aria-controls="sidenav-31"><span>Resources</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-31"><li class="nav-item"><a class="nav-link" href="/resources/faq"><div><span>FAQ</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/books"><div><span>Books</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/videos"><div><span>Videos</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/courses"><div><span>Courses</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/bootstrap-into-dart"><div><span>Learn Dart</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/support"><div><span>Get support</span></div></a></li><div class="sidenav-divider"></div><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-31-8" role="button" aria-expanded="false" aria-controls="sidenav-31-8"><span>Contribute</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-31-8"><li class="nav-item"><a class="nav-link" href="/resources/bug-reports"><div><span>Create useful bug reports</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://github.com/flutter/flutter/blob/main/CONTRIBUTING.md" target="_blank" rel="noopener"><div><span>Contribute to Flutter</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/design-docs"><div><span>Discover proposed features</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-31-9" role="button" aria-expanded="false" aria-controls="sidenav-31-9"><span>Reference</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-31-9"><li class="nav-item"><a class="nav-link" href="/dash"><div><span>Who is Dash?</span></div></a></li><li class="nav-item"><a class="nav-link" href="/reference/widgets"><div><span>Widget index</span></div></a></li><li class="nav-item"><a class="nav-link" href="/reference/flutter-cli"><div><span>flutter CLI</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://api.flutter.dev" target="_blank" rel="noopener"><div><span>API docs</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li></ul></li></ul></li></ul></nav></div><main class="site-content"><div id="site-toc--side" class="site-toc"><header class="site-toc__title">Contents</header><ul class="section-nav"><li class="toc-entry nav-item"><a class="nav-link" href="#add-logging-to-your-application">Add logging to your application</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#set-breakpoints">Set breakpoints</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#debug-app-layers-using-flags">Debug app layers using flags</a><ul class="nav"><li class="toc-entry nav-item"><a class="nav-link" href="#print-the-widget-tree">Print the widget tree</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#print-the-render-tree">Print the render tree</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#print-the-layer-tree">Print the layer tree</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#print-the-focus-tree">Print the focus tree</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#print-the-semantics-tree">Print the semantics tree</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#print-event-timings">Print event timings</a></li></ul></li><li class="toc-entry nav-item"><a class="nav-link" href="#debug-layout-issues">Debug layout issues</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#debug-animation-issues">Debug animation issues</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#debug-performance-issues">Debug performance issues</a><ul class="nav"><li class="toc-entry nav-item"><a class="nav-link" href="#trace-dart-code-performance">Trace Dart code performance</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#add-performance-overlay">Add performance overlay</a></li></ul></li><li class="toc-entry nav-item"><a class="nav-link" href="#add-widget-alignment-grid">Add widget alignment grid</a></li></ul></div><article><header class="site-content__title"><h1 id="document-title">Debug Flutter apps from code</h1><nav class="breadcrumbs" aria-label="breadcrumb"><ol vocab="https://schema.org/" typeof="BreadcrumbList"><li class="breadcrumb-item" property="itemListElement" typeof="ListItem"><a href="/testing" property="item" typeof="WebPage"><span property="name">Testing & debugging</span></a><meta property="position" content="0"><span class="material-symbols child-icon" aria-hidden="true">chevron_right</span></li><li class="breadcrumb-item active" property="itemListElement" typeof="ListItem" aria-current="page"><a href="/testing/code-debugging" property="item" typeof="WebPage"><span property="name">Debug Flutter apps from code</span></a><meta property="position" content="1"></li></ol></nav></header><div id="site-toc--inline" class="site-toc toc-collapsible toc-collapsed"><header class="site-toc__title">Contents <span class="site-toc--inline__toggle toc-toggle-down" title="Expand table of contents"><i class="material-symbols" aria-hidden="true">keyboard_arrow_down</i></span> <span class="site-toc--inline__toggle toc-toggle-up" title="Collapse table of contents"><i class="material-symbols" aria-hidden="true">keyboard_arrow_up</i></span></header><ul class="section-nav"><li class="toc-entry"><a href="#add-logging-to-your-application">Add logging to your application</a></li><li class="toc-entry"><a href="#set-breakpoints">Set breakpoints</a></li><li class="toc-entry"><a href="#debug-app-layers-using-flags">Debug app layers using flags</a><ul><li class="toc-entry"><a href="#print-the-widget-tree">Print the widget tree</a></li><li class="toc-entry"><a href="#print-the-render-tree">Print the render tree</a></li><li class="toc-entry"><a href="#print-the-layer-tree">Print the layer tree</a></li><li class="toc-entry"><a href="#print-the-focus-tree">Print the focus tree</a></li><li class="toc-entry"><a href="#print-the-semantics-tree">Print the semantics tree</a></li><li class="toc-entry"><a href="#print-event-timings">Print event timings</a></li></ul></li><li class="toc-entry"><a href="#debug-layout-issues">Debug layout issues</a></li><li class="toc-entry"><a href="#debug-animation-issues">Debug animation issues</a></li><li class="toc-entry"><a href="#debug-performance-issues">Debug performance issues</a><ul><li class="toc-entry"><a href="#trace-dart-code-performance">Trace Dart code performance</a></li><li class="toc-entry"><a href="#add-performance-overlay">Add performance overlay</a></li></ul></li><li class="toc-entry"><a href="#add-widget-alignment-grid">Add widget alignment grid</a></li></ul><span class="site-toc--inline__toggle toc-toggle-more-items" title="Expand table of contents"><i class="material-symbols" aria-hidden="true">more_horiz</i></span></div> <?code-excerpt path-base="testing/code_debugging"?> <p>This guide describes which debugging features you can enable in your code. For a full list of debugging and profiling tools, check out the <a href="/testing/debugging">Debugging</a> page.</p><div class="header-wrapper"><h2 id="add-logging-to-your-application">Add logging to your application</h2><a class="heading-link" href="#add-logging-to-your-application" aria-label="Link to 'Add logging to your application' section">#</a></div><p>The following list contains a few statements that you can use to log the behavior of your application. You can view your logs in DevTools' <a href="/tools/devtools/logging">Logging view</a> or in your system console.</p><ul><li><p><a href="https://api.flutter.dev/flutter/dart-core/print.html"><code>print()</code></a>: Prints a <code>stdout</code> (standard output) message. Part of the <code>dart:io</code> library.</p></li><li><p><a href="https://api.flutter.dev/flutter/dart-io/stderr.html"><code>stderr.method_to_invoke()</code></a>: Prints a <code>stderr</code> (standard error) message. Replace <code>method_to_invoke()</code> with a method supported by the <code>stderr</code> property, such as <code>writeln()</code> or <code>write()</code>. Often used in a <code>try...catch</code> block. Part of the <code>dart:io</code> library.</p> <?code-excerpt "lib/main.dart (stderr)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#222222">stderr.</span><span style="color:#6200EE">writeln</span><span style="color:#222222">(</span><span style="color:#0C7064">'print me'</span><span style="color:#222222">);</span></span></code></pre></div></div></li><li><p><a href="https://api.flutter.dev/flutter/dart-developer/log.html"><code>log()</code></a>: Includes greater granularity and more information in the logging output. Part of the <code>dart:developer</code> library.</p></li><li><p><a href="https://api.flutter.dev/flutter/widgets/debugPrint.html"><code>debugPrint()</code></a>: If too much output results in discarded log lines, use this to keep those lines. Will print messages in release mode unless part of a debug mode check or an assert. Part of the <code>foundations</code> library.</p></li></ul><div class="header-wrapper"><h3 class="no_toc" id="example-1">Example 1</h3><a class="heading-link" href="#example-1" aria-label="Link to 'Example 1' section">#</a></div> <?code-excerpt "lib/main.dart (log)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#BD2314">import</span><span style="color:#0C7064"> 'dart:developer'</span><span style="color:#BD2314"> as</span><span style="color:#222222"> developer;</span></span> <span class="line"></span> <span class="line"><span style="color:#BD2314">void</span><span style="color:#6200EE"> main</span><span style="color:#222222">() {</span></span> <span class="line"><span style="color:#222222"> developer.</span><span style="color:#6200EE">log</span><span style="color:#222222">(</span><span style="color:#0C7064">'log me'</span><span style="color:#222222">, name: </span><span style="color:#0C7064">'my.app.category'</span><span style="color:#222222">);</span></span> <span class="line"></span> <span class="line"><span style="color:#222222"> developer.</span><span style="color:#6200EE">log</span><span style="color:#222222">(</span><span style="color:#0C7064">'log me 1'</span><span style="color:#222222">, name: </span><span style="color:#0C7064">'my.other.category'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222"> developer.</span><span style="color:#6200EE">log</span><span style="color:#222222">(</span><span style="color:#0C7064">'log me 2'</span><span style="color:#222222">, name: </span><span style="color:#0C7064">'my.other.category'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p>You can also pass app data to the log call. The convention for this is to use the <code>error:</code> named parameter on the <code>log()</code> call, JSON encode the object you want to send, and pass the encoded string to the error parameter.</p><div class="header-wrapper"><h3 class="no_toc" id="example-2">Example 2</h3><a class="heading-link" href="#example-2" aria-label="Link to 'Example 2' section">#</a></div> <?code-excerpt "lib/app_data.dart (pass-data)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#BD2314">import</span><span style="color:#0C7064"> 'dart:convert'</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#BD2314">import</span><span style="color:#0C7064"> 'dart:developer'</span><span style="color:#BD2314"> as</span><span style="color:#222222"> developer;</span></span> <span class="line"></span> <span class="line"><span style="color:#BD2314">void</span><span style="color:#6200EE"> main</span><span style="color:#222222">() {</span></span> <span class="line"><span style="color:#BD2314"> var</span><span style="color:#222222"> myCustomObject = </span><span style="color:#0468D7">MyCustomObject</span><span style="color:#222222">();</span></span> <span class="line"></span> <span class="line"><span style="color:#222222"> developer.</span><span style="color:#6200EE">log</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#0C7064"> 'log me'</span><span style="color:#222222">,</span></span> <span class="line"><span style="color:#222222"> name: </span><span style="color:#0C7064">'my.app.category'</span><span style="color:#222222">,</span></span> <span class="line"><span style="color:#222222"> error: </span><span style="color:#6200EE">jsonEncode</span><span style="color:#222222">(myCustomObject),</span></span> <span class="line"><span style="color:#222222"> );</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p>DevTool's logging view interprets the JSON encoded error parameter as a data object. DevTool renders in the details view for that log entry.</p><div class="header-wrapper"><h2 id="set-breakpoints">Set breakpoints</h2><a class="heading-link" href="#set-breakpoints" aria-label="Link to 'Set breakpoints' section">#</a></div><p>You can set breakpoints in DevTools' <a href="/tools/devtools/debugger">Debugger</a> or in the built-in debugger of your IDE.</p><p>To set programmatic breakpoints:</p><ol><li><p>Import the <code>dart:developer</code> package into the relevant file.</p></li><li><p>Insert programmatic breakpoints using the <code>debugger()</code> statement. This statement takes an optional <code>when</code> argument. This boolean argument sets a break when the given condition resolves to true.</p><p><strong>Example 3</strong> illustrates this.</p></li></ol><div class="header-wrapper"><h3 class="no_toc" id="example-3">Example 3</h3><a class="heading-link" href="#example-3" aria-label="Link to 'Example 3' section">#</a></div> <?code-excerpt "lib/debugger.dart"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#BD2314">import</span><span style="color:#0C7064"> 'dart:developer'</span><span style="color:#222222">;</span></span> <span class="line"></span> <span class="line"><span style="color:#BD2314">void</span><span style="color:#6200EE"> someFunction</span><span style="color:#222222">(</span><span style="color:#0468D7">double</span><span style="color:#222222"> offset) {</span></span> <span class="line"><span style="color:#6200EE"> debugger</span><span style="color:#222222">(</span><span style="color:#BD2314">when</span><span style="color:#222222">: offset > </span><span style="color:#0C7064">30</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#6E6E70"> // ...</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><div class="header-wrapper"><h2 id="debug-app-layers-using-flags">Debug app layers using flags</h2><a class="heading-link" href="#debug-app-layers-using-flags" aria-label="Link to 'Debug app layers using flags' section">#</a></div><p>Each layer of the Flutter framework provides a function to dump its current state or events to the console using the <code>debugPrint</code> property.</p><aside class="alert alert-info"><div class="alert-header"><i class="material-symbols" aria-hidden="true">info</i> <span>Note</span></div><div class="alert-content"><p>All of the following examples were run as macOS native apps on a MacBook Pro M1. These will differ from any dumps your development machine prints.</p></div></aside><aside class="alert alert-success"><div class="alert-header"><i class="material-symbols" aria-hidden="true">lightbulb</i> <span>Tip</span></div><div class="alert-content"><p>Each render object in any tree includes the first five hexadecimal digits of its <a href="https://api.flutter.dev/flutter/rendering/TextSelectionPoint/hashCode.html"><code>hashCode</code></a>. This hash serves as a unique identifier for that render object.</p></div></aside><div class="header-wrapper"><h3 id="print-the-widget-tree">Print the widget tree</h3><a class="heading-link" href="#print-the-widget-tree" aria-label="Link to 'Print the widget tree' section">#</a></div><p>To dump the state of the Widgets library, call the <a href="https://api.flutter.dev/flutter/widgets/debugDumpApp.html"><code>debugDumpApp()</code></a> function.</p><ol><li>Open your source file.</li><li>Import <code>package:flutter/rendering.dart</code>.</li><li>Call the <a href="https://api.flutter.dev/flutter/widgets/debugDumpApp.html"><code>debugDumpApp()</code></a> function from within the <code>runApp()</code> function. You need your app in debug mode. You cannot call this function inside a <code>build()</code> method when the app is building.</li><li>If you haven't started your app, debug it using your IDE.</li><li>If you have started your app, save your source file. Hot reload re-renders your app.</li></ol><div class="header-wrapper"><h4 id="example-4-call-debugdumpapp">Example 4: Call <code>debugDumpApp()</code></h4><a class="heading-link" href="#example-4-call-debugdumpapp" aria-label="Link to 'Example 4: Call debugDumpApp()' section">#</a></div> <?code-excerpt "lib/dump_app.dart"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#BD2314">import</span><span style="color:#0C7064"> 'package:flutter/material.dart'</span><span style="color:#222222">;</span></span> <span class="line"></span> <span class="line"><span style="color:#BD2314">void</span><span style="color:#6200EE"> main</span><span style="color:#222222">() {</span></span> <span class="line"><span style="color:#6200EE"> runApp</span><span style="color:#222222">(</span><span style="color:#BD2314">const</span><span style="color:#0468D7"> MaterialApp</span><span style="color:#222222">(home: </span><span style="color:#0468D7">AppHome</span><span style="color:#222222">()));</span></span> <span class="line"><span style="color:#222222">}</span></span> <span class="line"></span> <span class="line"><span style="color:#BD2314">class</span><span style="color:#0468D7"> AppHome</span><span style="color:#BD2314"> extends</span><span style="color:#0468D7"> StatelessWidget</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#BD2314"> const</span><span style="color:#0468D7"> AppHome</span><span style="color:#222222">({</span><span style="color:#BD2314">super</span><span style="color:#222222">.key});</span></span> <span class="line"></span> <span class="line"><span style="color:#BD2314"> @override</span></span> <span class="line"><span style="color:#0468D7"> Widget</span><span style="color:#6200EE"> build</span><span style="color:#222222">(</span><span style="color:#0468D7">BuildContext</span><span style="color:#222222"> context) {</span></span> <span class="line"><span style="color:#BD2314"> return</span><span style="color:#0468D7"> Material</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#222222"> child: </span><span style="color:#0468D7">Center</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#222222"> child: </span><span style="color:#0468D7">TextButton</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#222222"> onPressed: () {</span></span> <span class="line"><span style="color:#6200EE"> debugDumpApp</span><span style="color:#222222">();</span></span> <span class="line"><span style="color:#222222"> },</span></span> <span class="line"><span style="color:#222222"> child: </span><span style="color:#BD2314">const</span><span style="color:#0468D7"> Text</span><span style="color:#222222">(</span><span style="color:#0C7064">'Dump Widget Tree'</span><span style="color:#222222">),</span></span> <span class="line"><span style="color:#222222"> ),</span></span> <span class="line"><span style="color:#222222"> ),</span></span> <span class="line"><span style="color:#222222"> );</span></span> <span class="line"><span style="color:#222222"> }</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p>This function recursively calls the <code>toStringDeep()</code> method starting with the root of the widget tree. It returns a "flattened" tree.</p><p><strong>Example 4</strong> produces the following widget tree. It includes:</p><ul><li><p>All the widgets projected through their various build functions.</p></li><li><p>Many widgets that don't appear in your app's source. The framework's widgets' build functions insert them during the build.</p><p>The following tree, for example, shows <a href="https://api.flutter.dev/flutter/material/InkFeature-class.html"><code>_InkFeatures</code></a>. That class implements part of the <a href="https://api.flutter.dev/flutter/material/Material-class.html"><code>Material</code></a> widget. It doesn't appear anywhere in the code in <strong>Example 4</strong>.</p></li></ul><details><summary><strong>Expand to view the widget tree for Example 4</strong></summary><div class="code-block-wrapper language-plaintext"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span>flutter: WidgetsFlutterBinding - DEBUG MODE</span></span> <span class="line"><span>flutter: [root](renderObject: RenderView#06beb)</span></span> <span class="line"><span>flutter: └View-[GlobalObjectKey FlutterView#7971c]</span></span> <span class="line"><span>flutter: └_ViewScope</span></span> <span class="line"><span>flutter: └_MediaQueryFromView(state: _MediaQueryFromViewState#d790c)</span></span> <span class="line"><span>flutter: └MediaQuery(MediaQueryData(size: Size(800.0, 600.0), devicePixelRatio: 1.0, textScaleFactor: 1.0, platformBrightness: Brightness.dark, padding: EdgeInsets.zero, viewPadding: EdgeInsets.zero, viewInsets: EdgeInsets.zero, systemGestureInsets: EdgeInsets.zero, alwaysUse24HourFormat: false, accessibleNavigation: false, highContrast: false, disableAnimations: false, invertColors: false, boldText: false, navigationMode: traditional, gestureSettings: DeviceGestureSettings(touchSlop: null), displayFeatures: []))</span></span> <span class="line"><span>flutter: └MaterialApp(state: _MaterialAppState#27fa9)</span></span> <span class="line"><span>flutter: └ScrollConfiguration(behavior: MaterialScrollBehavior)</span></span> <span class="line"><span>flutter: └HeroControllerScope</span></span> <span class="line"><span>flutter: └Focus(state: _FocusState#d7f97)</span></span> <span class="line"><span>flutter: └_FocusInheritedScope</span></span> <span class="line"><span>flutter: └Semantics(container: false, properties: SemanticsProperties, tooltip: null, renderObject: RenderSemanticsAnnotations#a6464)</span></span> <span class="line"><span>flutter: └WidgetsApp-[GlobalObjectKey _MaterialAppState#27fa9](state: _WidgetsAppState#b5b17)</span></span> <span class="line"><span>flutter: └RootRestorationScope(state: _RootRestorationScopeState#6b028)</span></span> <span class="line"><span>flutter: └UnmanagedRestorationScope</span></span> <span class="line"><span>flutter: └RestorationScope(dependencies: [UnmanagedRestorationScope], state: _RestorationScopeState#d1369)</span></span> <span class="line"><span>flutter: └UnmanagedRestorationScope</span></span> <span class="line"><span>flutter: └SharedAppData(state: _SharedAppDataState#95e82)</span></span> <span class="line"><span>flutter: └_SharedAppModel</span></span> <span class="line"><span>flutter: └Shortcuts(shortcuts: <Default WidgetsApp Shortcuts>, state: _ShortcutsState#272dc)</span></span> <span class="line"><span>flutter: └Focus(debugLabel: "Shortcuts", dependencies: [_FocusInheritedScope], state: _FocusState#a3300)</span></span> <span class="line"><span>flutter: └_FocusInheritedScope</span></span> <span class="line"><span>flutter: └Semantics(container: false, properties: SemanticsProperties, tooltip: null, renderObject: RenderSemanticsAnnotations#db110)</span></span> <span class="line"><span>flutter: └DefaultTextEditingShortcuts</span></span> <span class="line"><span>flutter: └Shortcuts(shortcuts: <Default Text Editing Shortcuts>, state: _ShortcutsState#1d796)</span></span> <span class="line"><span>flutter: └Focus(debugLabel: "Shortcuts", dependencies: [_FocusInheritedScope], state: _FocusState#0081b)</span></span> <span class="line"><span>flutter: └_FocusInheritedScope</span></span> <span class="line"><span>flutter: └Semantics(container: false, properties: SemanticsProperties, tooltip: null, renderObject: RenderSemanticsAnnotations#0d70e)</span></span> <span class="line"><span>flutter: └Shortcuts(shortcuts: <Web Disabling Text Editing Shortcuts>, state: _ShortcutsState#56bac)</span></span> <span class="line"><span>flutter: └Focus(debugLabel: "Shortcuts", dependencies: [_FocusInheritedScope], state: _FocusState#3152e)</span></span> <span class="line"><span>flutter: └_FocusInheritedScope</span></span> <span class="line"><span>flutter: └Semantics(container: false, properties: SemanticsProperties, tooltip: null, renderObject: RenderSemanticsAnnotations#b7eaf)</span></span> <span class="line"><span>flutter: └Actions(dispatcher: null, actions: {DoNothingIntent: DoNothingAction#0fda1, DoNothingAndStopPropagationIntent: DoNothingAction#17f30, RequestFocusIntent: RequestFocusAction#10bd0, NextFocusIntent: NextFocusAction#60317, PreviousFocusIntent: PreviousFocusAction#2a933, DirectionalFocusIntent: DirectionalFocusAction#a6922, ScrollIntent: _OverridableContextAction<ScrollIntent>#964fe(defaultAction: ScrollAction#ffb50), PrioritizedIntents: PrioritizedAction#be0e2, VoidCallbackIntent: VoidCallbackAction#805fa}, state: _ActionsState#bbd25)</span></span> <span class="line"><span>flutter: └_ActionsScope</span></span> <span class="line"><span>flutter: └FocusTraversalGroup(policy: ReadingOrderTraversalPolicy#f1e76, state: _FocusTraversalGroupState#0c200)</span></span> <span class="line"><span>flutter: └Focus(debugLabel: "FocusTraversalGroup", focusNode: _FocusTraversalGroupNode#ffcad(FocusTraversalGroup [IN FOCUS PATH]), dependencies: [_FocusInheritedScope], state: _FocusState#c7dc2)</span></span> <span class="line"><span>flutter: └_FocusInheritedScope</span></span> <span class="line"><span>flutter: └TapRegionSurface(renderObject: RenderTapRegionSurface#17aba)</span></span> <span class="line"><span>flutter: └ShortcutRegistrar(state: _ShortcutRegistrarState#44954)</span></span> <span class="line"><span>flutter: └_ShortcutRegistrarScope</span></span> <span class="line"><span>flutter: └Shortcuts(manager: ShortcutManager#eb38c(shortcuts: {}), shortcuts: {}, state: _ShortcutsState#f85ac)</span></span> <span class="line"><span>flutter: └Focus(debugLabel: "Shortcuts", dependencies: [_FocusInheritedScope], state: _FocusState#8c1a7)</span></span> <span class="line"><span>flutter: └_FocusInheritedScope</span></span> <span class="line"><span>flutter: └Semantics(container: false, properties: SemanticsProperties, tooltip: null, renderObject: RenderSemanticsAnnotations#1fc98)</span></span> <span class="line"><span>flutter: └Localizations(locale: en_US, delegates: [DefaultMaterialLocalizations.delegate(en_US), DefaultCupertinoLocalizations.delegate(en_US), DefaultWidgetsLocalizations.delegate(en_US)], state: _LocalizationsState#ae3a0)</span></span> <span class="line"><span>flutter: └Semantics(container: false, properties: SemanticsProperties, tooltip: null, textDirection: ltr, renderObject: RenderSemanticsAnnotations#8776e)</span></span> <span class="line"><span>flutter: └_LocalizationsScope-[GlobalKey#61ca6]</span></span> <span class="line"><span>flutter: └Directionality(textDirection: ltr)</span></span> <span class="line"><span>flutter: └Title(color: Color(0xff2196f3))</span></span> <span class="line"><span>flutter: └CheckedModeBanner("DEBUG")</span></span> <span class="line"><span>flutter: └Banner("DEBUG", textDirection: ltr, location: topEnd, Color(0xa0b71c1c), text inherit: true, text color: Color(0xffffffff), text size: 10.2, text weight: 900, text height: 1.0x, dependencies: [Directionality])</span></span> <span class="line"><span>flutter: └CustomPaint(renderObject: RenderCustomPaint#c014d)</span></span> <span class="line"><span>flutter: └DefaultTextStyle(debugLabel: fallback style; consider putting your text in a Material, inherit: true, color: Color(0xd0ff0000), family: monospace, size: 48.0, weight: 900, decoration: double Color(0xffffff00) TextDecoration.underline, softWrap: wrapping at box width, overflow: clip)</span></span> <span class="line"><span>flutter: └Builder(dependencies: [MediaQuery])</span></span> <span class="line"><span>flutter: └ScaffoldMessenger(dependencies: [MediaQuery], state: ScaffoldMessengerState#5b36e)</span></span> <span class="line"><span>flutter: └_ScaffoldMessengerScope</span></span> <span class="line"><span>flutter: └DefaultSelectionStyle</span></span> <span class="line"><span>flutter: └AnimatedTheme(duration: 200ms, state: _AnimatedThemeState#cd149(ticker inactive, ThemeDataTween(ThemeData#ef3b2 → ThemeData#ef3b2)))</span></span> <span class="line"><span>flutter: └Theme(ThemeData#ef3b2, dependencies: [DefaultSelectionStyle])</span></span> <span class="line"><span>flutter: └_InheritedTheme</span></span> <span class="line"><span>flutter: └CupertinoTheme(brightness: light, primaryColor: MaterialColor(primary value: Color(0xff2196f3)), primaryContrastingColor: Color(0xffffffff), scaffoldBackgroundColor: Color(0xfffafafa), actionTextStyle: TextStyle(inherit: false, color: MaterialColor(primary value: Color(0xff2196f3)), family: .SF Pro Text, size: 17.0, letterSpacing: -0.4, decoration: TextDecoration.none), navActionTextStyle: TextStyle(inherit: false, color: MaterialColor(primary value: Color(0xff2196f3)), family: .SF Pro Text, size: 17.0, letterSpacing: -0.4, decoration: TextDecoration.none))</span></span> <span class="line"><span>flutter: └_InheritedCupertinoTheme</span></span> <span class="line"><span>flutter: └IconTheme(color: MaterialColor(primary value: Color(0xff2196f3)))</span></span> <span class="line"><span>flutter: └IconTheme(color: Color(0xdd000000))</span></span> <span class="line"><span>flutter: └DefaultSelectionStyle</span></span> <span class="line"><span>flutter: └FocusScope(debugLabel: "Navigator Scope", AUTOFOCUS, dependencies: [_FocusInheritedScope], state: _FocusScopeState#acbd8)</span></span> <span class="line"><span>flutter: └Semantics(container: false, properties: SemanticsProperties, tooltip: null, renderObject: RenderSemanticsAnnotations#ab3f0)</span></span> <span class="line"><span>flutter: └_FocusInheritedScope</span></span> <span class="line"><span>flutter: └Navigator-[GlobalObjectKey<NavigatorState> _WidgetsAppState#b5b17](dependencies: [HeroControllerScope, UnmanagedRestorationScope], state: NavigatorState#1395a(tickers: tracking 1 ticker))</span></span> <span class="line"><span>flutter: └HeroControllerScope</span></span> <span class="line"><span>flutter: └Listener(listeners: [down, up, cancel], behavior: deferToChild, renderObject: RenderPointerListener#34172)</span></span> <span class="line"><span>flutter: └AbsorbPointer(absorbing: false, renderObject: RenderAbsorbPointer#f8711)</span></span> <span class="line"><span>flutter: └FocusTraversalGroup(policy: ReadingOrderTraversalPolicy#f1e76, state: _FocusTraversalGroupState#8d61a)</span></span> <span class="line"><span>flutter: └Focus(debugLabel: "FocusTraversalGroup", focusNode: _FocusTraversalGroupNode#dd2b1(FocusTraversalGroup [IN FOCUS PATH]), dependencies: [_FocusInheritedScope], state: _FocusState#0bb03)</span></span> <span class="line"><span>flutter: └_FocusInheritedScope</span></span> <span class="line"><span>flutter: └Focus(debugLabel: "Navigator", AUTOFOCUS, focusNode: FocusNode#a3309(Navigator [IN FOCUS PATH]), dependencies: [_FocusInheritedScope], state: _FocusState#d3d07)</span></span> <span class="line"><span>flutter: └_FocusInheritedScope</span></span> <span class="line"><span>flutter: └UnmanagedRestorationScope</span></span> <span class="line"><span>flutter: └Overlay-[LabeledGlobalKey<OverlayState>#5485a](state: OverlayState#5bd52(entries: [OverlayEntry#fc947(opaque: true; maintainState: false), OverlayEntry#05a32(opaque: false; maintainState: true)]))</span></span> <span class="line"><span>flutter: └_Theater(skipCount: 0, dependencies: [Directionality], renderObject: _RenderTheater#e86c3)</span></span> <span class="line"><span>flutter: ├_OverlayEntryWidget-[LabeledGlobalKey<_OverlayEntryWidgetState>#1b37e](state: _OverlayEntryWidgetState#06ab0)</span></span> <span class="line"><span>flutter: │└TickerMode(state: _TickerModeState#0b4ac(requested mode: enabled))</span></span> <span class="line"><span>flutter: │ └_EffectiveTickerMode(effective mode: enabled)</span></span> <span class="line"><span>flutter: │ └_RenderTheaterMarker</span></span> <span class="line"><span>flutter: │ └IgnorePointer(ignoring: false, renderObject: RenderIgnorePointer#34c66)</span></span> <span class="line"><span>flutter: │ └ModalBarrier</span></span> <span class="line"><span>flutter: │ └BlockSemantics(blocking: true, renderObject: RenderBlockSemantics#97799)</span></span> <span class="line"><span>flutter: │ └ExcludeSemantics(excluding: true, renderObject: RenderExcludeSemantics#8c4ce)</span></span> <span class="line"><span>flutter: │ └_ModalBarrierGestureDetector</span></span> <span class="line"><span>flutter: │ └RawGestureDetector(state: RawGestureDetectorState#556f6(gestures: [any tap], behavior: opaque))</span></span> <span class="line"><span>flutter: │ └_GestureSemantics(renderObject: RenderSemanticsGestureHandler#616f1)</span></span> <span class="line"><span>flutter: │ └Listener(listeners: [down, panZoomStart], behavior: opaque, renderObject: RenderPointerListener#c2b89)</span></span> <span class="line"><span>flutter: │ └Semantics(container: false, properties: SemanticsProperties, tooltip: null, renderObject: RenderSemanticsAnnotations#c3b31)</span></span> <span class="line"><span>flutter: │ └MouseRegion(listeners: <none>, cursor: SystemMouseCursor(basic), renderObject: RenderMouseRegion#53cdb)</span></span> <span class="line"><span>flutter: │ └ConstrainedBox(BoxConstraints(biggest), renderObject: RenderConstrainedBox#faa51)</span></span> <span class="line"><span>flutter: └_OverlayEntryWidget-[LabeledGlobalKey<_OverlayEntryWidgetState>#bc0aa](state: _OverlayEntryWidgetState#cbf35)</span></span> <span class="line"><span>flutter: └TickerMode(state: _TickerModeState#23e73(requested mode: enabled))</span></span> <span class="line"><span>flutter: └_EffectiveTickerMode(effective mode: enabled)</span></span> <span class="line"><span>flutter: └_RenderTheaterMarker</span></span> <span class="line"><span>flutter: └Semantics(container: false, properties: SemanticsProperties, tooltip: null, sortKey: OrdinalSortKey#135f4(order: 0.0), renderObject: RenderSemanticsAnnotations#5565e)</span></span> <span class="line"><span>flutter: └_ModalScope<dynamic>-[LabeledGlobalKey<_ModalScopeState<dynamic>>#4fe82](state: _ModalScopeState<dynamic>#4da7d)</span></span> <span class="line"><span>flutter: └AnimatedBuilder(listenable: ValueNotifier<String?>#d87c6(null), state: _AnimatedState#dde81)</span></span> <span class="line"><span>flutter: └RestorationScope(dependencies: [UnmanagedRestorationScope], state: _RestorationScopeState#78c51)</span></span> <span class="line"><span>flutter: └UnmanagedRestorationScope</span></span> <span class="line"><span>flutter: └_ModalScopeStatus(active)</span></span> <span class="line"><span>flutter: └Offstage(offstage: false, renderObject: RenderOffstage#5e498)</span></span> <span class="line"><span>flutter: └PageStorage</span></span> <span class="line"><span>flutter: └Builder</span></span> <span class="line"><span>flutter: └Actions(dispatcher: null, actions: {DismissIntent: _DismissModalAction#6279e}, state: _ActionsState#48019)</span></span> <span class="line"><span>flutter: └_ActionsScope</span></span> <span class="line"><span>flutter: └PrimaryScrollController(ScrollController#6a546(no clients))</span></span> <span class="line"><span>flutter: └FocusScope(debugLabel: "_ModalScopeState<dynamic> Focus Scope", focusNode: FocusScopeNode#0e2af(_ModalScopeState<dynamic> Focus Scope [PRIMARY FOCUS]), dependencies: [_FocusInheritedScope], state: _FocusScopeState#0bac4)</span></span> <span class="line"><span>flutter: └Semantics(container: false, properties: SemanticsProperties, tooltip: null, renderObject: RenderSemanticsAnnotations#44b4e)</span></span> <span class="line"><span>flutter: └_FocusInheritedScope</span></span> <span class="line"><span>flutter: └RepaintBoundary(renderObject: RenderRepaintBoundary#38f41)</span></span> <span class="line"><span>flutter: └AnimatedBuilder(listenable: Listenable.merge([AnimationController#9d623(⏭ 1.000; paused; for MaterialPageRoute<dynamic>(/))➩ProxyAnimation, kAlwaysDismissedAnimation➩ProxyAnimation➩ProxyAnimation]), dependencies: [_InheritedTheme, _LocalizationsScope-[GlobalKey#61ca6]], state: _AnimatedState#47725)</span></span> <span class="line"><span>flutter: └CupertinoPageTransition(dependencies: [Directionality])</span></span> <span class="line"><span>flutter: └SlideTransition(listenable: kAlwaysDismissedAnimation➩ProxyAnimation➩ProxyAnimation➩Cubic(0.35, 0.91, 0.33, 0.97)ₒₙ/Cubic(0.67, 0.03, 0.65, 0.09)➩Tween<Offset>(Offset(0.0, 0.0) → Offset(-0.3, 0.0))➩Offset(0.0, 0.0), state: _AnimatedState#b6162)</span></span> <span class="line"><span>flutter: └FractionalTranslation(renderObject: RenderFractionalTranslation#fb461)</span></span> <span class="line"><span>flutter: └SlideTransition(listenable: AnimationController#9d623(⏭ 1.000; paused; for MaterialPageRoute<dynamic>(/))➩ProxyAnimation➩ThreePointCubic ₒₙ/FlippedCurve(ThreePointCubic )➩Tween<Offset>(Offset(1.0, 0.0) → Offset(0.0, 0.0))➩Offset(0.0, 0.0), state: _AnimatedState#834bf)</span></span> <span class="line"><span>flutter: └FractionalTranslation(renderObject: RenderFractionalTranslation#73ea4)</span></span> <span class="line"><span>flutter: └DecoratedBoxTransition(listenable: AnimationController#9d623(⏭ 1.000; paused; for MaterialPageRoute<dynamic>(/))➩ProxyAnimation➩Cubic(0.35, 0.91, 0.33, 0.97)➩DecorationTween(_CupertinoEdgeShadowDecoration(colors: null) → _CupertinoEdgeShadowDecoration(colors: [Color(0x04000000), Color(0x00000000)]))➩_CupertinoEdgeShadowDecoration(colors: [Color(0x04000000), Color(0x00000000)]), state: _AnimatedState#a7fca)</span></span> <span class="line"><span>flutter: └DecoratedBox(bg: _CupertinoEdgeShadowDecoration(colors: [Color(0x04000000), Color(0x00000000)]), dependencies: [Directionality, MediaQuery, _LocalizationsScope-[GlobalKey#61ca6]], renderObject: RenderDecoratedBox#9965c)</span></span> <span class="line"><span>flutter: └_CupertinoBackGestureDetector<dynamic>(dependencies: [Directionality, MediaQuery], state: _CupertinoBackGestureDetectorState<dynamic>#ab8cd)</span></span> <span class="line"><span>flutter: └Stack(alignment: AlignmentDirectional.topStart, fit: passthrough, dependencies: [Directionality], renderObject: RenderStack#b2b7c)</span></span> <span class="line"><span>flutter: ├AnimatedBuilder(listenable: ValueNotifier<bool>#1a88e(false), state: _AnimatedState#6e33c)</span></span> <span class="line"><span>flutter: │└IgnorePointer(ignoring: false, renderObject: RenderIgnorePointer#2b763)</span></span> <span class="line"><span>flutter: │ └RepaintBoundary-[GlobalKey#628f4](renderObject: RenderRepaintBoundary#5a53b)</span></span> <span class="line"><span>flutter: │ └Builder</span></span> <span class="line"><span>flutter: │ └Semantics(container: false, properties: SemanticsProperties, tooltip: null, renderObject: RenderSemanticsAnnotations#f8795)</span></span> <span class="line"><span>flutter: │ └AppHome</span></span> <span class="line"><span>flutter: │ └Material(type: canvas, dependencies: [_InheritedTheme, _LocalizationsScope-[GlobalKey#61ca6]], state: _MaterialState#7d183)</span></span> <span class="line"><span>flutter: │ └AnimatedPhysicalModel(duration: 200ms, shape: rectangle, borderRadius: BorderRadius.zero, elevation: 0.0, color: Color(0xfffafafa), animateColor: false, shadowColor: Color(0xff000000), animateShadowColor: true, state: _AnimatedPhysicalModelState#d479e(ticker inactive))</span></span> <span class="line"><span>flutter: │ └PhysicalModel(shape: rectangle, borderRadius: BorderRadius.zero, elevation: 0.0, color: Color(0xfffafafa), shadowColor: Color(0xff000000), renderObject: RenderPhysicalModel#c60b5)</span></span> <span class="line"><span>flutter: │ └NotificationListener<LayoutChangedNotification></span></span> <span class="line"><span>flutter: │ └_InkFeatures-[GlobalKey#e9da0 ink renderer](renderObject: _RenderInkFeatures#d8e6d)</span></span> <span class="line"><span>flutter: │ └AnimatedDefaultTextStyle(duration: 200ms, debugLabel: (englishLike bodyMedium 2014).merge(blackRedwoodCity bodyMedium), inherit: false, color: Color(0xdd000000), family: .AppleSystemUIFont, size: 14.0, weight: 400, baseline: alphabetic, decoration: TextDecoration.none, softWrap: wrapping at box width, overflow: clip, state: _AnimatedDefaultTextStyleState#12f43(ticker inactive))</span></span> <span class="line"><span>flutter: │ └DefaultTextStyle(debugLabel: (englishLike bodyMedium 2014).merge(blackRedwoodCity bodyMedium), inherit: false, color: Color(0xdd000000), family: .AppleSystemUIFont, size: 14.0, weight: 400, baseline: alphabetic, decoration: TextDecoration.none, softWrap: wrapping at box width, overflow: clip)</span></span> <span class="line"><span>flutter: │ └Center(alignment: Alignment.center, dependencies: [Directionality], renderObject: RenderPositionedBox#b088f)</span></span> <span class="line"><span>flutter: │ └TextButton(dirty, dependencies: [MediaQuery, _InheritedTheme, _LocalizationsScope-[GlobalKey#61ca6]], state: _ButtonStyleState#687c9)</span></span> <span class="line"><span>flutter: │ └Semantics(container: true, properties: SemanticsProperties, tooltip: null, renderObject: RenderSemanticsAnnotations#ca411 relayoutBoundary=up1)</span></span> <span class="line"><span>flutter: │ └_InputPadding(renderObject: _RenderInputPadding#60ede relayoutBoundary=up2)</span></span> <span class="line"><span>flutter: │ └ConstrainedBox(BoxConstraints(56.0<=w<=Infinity, 28.0<=h<=Infinity), renderObject: RenderConstrainedBox#34800 relayoutBoundary=up3)</span></span> <span class="line"><span>flutter: │ └Material(type: button, color: Color(0x00000000), shadowColor: Color(0xff000000), textStyle.debugLabel: ((englishLike labelLarge 2014).merge(blackRedwoodCity labelLarge)).copyWith, textStyle.inherit: false, textStyle.color: MaterialColor(primary value: Color(0xff2196f3)), textStyle.family: .AppleSystemUIFont, textStyle.size: 14.0, textStyle.weight: 500, textStyle.baseline: alphabetic, textStyle.decoration: TextDecoration.none, shape: RoundedRectangleBorder(BorderSide(width: 0.0, style: none), BorderRadius.circular(4.0)), dependencies: [_InheritedTheme, _LocalizationsScope-[GlobalKey#61ca6]], state: _MaterialState#50a4d(tickers: tracking 5 tickers))</span></span> <span class="line"><span>flutter: │ └_MaterialInterior(duration: 200ms, shape: RoundedRectangleBorder(BorderSide(width: 0.0, style: none), BorderRadius.circular(4.0)), elevation: 0.0, color: Color(0x00000000), shadowColor: Color(0xff000000), dependencies: [Directionality, _InheritedTheme, _LocalizationsScope-[GlobalKey#61ca6]], state: _MaterialInteriorState#d296d(ticker inactive))</span></span> <span class="line"><span>flutter: │ └PhysicalShape(clipper: ShapeBorderClipper, elevation: 0.0, color: Color(0x00000000), shadowColor: Color(0xff000000), renderObject: RenderPhysicalShape#43df6 relayoutBoundary=up4)</span></span> <span class="line"><span>flutter: │ └_ShapeBorderPaint(dependencies: [Directionality])</span></span> <span class="line"><span>flutter: │ └CustomPaint(renderObject: RenderCustomPaint#c1a3c relayoutBoundary=up5)</span></span> <span class="line"><span>flutter: │ └NotificationListener<LayoutChangedNotification></span></span> <span class="line"><span>flutter: │ └_InkFeatures-[GlobalKey#625bc ink renderer](renderObject: _RenderInkFeatures#54439 relayoutBoundary=up6)</span></span> <span class="line"><span>flutter: │ └AnimatedDefaultTextStyle(duration: 200ms, debugLabel: ((englishLike labelLarge 2014).merge(blackRedwoodCity labelLarge)).copyWith, inherit: false, color: MaterialColor(primary value: Color(0xff2196f3)), family: .AppleSystemUIFont, size: 14.0, weight: 500, baseline: alphabetic, decoration: TextDecoration.none, softWrap: wrapping at box width, overflow: clip, state: _AnimatedDefaultTextStyleState#2f29d(ticker inactive))</span></span> <span class="line"><span>flutter: │ └DefaultTextStyle(debugLabel: ((englishLike labelLarge 2014).merge(blackRedwoodCity labelLarge)).copyWith, inherit: false, color: MaterialColor(primary value: Color(0xff2196f3)), family: .AppleSystemUIFont, size: 14.0, weight: 500, baseline: alphabetic, decoration: TextDecoration.none, softWrap: wrapping at box width, overflow: clip)</span></span> <span class="line"><span>flutter: │ └InkWell</span></span> <span class="line"><span>flutter: │ └_InkResponseStateWidget(gestures: [tap], mouseCursor: ButtonStyleButton_MouseCursor, clipped to BoxShape.rectangle, dirty, dependencies: [Directionality, MediaQuery, _InheritedTheme, _LocalizationsScope-[GlobalKey#61ca6]], state: _InkResponseState#0b11d)</span></span> <span class="line"><span>flutter: │ └_ParentInkResponseProvider</span></span> <span class="line"><span>flutter: │ └Actions(dispatcher: null, actions: {ActivateIntent: CallbackAction<ActivateIntent>#018db, ButtonActivateIntent: CallbackAction<ButtonActivateIntent>#ef87a}, state: _ActionsState#a5eab)</span></span> <span class="line"><span>flutter: │ └_ActionsScope</span></span> <span class="line"><span>flutter: │ └Focus(dependencies: [_FocusInheritedScope], state: _FocusState#5a9de)</span></span> <span class="line"><span>flutter: │ └_FocusInheritedScope</span></span> <span class="line"><span>flutter: │ └Semantics(container: false, properties: SemanticsProperties, tooltip: null, renderObject: RenderSemanticsAnnotations#8ac3e relayoutBoundary=up7)</span></span> <span class="line"><span>flutter: │ └MouseRegion(listeners: [enter, exit], cursor: SystemMouseCursor(click), renderObject: RenderMouseRegion#13d4e relayoutBoundary=up8)</span></span> <span class="line"><span>flutter: │ └Builder(dependencies: [DefaultSelectionStyle])</span></span> <span class="line"><span>flutter: │ └DefaultSelectionStyle</span></span> <span class="line"><span>flutter: │ └Semantics(container: false, properties: SemanticsProperties, tooltip: null, renderObject: RenderSemanticsAnnotations#d99cc relayoutBoundary=up9)</span></span> <span class="line"><span>flutter: │ └GestureDetector(startBehavior: start, dependencies: [MediaQuery])</span></span> <span class="line"><span>flutter: │ └RawGestureDetector(state: RawGestureDetectorState#b8d93(gestures: [tap], excludeFromSemantics: true, behavior: opaque))</span></span> <span class="line"><span>flutter: │ └Listener(listeners: [down, panZoomStart], behavior: opaque, renderObject: RenderPointerListener#a4c3b relayoutBoundary=up10)</span></span> <span class="line"><span>flutter: │ └Builder(dependencies: [IconTheme])</span></span> <span class="line"><span>flutter: │ └IconTheme(color: MaterialColor(primary value: Color(0xff2196f3)))</span></span> <span class="line"><span>flutter: │ └Padding(padding: EdgeInsets(8.0, 0.0, 8.0, 0.0), dependencies: [Directionality], renderObject: RenderPadding#18a87 relayoutBoundary=up11)</span></span> <span class="line"><span>flutter: │ └Align(alignment: Alignment.center, widthFactor: 1.0, heightFactor: 1.0, dependencies: [Directionality], renderObject: RenderPositionedBox#fb8a8 relayoutBoundary=up12)</span></span> <span class="line"><span>flutter: │ └Text("Dump Widget Tree", dependencies: [DefaultSelectionStyle, DefaultTextStyle, MediaQuery])</span></span> <span class="line"><span>flutter: │ └RichText(softWrap: wrapping at box width, maxLines: unlimited, text: "Dump Widget Tree", dependencies: [Directionality, _LocalizationsScope-[GlobalKey#61ca6]], renderObject: RenderParagraph#d15aa relayoutBoundary=up13)</span></span> <span class="line"><span>flutter: └PositionedDirectional(dependencies: [Directionality])</span></span> <span class="line"><span>flutter: └Positioned(left: 0.0, top: 0.0, bottom: 0.0, width: 20.0)</span></span> <span class="line"><span>flutter: └Listener(listeners: [down], behavior: translucent, renderObject: RenderPointerListener#d884c)</span></span> <span class="line"><span>flutter:</span></span> <span class="line"><span>flutter:</span></span></code></pre></div></div></details><p>When the button changes from being pressed to being released, this invokes the <code>debugDumpApp()</code> function. It also coincides with the <a href="https://api.flutter.dev/flutter/material/TextButton-class.html"><code>TextButton</code></a> object calling <a href="https://api.flutter.dev/flutter/widgets/State/setState.html"><code>setState()</code></a> and thus marking itself dirty. This explains why a Flutter marks a specific object as "dirty". When you review the widget tree, look for a line that resembles the following:</p><div class="code-block-wrapper language-plaintext"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span>└TextButton(dirty, dependencies: [MediaQuery, _InheritedTheme, _LocalizationsScope-[GlobalKey#5880d]], state: _ButtonStyleState#ab76e)</span></span></code></pre></div></div><p>If you write your own widgets, override the <a href="https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html"><code>debugFillProperties()</code></a> method to add information. Add <a href="https://api.flutter.dev/flutter/foundation/DiagnosticsProperty-class.html">DiagnosticsProperty</a> objects to the method's argument and call the superclass method. The <code>toString</code> method uses this function to fill in the widget's description.</p><div class="header-wrapper"><h3 id="print-the-render-tree">Print the render tree</h3><a class="heading-link" href="#print-the-render-tree" aria-label="Link to 'Print the render tree' section">#</a></div><p>When debugging a layout issue, the Widgets layer's tree might lack detail. The next level of debugging might require a render tree. To dump the render tree:</p><ol><li>Open your source file.</li><li>Call the <a href="https://api.flutter.dev/flutter/rendering/debugDumpRenderTree.html"><code>debugDumpRenderTree()</code></a> function. You can call this any time except during a layout or paint phase. Consider calling it from a <a href="https://api.flutter.dev/flutter/scheduler/SchedulerBinding/addPersistentFrameCallback.html">frame callback</a> or an event handler.</li><li>If you haven't started your app, debug it using your IDE.</li><li>If you have started your app, save your source file. Hot reload re-renders your app.</li></ol><div class="header-wrapper"><h4 id="example-5-call-debugdumprendertree">Example 5: Call <code>debugDumpRenderTree()</code></h4><a class="heading-link" href="#example-5-call-debugdumprendertree" aria-label="Link to 'Example 5: Call debugDumpRenderTree()' section">#</a></div> <?code-excerpt "lib/dump_render_tree.dart"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#BD2314">import</span><span style="color:#0C7064"> 'package:flutter/material.dart'</span><span style="color:#222222">;</span></span> <span class="line"></span> <span class="line"><span style="color:#BD2314">void</span><span style="color:#6200EE"> main</span><span style="color:#222222">() {</span></span> <span class="line"><span style="color:#6200EE"> runApp</span><span style="color:#222222">(</span><span style="color:#BD2314">const</span><span style="color:#0468D7"> MaterialApp</span><span style="color:#222222">(home: </span><span style="color:#0468D7">AppHome</span><span style="color:#222222">()));</span></span> <span class="line"><span style="color:#222222">}</span></span> <span class="line"></span> <span class="line"><span style="color:#BD2314">class</span><span style="color:#0468D7"> AppHome</span><span style="color:#BD2314"> extends</span><span style="color:#0468D7"> StatelessWidget</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#BD2314"> const</span><span style="color:#0468D7"> AppHome</span><span style="color:#222222">({</span><span style="color:#BD2314">super</span><span style="color:#222222">.key});</span></span> <span class="line"></span> <span class="line"><span style="color:#BD2314"> @override</span></span> <span class="line"><span style="color:#0468D7"> Widget</span><span style="color:#6200EE"> build</span><span style="color:#222222">(</span><span style="color:#0468D7">BuildContext</span><span style="color:#222222"> context) {</span></span> <span class="line"><span style="color:#BD2314"> return</span><span style="color:#0468D7"> Material</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#222222"> child: </span><span style="color:#0468D7">Center</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#222222"> child: </span><span style="color:#0468D7">TextButton</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#222222"> onPressed: () {</span></span> <span class="line"><span style="color:#6200EE"> debugDumpRenderTree</span><span style="color:#222222">();</span></span> <span class="line"><span style="color:#222222"> },</span></span> <span class="line"><span style="color:#222222"> child: </span><span style="color:#BD2314">const</span><span style="color:#0468D7"> Text</span><span style="color:#222222">(</span><span style="color:#0C7064">'Dump Render Tree'</span><span style="color:#222222">),</span></span> <span class="line"><span style="color:#222222"> ),</span></span> <span class="line"><span style="color:#222222"> ),</span></span> <span class="line"><span style="color:#222222"> );</span></span> <span class="line"><span style="color:#222222"> }</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p>When debugging layout issues, look at the <code>size</code> and <code>constraints</code> fields. The constraints flow down the tree and the sizes flow back up.</p><details><summary><strong>Expand to view the render tree for Example 5</strong></summary><div class="code-block-wrapper language-plaintext"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span>flutter: RenderView#02c80</span></span> <span class="line"><span>flutter: │ debug mode enabled - macos</span></span> <span class="line"><span>flutter: │ view size: Size(800.0, 600.0) (in physical pixels)</span></span> <span class="line"><span>flutter: │ device pixel ratio: 1.0 (physical pixels per logical pixel)</span></span> <span class="line"><span>flutter: │ configuration: Size(800.0, 600.0) at 1.0x (in logical pixels)</span></span> <span class="line"><span>flutter: │</span></span> <span class="line"><span>flutter: └─child: RenderSemanticsAnnotations#fe6b5</span></span> <span class="line"><span>flutter: │ needs compositing</span></span> <span class="line"><span>flutter: │ creator: Semantics ← _FocusInheritedScope ← Focus ←</span></span> <span class="line"><span>flutter: │ HeroControllerScope ← ScrollConfiguration ← MaterialApp ←</span></span> <span class="line"><span>flutter: │ MediaQuery ← _MediaQueryFromView ← _ViewScope ←</span></span> <span class="line"><span>flutter: │ View-[GlobalObjectKey FlutterView#6cffa] ← [root]</span></span> <span class="line"><span>flutter: │ parentData: <none></span></span> <span class="line"><span>flutter: │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: │</span></span> <span class="line"><span>flutter: └─child: RenderSemanticsAnnotations#6edef</span></span> <span class="line"><span>flutter: │ needs compositing</span></span> <span class="line"><span>flutter: │ creator: Semantics ← _FocusInheritedScope ← Focus ← Shortcuts ←</span></span> <span class="line"><span>flutter: │ _SharedAppModel ← SharedAppData ← UnmanagedRestorationScope ←</span></span> <span class="line"><span>flutter: │ RestorationScope ← UnmanagedRestorationScope ←</span></span> <span class="line"><span>flutter: │ RootRestorationScope ← WidgetsApp-[GlobalObjectKey</span></span> <span class="line"><span>flutter: │ _MaterialAppState#5c303] ← Semantics ← ⋯</span></span> <span class="line"><span>flutter: │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: │</span></span> <span class="line"><span>flutter: └─child: RenderSemanticsAnnotations#e8ce8</span></span> <span class="line"><span>flutter: │ needs compositing</span></span> <span class="line"><span>flutter: │ creator: Semantics ← _FocusInheritedScope ← Focus ← Shortcuts ←</span></span> <span class="line"><span>flutter: │ DefaultTextEditingShortcuts ← Semantics ← _FocusInheritedScope</span></span> <span class="line"><span>flutter: │ ← Focus ← Shortcuts ← _SharedAppModel ← SharedAppData ←</span></span> <span class="line"><span>flutter: │ UnmanagedRestorationScope ← ⋯</span></span> <span class="line"><span>flutter: │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: │</span></span> <span class="line"><span>flutter: └─child: RenderSemanticsAnnotations#fc545</span></span> <span class="line"><span>flutter: │ needs compositing</span></span> <span class="line"><span>flutter: │ creator: Semantics ← _FocusInheritedScope ← Focus ← Shortcuts ←</span></span> <span class="line"><span>flutter: │ Semantics ← _FocusInheritedScope ← Focus ← Shortcuts ←</span></span> <span class="line"><span>flutter: │ DefaultTextEditingShortcuts ← Semantics ← _FocusInheritedScope</span></span> <span class="line"><span>flutter: │ ← Focus ← ⋯</span></span> <span class="line"><span>flutter: │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: │</span></span> <span class="line"><span>flutter: └─child: RenderTapRegionSurface#ff857</span></span> <span class="line"><span>flutter: │ needs compositing</span></span> <span class="line"><span>flutter: │ creator: TapRegionSurface ← _FocusInheritedScope ← Focus ←</span></span> <span class="line"><span>flutter: │ FocusTraversalGroup ← _ActionsScope ← Actions ← Semantics ←</span></span> <span class="line"><span>flutter: │ _FocusInheritedScope ← Focus ← Shortcuts ← Semantics ←</span></span> <span class="line"><span>flutter: │ _FocusInheritedScope ← ⋯</span></span> <span class="line"><span>flutter: │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: │ behavior: deferToChild</span></span> <span class="line"><span>flutter: │</span></span> <span class="line"><span>flutter: └─child: RenderSemanticsAnnotations#fe316</span></span> <span class="line"><span>flutter: │ needs compositing</span></span> <span class="line"><span>flutter: │ creator: Semantics ← _FocusInheritedScope ← Focus ← Shortcuts ←</span></span> <span class="line"><span>flutter: │ _ShortcutRegistrarScope ← ShortcutRegistrar ← TapRegionSurface</span></span> <span class="line"><span>flutter: │ ← _FocusInheritedScope ← Focus ← FocusTraversalGroup ←</span></span> <span class="line"><span>flutter: │ _ActionsScope ← Actions ← ⋯</span></span> <span class="line"><span>flutter: │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: │</span></span> <span class="line"><span>flutter: └─child: RenderSemanticsAnnotations#fa55c</span></span> <span class="line"><span>flutter: │ needs compositing</span></span> <span class="line"><span>flutter: │ creator: Semantics ← Localizations ← Semantics ←</span></span> <span class="line"><span>flutter: │ _FocusInheritedScope ← Focus ← Shortcuts ←</span></span> <span class="line"><span>flutter: │ _ShortcutRegistrarScope ← ShortcutRegistrar ← TapRegionSurface</span></span> <span class="line"><span>flutter: │ ← _FocusInheritedScope ← Focus ← FocusTraversalGroup ← ⋯</span></span> <span class="line"><span>flutter: │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: │</span></span> <span class="line"><span>flutter: └─child: RenderCustomPaint#4b256</span></span> <span class="line"><span>flutter: │ needs compositing</span></span> <span class="line"><span>flutter: │ creator: CustomPaint ← Banner ← CheckedModeBanner ← Title ←</span></span> <span class="line"><span>flutter: │ Directionality ← _LocalizationsScope-[GlobalKey#4a3aa] ←</span></span> <span class="line"><span>flutter: │ Semantics ← Localizations ← Semantics ← _FocusInheritedScope ←</span></span> <span class="line"><span>flutter: │ Focus ← Shortcuts ← ⋯</span></span> <span class="line"><span>flutter: │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: │ painter: null</span></span> <span class="line"><span>flutter: │ foregroundPainter: BannerPainter#1bfd7(Instance of</span></span> <span class="line"><span>flutter: │ '_SystemFontsNotifier')</span></span> <span class="line"><span>flutter: │</span></span> <span class="line"><span>flutter: └─child: RenderSemanticsAnnotations#f470f</span></span> <span class="line"><span>flutter: │ needs compositing</span></span> <span class="line"><span>flutter: │ creator: Semantics ← FocusScope ← DefaultSelectionStyle ←</span></span> <span class="line"><span>flutter: │ IconTheme ← IconTheme ← _InheritedCupertinoTheme ←</span></span> <span class="line"><span>flutter: │ CupertinoTheme ← _InheritedTheme ← Theme ← AnimatedTheme ←</span></span> <span class="line"><span>flutter: │ DefaultSelectionStyle ← _ScaffoldMessengerScope ← ⋯</span></span> <span class="line"><span>flutter: │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: │</span></span> <span class="line"><span>flutter: └─child: RenderPointerListener#f59c8</span></span> <span class="line"><span>flutter: │ needs compositing</span></span> <span class="line"><span>flutter: │ creator: Listener ← HeroControllerScope ←</span></span> <span class="line"><span>flutter: │ Navigator-[GlobalObjectKey<NavigatorState></span></span> <span class="line"><span>flutter: │ _WidgetsAppState#0d73a] ← _FocusInheritedScope ← Semantics ←</span></span> <span class="line"><span>flutter: │ FocusScope ← DefaultSelectionStyle ← IconTheme ← IconTheme ←</span></span> <span class="line"><span>flutter: │ _InheritedCupertinoTheme ← CupertinoTheme ← _InheritedTheme ← ⋯</span></span> <span class="line"><span>flutter: │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: │ behavior: deferToChild</span></span> <span class="line"><span>flutter: │ listeners: down, up, cancel</span></span> <span class="line"><span>flutter: │</span></span> <span class="line"><span>flutter: └─child: RenderAbsorbPointer#c91bd</span></span> <span class="line"><span>flutter: │ needs compositing</span></span> <span class="line"><span>flutter: │ creator: AbsorbPointer ← Listener ← HeroControllerScope ←</span></span> <span class="line"><span>flutter: │ Navigator-[GlobalObjectKey<NavigatorState></span></span> <span class="line"><span>flutter: │ _WidgetsAppState#0d73a] ← _FocusInheritedScope ← Semantics ←</span></span> <span class="line"><span>flutter: │ FocusScope ← DefaultSelectionStyle ← IconTheme ← IconTheme ←</span></span> <span class="line"><span>flutter: │ _InheritedCupertinoTheme ← CupertinoTheme ← ⋯</span></span> <span class="line"><span>flutter: │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: │ absorbing: false</span></span> <span class="line"><span>flutter: │ ignoringSemantics: null</span></span> <span class="line"><span>flutter: │</span></span> <span class="line"><span>flutter: └─child: _RenderTheater#07897</span></span> <span class="line"><span>flutter: │ needs compositing</span></span> <span class="line"><span>flutter: │ creator: _Theater ←</span></span> <span class="line"><span>flutter: │ Overlay-[LabeledGlobalKey<OverlayState>#49a93] ←</span></span> <span class="line"><span>flutter: │ UnmanagedRestorationScope ← _FocusInheritedScope ← Focus ←</span></span> <span class="line"><span>flutter: │ _FocusInheritedScope ← Focus ← FocusTraversalGroup ←</span></span> <span class="line"><span>flutter: │ AbsorbPointer ← Listener ← HeroControllerScope ←</span></span> <span class="line"><span>flutter: │ Navigator-[GlobalObjectKey<NavigatorState></span></span> <span class="line"><span>flutter: │ _WidgetsAppState#0d73a] ← ⋯</span></span> <span class="line"><span>flutter: │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: │ skipCount: 0</span></span> <span class="line"><span>flutter: │ textDirection: ltr</span></span> <span class="line"><span>flutter: │</span></span> <span class="line"><span>flutter: ├─onstage 1: RenderIgnorePointer#3b659</span></span> <span class="line"><span>flutter: │ │ creator: IgnorePointer ← _RenderTheaterMarker ←</span></span> <span class="line"><span>flutter: │ │ _EffectiveTickerMode ← TickerMode ←</span></span> <span class="line"><span>flutter: │ │ _OverlayEntryWidget-[LabeledGlobalKey<_OverlayEntryWidgetState>#a47f4]</span></span> <span class="line"><span>flutter: │ │ ← _Theater ← Overlay-[LabeledGlobalKey<OverlayState>#49a93] ←</span></span> <span class="line"><span>flutter: │ │ UnmanagedRestorationScope ← _FocusInheritedScope ← Focus ←</span></span> <span class="line"><span>flutter: │ │ _FocusInheritedScope ← Focus ← ⋯</span></span> <span class="line"><span>flutter: │ │ parentData: not positioned; offset=Offset(0.0, 0.0) (can use</span></span> <span class="line"><span>flutter: │ │ size)</span></span> <span class="line"><span>flutter: │ │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: │ │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: │ │ ignoring: false</span></span> <span class="line"><span>flutter: │ │ ignoringSemantics: null</span></span> <span class="line"><span>flutter: │ │</span></span> <span class="line"><span>flutter: │ └─child: RenderBlockSemantics#7586c</span></span> <span class="line"><span>flutter: │ │ creator: BlockSemantics ← ModalBarrier ← IgnorePointer ←</span></span> <span class="line"><span>flutter: │ │ _RenderTheaterMarker ← _EffectiveTickerMode ← TickerMode ←</span></span> <span class="line"><span>flutter: │ │ _OverlayEntryWidget-[LabeledGlobalKey<_OverlayEntryWidgetState>#a47f4]</span></span> <span class="line"><span>flutter: │ │ ← _Theater ← Overlay-[LabeledGlobalKey<OverlayState>#49a93] ←</span></span> <span class="line"><span>flutter: │ │ UnmanagedRestorationScope ← _FocusInheritedScope ← Focus ← ⋯</span></span> <span class="line"><span>flutter: │ │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: │ │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: │ │ blocks semantics of earlier render objects below the common</span></span> <span class="line"><span>flutter: │ │ boundary</span></span> <span class="line"><span>flutter: │ │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: │ │ blocking: true</span></span> <span class="line"><span>flutter: │ │</span></span> <span class="line"><span>flutter: │ └─child: RenderExcludeSemantics#c1d3f</span></span> <span class="line"><span>flutter: │ │ creator: ExcludeSemantics ← BlockSemantics ← ModalBarrier ←</span></span> <span class="line"><span>flutter: │ │ IgnorePointer ← _RenderTheaterMarker ← _EffectiveTickerMode ←</span></span> <span class="line"><span>flutter: │ │ TickerMode ←</span></span> <span class="line"><span>flutter: │ │ _OverlayEntryWidget-[LabeledGlobalKey<_OverlayEntryWidgetState>#a47f4]</span></span> <span class="line"><span>flutter: │ │ ← _Theater ← Overlay-[LabeledGlobalKey<OverlayState>#49a93] ←</span></span> <span class="line"><span>flutter: │ │ UnmanagedRestorationScope ← _FocusInheritedScope ← ⋯</span></span> <span class="line"><span>flutter: │ │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: │ │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: │ │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: │ │ excluding: true</span></span> <span class="line"><span>flutter: │ │</span></span> <span class="line"><span>flutter: │ └─child: RenderSemanticsGestureHandler#70b16</span></span> <span class="line"><span>flutter: │ │ creator: _GestureSemantics ← RawGestureDetector ←</span></span> <span class="line"><span>flutter: │ │ _ModalBarrierGestureDetector ← ExcludeSemantics ←</span></span> <span class="line"><span>flutter: │ │ BlockSemantics ← ModalBarrier ← IgnorePointer ←</span></span> <span class="line"><span>flutter: │ │ _RenderTheaterMarker ← _EffectiveTickerMode ← TickerMode ←</span></span> <span class="line"><span>flutter: │ │ _OverlayEntryWidget-[LabeledGlobalKey<_OverlayEntryWidgetState>#a47f4]</span></span> <span class="line"><span>flutter: │ │ ← _Theater ← ⋯</span></span> <span class="line"><span>flutter: │ │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: │ │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: │ │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: │ │ behavior: opaque</span></span> <span class="line"><span>flutter: │ │ gestures: <none></span></span> <span class="line"><span>flutter: │ │</span></span> <span class="line"><span>flutter: │ └─child: RenderPointerListener#1f34a</span></span> <span class="line"><span>flutter: │ │ creator: Listener ← _GestureSemantics ← RawGestureDetector ←</span></span> <span class="line"><span>flutter: │ │ _ModalBarrierGestureDetector ← ExcludeSemantics ←</span></span> <span class="line"><span>flutter: │ │ BlockSemantics ← ModalBarrier ← IgnorePointer ←</span></span> <span class="line"><span>flutter: │ │ _RenderTheaterMarker ← _EffectiveTickerMode ← TickerMode ←</span></span> <span class="line"><span>flutter: │ │ _OverlayEntryWidget-[LabeledGlobalKey<_OverlayEntryWidgetState>#a47f4]</span></span> <span class="line"><span>flutter: │ │ ← ⋯</span></span> <span class="line"><span>flutter: │ │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: │ │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: │ │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: │ │ behavior: opaque</span></span> <span class="line"><span>flutter: │ │ listeners: down, panZoomStart</span></span> <span class="line"><span>flutter: │ │</span></span> <span class="line"><span>flutter: │ └─child: RenderSemanticsAnnotations#73467</span></span> <span class="line"><span>flutter: │ │ creator: Semantics ← Listener ← _GestureSemantics ←</span></span> <span class="line"><span>flutter: │ │ RawGestureDetector ← _ModalBarrierGestureDetector ←</span></span> <span class="line"><span>flutter: │ │ ExcludeSemantics ← BlockSemantics ← ModalBarrier ←</span></span> <span class="line"><span>flutter: │ │ IgnorePointer ← _RenderTheaterMarker ← _EffectiveTickerMode ←</span></span> <span class="line"><span>flutter: │ │ TickerMode ← ⋯</span></span> <span class="line"><span>flutter: │ │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: │ │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: │ │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: │ │</span></span> <span class="line"><span>flutter: │ └─child: RenderMouseRegion#560dc</span></span> <span class="line"><span>flutter: │ │ creator: MouseRegion ← Semantics ← Listener ← _GestureSemantics ←</span></span> <span class="line"><span>flutter: │ │ RawGestureDetector ← _ModalBarrierGestureDetector ←</span></span> <span class="line"><span>flutter: │ │ ExcludeSemantics ← BlockSemantics ← ModalBarrier ←</span></span> <span class="line"><span>flutter: │ │ IgnorePointer ← _RenderTheaterMarker ← _EffectiveTickerMode ← ⋯</span></span> <span class="line"><span>flutter: │ │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: │ │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: │ │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: │ │ behavior: opaque</span></span> <span class="line"><span>flutter: │ │ listeners: <none></span></span> <span class="line"><span>flutter: │ │ cursor: SystemMouseCursor(basic)</span></span> <span class="line"><span>flutter: │ │</span></span> <span class="line"><span>flutter: │ └─child: RenderConstrainedBox#01e8c</span></span> <span class="line"><span>flutter: │ creator: ConstrainedBox ← MouseRegion ← Semantics ← Listener ←</span></span> <span class="line"><span>flutter: │ _GestureSemantics ← RawGestureDetector ←</span></span> <span class="line"><span>flutter: │ _ModalBarrierGestureDetector ← ExcludeSemantics ←</span></span> <span class="line"><span>flutter: │ BlockSemantics ← ModalBarrier ← IgnorePointer ←</span></span> <span class="line"><span>flutter: │ _RenderTheaterMarker ← ⋯</span></span> <span class="line"><span>flutter: │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: │ additionalConstraints: BoxConstraints(biggest)</span></span> <span class="line"><span>flutter: │</span></span> <span class="line"><span>flutter: ├─onstage 2: RenderSemanticsAnnotations#8187b</span></span> <span class="line"><span>flutter: ╎ │ needs compositing</span></span> <span class="line"><span>flutter: ╎ │ creator: Semantics ← _RenderTheaterMarker ← _EffectiveTickerMode</span></span> <span class="line"><span>flutter: ╎ │ ← TickerMode ←</span></span> <span class="line"><span>flutter: ╎ │ _OverlayEntryWidget-[LabeledGlobalKey<_OverlayEntryWidgetState>#8cd54]</span></span> <span class="line"><span>flutter: ╎ │ ← _Theater ← Overlay-[LabeledGlobalKey<OverlayState>#49a93] ←</span></span> <span class="line"><span>flutter: ╎ │ UnmanagedRestorationScope ← _FocusInheritedScope ← Focus ←</span></span> <span class="line"><span>flutter: ╎ │ _FocusInheritedScope ← Focus ← ⋯</span></span> <span class="line"><span>flutter: ╎ │ parentData: not positioned; offset=Offset(0.0, 0.0) (can use</span></span> <span class="line"><span>flutter: ╎ │ size)</span></span> <span class="line"><span>flutter: ╎ │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: ╎ │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: ╎ │</span></span> <span class="line"><span>flutter: ╎ └─child: RenderOffstage#f211d</span></span> <span class="line"><span>flutter: ╎ │ needs compositing</span></span> <span class="line"><span>flutter: ╎ │ creator: Offstage ← _ModalScopeStatus ← UnmanagedRestorationScope</span></span> <span class="line"><span>flutter: ╎ │ ← RestorationScope ← AnimatedBuilder ←</span></span> <span class="line"><span>flutter: ╎ │ _ModalScope<dynamic>-[LabeledGlobalKey<_ModalScopeState<dynamic>>#db401]</span></span> <span class="line"><span>flutter: ╎ │ ← Semantics ← _RenderTheaterMarker ← _EffectiveTickerMode ←</span></span> <span class="line"><span>flutter: ╎ │ TickerMode ←</span></span> <span class="line"><span>flutter: ╎ │ _OverlayEntryWidget-[LabeledGlobalKey<_OverlayEntryWidgetState>#8cd54]</span></span> <span class="line"><span>flutter: ╎ │ ← _Theater ← ⋯</span></span> <span class="line"><span>flutter: ╎ │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: ╎ │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: ╎ │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: ╎ │ offstage: false</span></span> <span class="line"><span>flutter: ╎ │</span></span> <span class="line"><span>flutter: ╎ └─child: RenderSemanticsAnnotations#9436c</span></span> <span class="line"><span>flutter: ╎ │ needs compositing</span></span> <span class="line"><span>flutter: ╎ │ creator: Semantics ← FocusScope ← PrimaryScrollController ←</span></span> <span class="line"><span>flutter: ╎ │ _ActionsScope ← Actions ← Builder ← PageStorage ← Offstage ←</span></span> <span class="line"><span>flutter: ╎ │ _ModalScopeStatus ← UnmanagedRestorationScope ←</span></span> <span class="line"><span>flutter: ╎ │ RestorationScope ← AnimatedBuilder ← ⋯</span></span> <span class="line"><span>flutter: ╎ │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: ╎ │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: ╎ │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: ╎ │</span></span> <span class="line"><span>flutter: ╎ └─child: RenderRepaintBoundary#f8f28</span></span> <span class="line"><span>flutter: ╎ │ needs compositing</span></span> <span class="line"><span>flutter: ╎ │ creator: RepaintBoundary ← _FocusInheritedScope ← Semantics ←</span></span> <span class="line"><span>flutter: ╎ │ FocusScope ← PrimaryScrollController ← _ActionsScope ← Actions</span></span> <span class="line"><span>flutter: ╎ │ ← Builder ← PageStorage ← Offstage ← _ModalScopeStatus ←</span></span> <span class="line"><span>flutter: ╎ │ UnmanagedRestorationScope ← ⋯</span></span> <span class="line"><span>flutter: ╎ │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: ╎ │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: ╎ │ layer: OffsetLayer#e73b7</span></span> <span class="line"><span>flutter: ╎ │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: ╎ │ metrics: 66.7% useful (1 bad vs 2 good)</span></span> <span class="line"><span>flutter: ╎ │ diagnosis: insufficient data to draw conclusion (less than five</span></span> <span class="line"><span>flutter: ╎ │ repaints)</span></span> <span class="line"><span>flutter: ╎ │</span></span> <span class="line"><span>flutter: ╎ └─child: RenderFractionalTranslation#c3a54</span></span> <span class="line"><span>flutter: ╎ │ needs compositing</span></span> <span class="line"><span>flutter: ╎ │ creator: FractionalTranslation ← SlideTransition ←</span></span> <span class="line"><span>flutter: ╎ │ CupertinoPageTransition ← AnimatedBuilder ← RepaintBoundary ←</span></span> <span class="line"><span>flutter: ╎ │ _FocusInheritedScope ← Semantics ← FocusScope ←</span></span> <span class="line"><span>flutter: ╎ │ PrimaryScrollController ← _ActionsScope ← Actions ← Builder ← ⋯</span></span> <span class="line"><span>flutter: ╎ │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: ╎ │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: ╎ │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: ╎ │ translation: Offset(0.0, 0.0)</span></span> <span class="line"><span>flutter: ╎ │ transformHitTests: false</span></span> <span class="line"><span>flutter: ╎ │</span></span> <span class="line"><span>flutter: ╎ └─child: RenderFractionalTranslation#7fcf2</span></span> <span class="line"><span>flutter: ╎ │ needs compositing</span></span> <span class="line"><span>flutter: ╎ │ creator: FractionalTranslation ← SlideTransition ←</span></span> <span class="line"><span>flutter: ╎ │ FractionalTranslation ← SlideTransition ←</span></span> <span class="line"><span>flutter: ╎ │ CupertinoPageTransition ← AnimatedBuilder ← RepaintBoundary ←</span></span> <span class="line"><span>flutter: ╎ │ _FocusInheritedScope ← Semantics ← FocusScope ←</span></span> <span class="line"><span>flutter: ╎ │ PrimaryScrollController ← _ActionsScope ← ⋯</span></span> <span class="line"><span>flutter: ╎ │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: ╎ │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: ╎ │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: ╎ │ translation: Offset(0.0, 0.0)</span></span> <span class="line"><span>flutter: ╎ │ transformHitTests: true</span></span> <span class="line"><span>flutter: ╎ │</span></span> <span class="line"><span>flutter: ╎ └─child: RenderDecoratedBox#713ec</span></span> <span class="line"><span>flutter: ╎ │ needs compositing</span></span> <span class="line"><span>flutter: ╎ │ creator: DecoratedBox ← DecoratedBoxTransition ←</span></span> <span class="line"><span>flutter: ╎ │ FractionalTranslation ← SlideTransition ← FractionalTranslation</span></span> <span class="line"><span>flutter: ╎ │ ← SlideTransition ← CupertinoPageTransition ← AnimatedBuilder ←</span></span> <span class="line"><span>flutter: ╎ │ RepaintBoundary ← _FocusInheritedScope ← Semantics ← FocusScope</span></span> <span class="line"><span>flutter: ╎ │ ← ⋯</span></span> <span class="line"><span>flutter: ╎ │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: ╎ │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: ╎ │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: ╎ │ ├─decoration: _CupertinoEdgeShadowDecoration</span></span> <span class="line"><span>flutter: ╎ │ colors: Color(0x04000000), Color(0x00000000)</span></span> <span class="line"><span>flutter: ╎ │</span></span> <span class="line"><span>flutter: ╎ │ configuration: ImageConfiguration(bundle:</span></span> <span class="line"><span>flutter: ╎ │ PlatformAssetBundle#164ca(), devicePixelRatio: 1.0, locale:</span></span> <span class="line"><span>flutter: ╎ │ en_US, textDirection: TextDirection.ltr, platform: macOS)</span></span> <span class="line"><span>flutter: ╎ │</span></span> <span class="line"><span>flutter: ╎ └─child: RenderStack#83b13</span></span> <span class="line"><span>flutter: ╎ │ needs compositing</span></span> <span class="line"><span>flutter: ╎ │ creator: Stack ← _CupertinoBackGestureDetector<dynamic> ←</span></span> <span class="line"><span>flutter: ╎ │ DecoratedBox ← DecoratedBoxTransition ← FractionalTranslation ←</span></span> <span class="line"><span>flutter: ╎ │ SlideTransition ← FractionalTranslation ← SlideTransition ←</span></span> <span class="line"><span>flutter: ╎ │ CupertinoPageTransition ← AnimatedBuilder ← RepaintBoundary ←</span></span> <span class="line"><span>flutter: ╎ │ _FocusInheritedScope ← ⋯</span></span> <span class="line"><span>flutter: ╎ │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: ╎ │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: ╎ │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: ╎ │ alignment: AlignmentDirectional.topStart</span></span> <span class="line"><span>flutter: ╎ │ textDirection: ltr</span></span> <span class="line"><span>flutter: ╎ │ fit: passthrough</span></span> <span class="line"><span>flutter: ╎ │</span></span> <span class="line"><span>flutter: ╎ ├─child 1: RenderIgnorePointer#ad50f</span></span> <span class="line"><span>flutter: ╎ │ │ needs compositing</span></span> <span class="line"><span>flutter: ╎ │ │ creator: IgnorePointer ← AnimatedBuilder ← Stack ←</span></span> <span class="line"><span>flutter: ╎ │ │ _CupertinoBackGestureDetector<dynamic> ← DecoratedBox ←</span></span> <span class="line"><span>flutter: ╎ │ │ DecoratedBoxTransition ← FractionalTranslation ←</span></span> <span class="line"><span>flutter: ╎ │ │ SlideTransition ← FractionalTranslation ← SlideTransition ←</span></span> <span class="line"><span>flutter: ╎ │ │ CupertinoPageTransition ← AnimatedBuilder ← ⋯</span></span> <span class="line"><span>flutter: ╎ │ │ parentData: not positioned; offset=Offset(0.0, 0.0) (can use</span></span> <span class="line"><span>flutter: ╎ │ │ size)</span></span> <span class="line"><span>flutter: ╎ │ │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: ╎ │ │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: ╎ │ │ ignoring: false</span></span> <span class="line"><span>flutter: ╎ │ │ ignoringSemantics: null</span></span> <span class="line"><span>flutter: ╎ │ │</span></span> <span class="line"><span>flutter: ╎ │ └─child: RenderRepaintBoundary#29754</span></span> <span class="line"><span>flutter: ╎ │ │ needs compositing</span></span> <span class="line"><span>flutter: ╎ │ │ creator: RepaintBoundary-[GlobalKey#75409] ← IgnorePointer ←</span></span> <span class="line"><span>flutter: ╎ │ │ AnimatedBuilder ← Stack ←</span></span> <span class="line"><span>flutter: ╎ │ │ _CupertinoBackGestureDetector<dynamic> ← DecoratedBox ←</span></span> <span class="line"><span>flutter: ╎ │ │ DecoratedBoxTransition ← FractionalTranslation ←</span></span> <span class="line"><span>flutter: ╎ │ │ SlideTransition ← FractionalTranslation ← SlideTransition ←</span></span> <span class="line"><span>flutter: ╎ │ │ CupertinoPageTransition ← ⋯</span></span> <span class="line"><span>flutter: ╎ │ │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: ╎ │ │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: ╎ │ │ layer: OffsetLayer#fa835</span></span> <span class="line"><span>flutter: ╎ │ │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: ╎ │ │ metrics: 90.9% useful (1 bad vs 10 good)</span></span> <span class="line"><span>flutter: ╎ │ │ diagnosis: this is an outstandingly useful repaint boundary and</span></span> <span class="line"><span>flutter: ╎ │ │ should definitely be kept</span></span> <span class="line"><span>flutter: ╎ │ │</span></span> <span class="line"><span>flutter: ╎ │ └─child: RenderSemanticsAnnotations#95566</span></span> <span class="line"><span>flutter: ╎ │ │ creator: Semantics ← Builder ← RepaintBoundary-[GlobalKey#75409]</span></span> <span class="line"><span>flutter: ╎ │ │ ← IgnorePointer ← AnimatedBuilder ← Stack ←</span></span> <span class="line"><span>flutter: ╎ │ │ _CupertinoBackGestureDetector<dynamic> ← DecoratedBox ←</span></span> <span class="line"><span>flutter: ╎ │ │ DecoratedBoxTransition ← FractionalTranslation ←</span></span> <span class="line"><span>flutter: ╎ │ │ SlideTransition ← FractionalTranslation ← ⋯</span></span> <span class="line"><span>flutter: ╎ │ │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: ╎ │ │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: ╎ │ │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: ╎ │ │</span></span> <span class="line"><span>flutter: ╎ │ └─child: RenderPhysicalModel#bc9d7</span></span> <span class="line"><span>flutter: ╎ │ │ creator: PhysicalModel ← AnimatedPhysicalModel ← Material ←</span></span> <span class="line"><span>flutter: ╎ │ │ AppHome ← Semantics ← Builder ←</span></span> <span class="line"><span>flutter: ╎ │ │ RepaintBoundary-[GlobalKey#75409] ← IgnorePointer ←</span></span> <span class="line"><span>flutter: ╎ │ │ AnimatedBuilder ← Stack ←</span></span> <span class="line"><span>flutter: ╎ │ │ _CupertinoBackGestureDetector<dynamic> ← DecoratedBox ← ⋯</span></span> <span class="line"><span>flutter: ╎ │ │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: ╎ │ │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: ╎ │ │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: ╎ │ │ elevation: 0.0</span></span> <span class="line"><span>flutter: ╎ │ │ color: Color(0xfffafafa)</span></span> <span class="line"><span>flutter: ╎ │ │ shadowColor: Color(0xfffafafa)</span></span> <span class="line"><span>flutter: ╎ │ │ shape: BoxShape.rectangle</span></span> <span class="line"><span>flutter: ╎ │ │ borderRadius: BorderRadius.zero</span></span> <span class="line"><span>flutter: ╎ │ │</span></span> <span class="line"><span>flutter: ╎ │ └─child: _RenderInkFeatures#ac819</span></span> <span class="line"><span>flutter: ╎ │ │ creator: _InkFeatures-[GlobalKey#d721e ink renderer] ←</span></span> <span class="line"><span>flutter: ╎ │ │ NotificationListener<LayoutChangedNotification> ← PhysicalModel</span></span> <span class="line"><span>flutter: ╎ │ │ ← AnimatedPhysicalModel ← Material ← AppHome ← Semantics ←</span></span> <span class="line"><span>flutter: ╎ │ │ Builder ← RepaintBoundary-[GlobalKey#75409] ← IgnorePointer ←</span></span> <span class="line"><span>flutter: ╎ │ │ AnimatedBuilder ← Stack ← ⋯</span></span> <span class="line"><span>flutter: ╎ │ │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: ╎ │ │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: ╎ │ │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: ╎ │ │</span></span> <span class="line"><span>flutter: ╎ │ └─child: RenderPositionedBox#dc1df</span></span> <span class="line"><span>flutter: ╎ │ │ creator: Center ← DefaultTextStyle ← AnimatedDefaultTextStyle ←</span></span> <span class="line"><span>flutter: ╎ │ │ _InkFeatures-[GlobalKey#d721e ink renderer] ←</span></span> <span class="line"><span>flutter: ╎ │ │ NotificationListener<LayoutChangedNotification> ← PhysicalModel</span></span> <span class="line"><span>flutter: ╎ │ │ ← AnimatedPhysicalModel ← Material ← AppHome ← Semantics ←</span></span> <span class="line"><span>flutter: ╎ │ │ Builder ← RepaintBoundary-[GlobalKey#75409] ← ⋯</span></span> <span class="line"><span>flutter: ╎ │ │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: ╎ │ │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>flutter: ╎ │ │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>flutter: ╎ │ │ alignment: Alignment.center</span></span> <span class="line"><span>flutter: ╎ │ │ textDirection: ltr</span></span> <span class="line"><span>flutter: ╎ │ │ widthFactor: expand</span></span> <span class="line"><span>flutter: ╎ │ │ heightFactor: expand</span></span> <span class="line"><span>flutter: ╎ │ │</span></span> <span class="line"><span>flutter: ╎ │ └─child: RenderSemanticsAnnotations#a0a4b relayoutBoundary=up1</span></span> <span class="line"><span>flutter: ╎ │ │ creator: Semantics ← TextButton ← Center ← DefaultTextStyle ←</span></span> <span class="line"><span>flutter: ╎ │ │ AnimatedDefaultTextStyle ← _InkFeatures-[GlobalKey#d721e ink</span></span> <span class="line"><span>flutter: ╎ │ │ renderer] ← NotificationListener<LayoutChangedNotification> ←</span></span> <span class="line"><span>flutter: ╎ │ │ PhysicalModel ← AnimatedPhysicalModel ← Material ← AppHome ←</span></span> <span class="line"><span>flutter: ╎ │ │ Semantics ← ⋯</span></span> <span class="line"><span>flutter: ╎ │ │ parentData: offset=Offset(329.0, 286.0) (can use size)</span></span> <span class="line"><span>flutter: ╎ │ │ constraints: BoxConstraints(0.0<=w<=800.0, 0.0<=h<=600.0)</span></span> <span class="line"><span>flutter: ╎ │ │ semantic boundary</span></span> <span class="line"><span>flutter: ╎ │ │ size: Size(142.0, 28.0)</span></span> <span class="line"><span>flutter: ╎ │ │</span></span> <span class="line"><span>flutter: ╎ │ └─child: _RenderInputPadding#4672f relayoutBoundary=up2</span></span> <span class="line"><span>flutter: ╎ │ │ creator: _InputPadding ← Semantics ← TextButton ← Center ←</span></span> <span class="line"><span>flutter: ╎ │ │ DefaultTextStyle ← AnimatedDefaultTextStyle ←</span></span> <span class="line"><span>flutter: ╎ │ │ _InkFeatures-[GlobalKey#d721e ink renderer] ←</span></span> <span class="line"><span>flutter: ╎ │ │ NotificationListener<LayoutChangedNotification> ← PhysicalModel</span></span> <span class="line"><span>flutter: ╎ │ │ ← AnimatedPhysicalModel ← Material ← AppHome ← ⋯</span></span> <span class="line"><span>flutter: ╎ │ │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: ╎ │ │ constraints: BoxConstraints(0.0<=w<=800.0, 0.0<=h<=600.0)</span></span> <span class="line"><span>flutter: ╎ │ │ size: Size(142.0, 28.0)</span></span> <span class="line"><span>flutter: ╎ │ │</span></span> <span class="line"><span>flutter: ╎ │ └─child: RenderConstrainedBox#425d6 relayoutBoundary=up3</span></span> <span class="line"><span>flutter: ╎ │ │ creator: ConstrainedBox ← _InputPadding ← Semantics ← TextButton</span></span> <span class="line"><span>flutter: ╎ │ │ ← Center ← DefaultTextStyle ← AnimatedDefaultTextStyle ←</span></span> <span class="line"><span>flutter: ╎ │ │ _InkFeatures-[GlobalKey#d721e ink renderer] ←</span></span> <span class="line"><span>flutter: ╎ │ │ NotificationListener<LayoutChangedNotification> ← PhysicalModel</span></span> <span class="line"><span>flutter: ╎ │ │ ← AnimatedPhysicalModel ← Material ← ⋯</span></span> <span class="line"><span>flutter: ╎ │ │ parentData: offset=Offset(0.0, 0.0) (can use size)</span></span> <span class="line"><span>flutter: ╎ │ │ constraints: BoxConstraints(0.0<=w<=800.0, 0.0<=h<=600.0)</span></span> <span class="line"><span>flutter: ╎ │ │ size: Size(142.0, 28.0)</span></span> <span class="line"><span>flutter: ╎ │ │ additionalConstraints: BoxConstraints(56.0<=w<=Infinity,</span></span> <span class="line"><span>flutter: ╎ │ │ 28.0<=h<=Infinity)</span></span> <span class="line"><span>flutter: ╎ │ │</span></span> <span class="line"><span>flutter: ╎ │ └─child: RenderPhysicalShape#8e171 relayoutBoundary=up4</span></span> <span class="line"><span>flutter: ╎ │ │ creator: PhysicalShape ← _MaterialInterior ← Material ←</span></span> <span class="line"><span>flutter: ╎ │ │ ConstrainedBox ← _InputPadding ← Semantics ← TextButton ←</span></span> <span class="line"><span>flutter: ╎ │ │ Center ← DefaultTextStyle ← AnimatedDefaultTextStyle ←</span></span> <span class="line"><span>flutter: ╎ │ │ _InkFeatures-[GlobalKey#d721e ink renderer] ←</span></span> <span class="line"><span>flutter: ╎ │ │ NotificationListener<LayoutChangedNotification> ← ⋯</span></span> <span class="line"><span>flutter: ╎ │ │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: ╎ │ │ constraints: BoxConstraints(56.0<=w<=800.0, 28.0<=h<=600.0)</span></span> <span class="line"><span>flutter: ╎ │ │ size: Size(142.0, 28.0)</span></span> <span class="line"><span>flutter: ╎ │ │ elevation: 0.0</span></span> <span class="line"><span>flutter: ╎ │ │ color: Color(0x00000000)</span></span> <span class="line"><span>flutter: ╎ │ │ shadowColor: Color(0x00000000)</span></span> <span class="line"><span>flutter: ╎ │ │ clipper: ShapeBorderClipper</span></span> <span class="line"><span>flutter: ╎ │ │</span></span> <span class="line"><span>flutter: ╎ │ └─child: RenderCustomPaint#eea46 relayoutBoundary=up5</span></span> <span class="line"><span>flutter: ╎ │ │ creator: CustomPaint ← _ShapeBorderPaint ← PhysicalShape ←</span></span> <span class="line"><span>flutter: ╎ │ │ _MaterialInterior ← Material ← ConstrainedBox ← _InputPadding ←</span></span> <span class="line"><span>flutter: ╎ │ │ Semantics ← TextButton ← Center ← DefaultTextStyle ←</span></span> <span class="line"><span>flutter: ╎ │ │ AnimatedDefaultTextStyle ← ⋯</span></span> <span class="line"><span>flutter: ╎ │ │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: ╎ │ │ constraints: BoxConstraints(56.0<=w<=800.0, 28.0<=h<=600.0)</span></span> <span class="line"><span>flutter: ╎ │ │ size: Size(142.0, 28.0)</span></span> <span class="line"><span>flutter: ╎ │ │ painter: null</span></span> <span class="line"><span>flutter: ╎ │ │ foregroundPainter: _ShapeBorderPainter#ac724()</span></span> <span class="line"><span>flutter: ╎ │ │</span></span> <span class="line"><span>flutter: ╎ │ └─child: _RenderInkFeatures#b19a7 relayoutBoundary=up6</span></span> <span class="line"><span>flutter: ╎ │ │ creator: _InkFeatures-[GlobalKey#87971 ink renderer] ←</span></span> <span class="line"><span>flutter: ╎ │ │ NotificationListener<LayoutChangedNotification> ← CustomPaint ←</span></span> <span class="line"><span>flutter: ╎ │ │ _ShapeBorderPaint ← PhysicalShape ← _MaterialInterior ←</span></span> <span class="line"><span>flutter: ╎ │ │ Material ← ConstrainedBox ← _InputPadding ← Semantics ←</span></span> <span class="line"><span>flutter: ╎ │ │ TextButton ← Center ← ⋯</span></span> <span class="line"><span>flutter: ╎ │ │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: ╎ │ │ constraints: BoxConstraints(56.0<=w<=800.0, 28.0<=h<=600.0)</span></span> <span class="line"><span>flutter: ╎ │ │ size: Size(142.0, 28.0)</span></span> <span class="line"><span>flutter: ╎ │ │</span></span> <span class="line"><span>flutter: ╎ │ └─child: RenderSemanticsAnnotations#4d1b3 relayoutBoundary=up7</span></span> <span class="line"><span>flutter: ╎ │ │ creator: Semantics ← _FocusInheritedScope ← Focus ← _ActionsScope</span></span> <span class="line"><span>flutter: ╎ │ │ ← Actions ← _ParentInkResponseProvider ←</span></span> <span class="line"><span>flutter: ╎ │ │ _InkResponseStateWidget ← InkWell ← DefaultTextStyle ←</span></span> <span class="line"><span>flutter: ╎ │ │ AnimatedDefaultTextStyle ← _InkFeatures-[GlobalKey#87971 ink</span></span> <span class="line"><span>flutter: ╎ │ │ renderer] ← NotificationListener<LayoutChangedNotification> ← ⋯</span></span> <span class="line"><span>flutter: ╎ │ │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: ╎ │ │ constraints: BoxConstraints(56.0<=w<=800.0, 28.0<=h<=600.0)</span></span> <span class="line"><span>flutter: ╎ │ │ size: Size(142.0, 28.0)</span></span> <span class="line"><span>flutter: ╎ │ │</span></span> <span class="line"><span>flutter: ╎ │ └─child: RenderMouseRegion#e5b3f relayoutBoundary=up8</span></span> <span class="line"><span>flutter: ╎ │ │ creator: MouseRegion ← Semantics ← _FocusInheritedScope ← Focus ←</span></span> <span class="line"><span>flutter: ╎ │ │ _ActionsScope ← Actions ← _ParentInkResponseProvider ←</span></span> <span class="line"><span>flutter: ╎ │ │ _InkResponseStateWidget ← InkWell ← DefaultTextStyle ←</span></span> <span class="line"><span>flutter: ╎ │ │ AnimatedDefaultTextStyle ← _InkFeatures-[GlobalKey#87971 ink</span></span> <span class="line"><span>flutter: ╎ │ │ renderer] ← ⋯</span></span> <span class="line"><span>flutter: ╎ │ │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: ╎ │ │ constraints: BoxConstraints(56.0<=w<=800.0, 28.0<=h<=600.0)</span></span> <span class="line"><span>flutter: ╎ │ │ size: Size(142.0, 28.0)</span></span> <span class="line"><span>flutter: ╎ │ │ behavior: opaque</span></span> <span class="line"><span>flutter: ╎ │ │ listeners: enter, exit</span></span> <span class="line"><span>flutter: ╎ │ │ cursor: SystemMouseCursor(click)</span></span> <span class="line"><span>flutter: ╎ │ │</span></span> <span class="line"><span>flutter: ╎ │ └─child: RenderSemanticsAnnotations#deb9b relayoutBoundary=up9</span></span> <span class="line"><span>flutter: ╎ │ │ creator: Semantics ← DefaultSelectionStyle ← Builder ←</span></span> <span class="line"><span>flutter: ╎ │ │ MouseRegion ← Semantics ← _FocusInheritedScope ← Focus ←</span></span> <span class="line"><span>flutter: ╎ │ │ _ActionsScope ← Actions ← _ParentInkResponseProvider ←</span></span> <span class="line"><span>flutter: ╎ │ │ _InkResponseStateWidget ← InkWell ← ⋯</span></span> <span class="line"><span>flutter: ╎ │ │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: ╎ │ │ constraints: BoxConstraints(56.0<=w<=800.0, 28.0<=h<=600.0)</span></span> <span class="line"><span>flutter: ╎ │ │ size: Size(142.0, 28.0)</span></span> <span class="line"><span>flutter: ╎ │ │</span></span> <span class="line"><span>flutter: ╎ │ └─child: RenderPointerListener#2017a relayoutBoundary=up10</span></span> <span class="line"><span>flutter: ╎ │ │ creator: Listener ← RawGestureDetector ← GestureDetector ←</span></span> <span class="line"><span>flutter: ╎ │ │ Semantics ← DefaultSelectionStyle ← Builder ← MouseRegion ←</span></span> <span class="line"><span>flutter: ╎ │ │ Semantics ← _FocusInheritedScope ← Focus ← _ActionsScope ←</span></span> <span class="line"><span>flutter: ╎ │ │ Actions ← ⋯</span></span> <span class="line"><span>flutter: ╎ │ │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: ╎ │ │ constraints: BoxConstraints(56.0<=w<=800.0, 28.0<=h<=600.0)</span></span> <span class="line"><span>flutter: ╎ │ │ size: Size(142.0, 28.0)</span></span> <span class="line"><span>flutter: ╎ │ │ behavior: opaque</span></span> <span class="line"><span>flutter: ╎ │ │ listeners: down, panZoomStart</span></span> <span class="line"><span>flutter: ╎ │ │</span></span> <span class="line"><span>flutter: ╎ │ └─child: RenderPadding#8455f relayoutBoundary=up11</span></span> <span class="line"><span>flutter: ╎ │ │ creator: Padding ← IconTheme ← Builder ← Listener ←</span></span> <span class="line"><span>flutter: ╎ │ │ RawGestureDetector ← GestureDetector ← Semantics ←</span></span> <span class="line"><span>flutter: ╎ │ │ DefaultSelectionStyle ← Builder ← MouseRegion ← Semantics ←</span></span> <span class="line"><span>flutter: ╎ │ │ _FocusInheritedScope ← ⋯</span></span> <span class="line"><span>flutter: ╎ │ │ parentData: <none> (can use size)</span></span> <span class="line"><span>flutter: ╎ │ │ constraints: BoxConstraints(56.0<=w<=800.0, 28.0<=h<=600.0)</span></span> <span class="line"><span>flutter: ╎ │ │ size: Size(142.0, 28.0)</span></span> <span class="line"><span>flutter: ╎ │ │ padding: EdgeInsets(8.0, 0.0, 8.0, 0.0)</span></span> <span class="line"><span>flutter: ╎ │ │ textDirection: ltr</span></span> <span class="line"><span>flutter: ╎ │ │</span></span> <span class="line"><span>flutter: ╎ │ └─child: RenderPositionedBox#80b8d relayoutBoundary=up12</span></span> <span class="line"><span>flutter: ╎ │ │ creator: Align ← Padding ← IconTheme ← Builder ← Listener ←</span></span> <span class="line"><span>flutter: ╎ │ │ RawGestureDetector ← GestureDetector ← Semantics ←</span></span> <span class="line"><span>flutter: ╎ │ │ DefaultSelectionStyle ← Builder ← MouseRegion ← Semantics ← ⋯</span></span> <span class="line"><span>flutter: ╎ │ │ parentData: offset=Offset(8.0, 0.0) (can use size)</span></span> <span class="line"><span>flutter: ╎ │ │ constraints: BoxConstraints(40.0<=w<=784.0, 28.0<=h<=600.0)</span></span> <span class="line"><span>flutter: ╎ │ │ size: Size(126.0, 28.0)</span></span> <span class="line"><span>flutter: ╎ │ │ alignment: Alignment.center</span></span> <span class="line"><span>flutter: ╎ │ │ textDirection: ltr</span></span> <span class="line"><span>flutter: ╎ │ │ widthFactor: 1.0</span></span> <span class="line"><span>flutter: ╎ │ │ heightFactor: 1.0</span></span> <span class="line"><span>flutter: ╎ │ │</span></span> <span class="line"><span>flutter: ╎ │ └─child: RenderParagraph#59bc2 relayoutBoundary=up13</span></span> <span class="line"><span>flutter: ╎ │ │ creator: RichText ← Text ← Align ← Padding ← IconTheme ← Builder</span></span> <span class="line"><span>flutter: ╎ │ │ ← Listener ← RawGestureDetector ← GestureDetector ← Semantics ←</span></span> <span class="line"><span>flutter: ╎ │ │ DefaultSelectionStyle ← Builder ← ⋯</span></span> <span class="line"><span>flutter: ╎ │ │ parentData: offset=Offset(0.0, 6.0) (can use size)</span></span> <span class="line"><span>flutter: ╎ │ │ constraints: BoxConstraints(0.0<=w<=784.0, 0.0<=h<=600.0)</span></span> <span class="line"><span>flutter: ╎ │ │ size: Size(126.0, 16.0)</span></span> <span class="line"><span>flutter: ╎ │ │ textAlign: start</span></span> <span class="line"><span>flutter: ╎ │ │ textDirection: ltr</span></span> <span class="line"><span>flutter: ╎ │ │ softWrap: wrapping at box width</span></span> <span class="line"><span>flutter: ╎ │ │ overflow: clip</span></span> <span class="line"><span>flutter: ╎ │ │ locale: en_US</span></span> <span class="line"><span>flutter: ╎ │ │ maxLines: unlimited</span></span> <span class="line"><span>flutter: ╎ │ ╘═╦══ text ═══</span></span> <span class="line"><span>flutter: ╎ │ ║ TextSpan:</span></span> <span class="line"><span>flutter: ╎ │ ║ debugLabel: ((englishLike labelLarge 2014).merge(blackRedwoodCity</span></span> <span class="line"><span>flutter: ╎ │ ║ labelLarge)).copyWith</span></span> <span class="line"><span>flutter: ╎ │ ║ inherit: false</span></span> <span class="line"><span>flutter: ╎ │ ║ color: MaterialColor(primary value: Color(0xff2196f3))</span></span> <span class="line"><span>flutter: ╎ │ ║ family: .AppleSystemUIFont</span></span> <span class="line"><span>flutter: ╎ │ ║ size: 14.0</span></span> <span class="line"><span>flutter: ╎ │ ║ weight: 500</span></span> <span class="line"><span>flutter: ╎ │ ║ baseline: alphabetic</span></span> <span class="line"><span>flutter: ╎ │ ║ decoration: TextDecoration.none</span></span> <span class="line"><span>flutter: ╎ │ ║ "Dump Render Tree"</span></span> <span class="line"><span>flutter: ╎ │ ╚═══════════</span></span> <span class="line"><span>flutter: ╎ └─child 2: RenderPointerListener#db4b5</span></span> <span class="line"><span>flutter: ╎ creator: Listener ← Positioned ← PositionedDirectional ← Stack ←</span></span> <span class="line"><span>flutter: ╎ _CupertinoBackGestureDetector<dynamic> ← DecoratedBox ←</span></span> <span class="line"><span>flutter: ╎ DecoratedBoxTransition ← FractionalTranslation ←</span></span> <span class="line"><span>flutter: ╎ SlideTransition ← FractionalTranslation ← SlideTransition ←</span></span> <span class="line"><span>flutter: ╎ CupertinoPageTransition ← ⋯</span></span> <span class="line"><span>flutter: ╎ parentData: top=0.0; bottom=0.0; left=0.0; width=20.0;</span></span> <span class="line"><span>flutter: ╎ offset=Offset(0.0, 0.0) (can use size)</span></span> <span class="line"><span>flutter: ╎ constraints: BoxConstraints(w=20.0, h=600.0)</span></span> <span class="line"><span>flutter: ╎ size: Size(20.0, 600.0)</span></span> <span class="line"><span>flutter: ╎ behavior: translucent</span></span> <span class="line"><span>flutter: ╎ listeners: down</span></span> <span class="line"><span>flutter: ╎</span></span> <span class="line"><span>flutter: └╌no offstage children</span></span> <span class="line"><span>flutter:</span></span></code></pre></div></div></details><p>In the render tree for <strong>Example 5</strong>:</p><ul><li><p>The <code>RenderView</code>, or window size, limits all render objects up to and including <a href="https://api.flutter.dev/flutter/rendering/RenderPositionedBox-class.html"><code>RenderPositionedBox</code></a><code>#dc1df</code> render object to the size of the screen. This example sets the size to <code>Size(800.0, 600.0)</code></p></li><li><p>The <code>constraints</code> property of each render object limits the size of each child. This property takes the <a href="https://api.flutter.dev/flutter/rendering/BoxConstraints-class.html"><code>BoxConstraints</code></a> render object as a value. Starting with the <code>RenderSemanticsAnnotations#fe6b5</code>, the constraint equals <code>BoxConstraints(w=800.0, h=600.0)</code>.</p></li><li><p>The <a href="https://api.flutter.dev/flutter/widgets/Center-class.html"><code>Center</code></a> widget created the <code>RenderPositionedBox#dc1df</code> render object under the <code>RenderSemanticsAnnotations#8187b</code> subtree.</p></li><li><p>Each child under this render object has <code>BoxConstraints</code> with both minimum and maximum values. For example, <code>RenderSemanticsAnnotations#a0a4b</code> uses <code>BoxConstraints(0.0<=w<=800.0, 0.0<=h<=600.0)</code>.</p></li><li><p>All children of the <code>RenderPhysicalShape#8e171</code> render object use <code>BoxConstraints(BoxConstraints(56.0<=w<=800.0, 28.0<=h<=600.0))</code>.</p></li><li><p>The child <code>RenderPadding#8455f</code> sets a <code>padding</code> value of <code>EdgeInsets(8.0, 0.0, 8.0, 0.0)</code>. This sets a left and right padding of 8 to all subsequent children of this render object. They now have new constraints: <code>BoxConstraints(40.0<=w<=784.0, 28.0<=h<=600.0)</code>.</p></li></ul><p>This object, which the <code>creator</code> field tells us is probably part of the <a href="https://api.flutter.dev/flutter/material/TextButton-class.html"><code>TextButton</code></a>'s definition, sets a minimum width of 88 pixels on its contents and a specific height of 36.0. This is the <code>TextButton</code> class implementing the Material Design guidelines regarding button dimensions.</p><p><code>RenderPositionedBox#80b8d</code> render object loosens the constraints again to center the text within the button. The <a href="https://api.flutter.dev/flutter/rendering/RenderParagraph-class.html"><code>RenderParagraph</code></a>#59bc2 render object picks its size based on its contents. If you follow the sizes back up the tree, you see how the size of the text influences the width of all the boxes that form the button. All parents take their child's dimensions to size themselves.</p><p>Another way to notice this is by looking at the <code>relayoutBoundary</code> attribute of in the descriptions of each box. This tells you how many ancestors depend on this element's size.</p><p>For example, the innermost <code>RenderPositionedBox</code> line has a <code>relayoutBoundary=up13</code>. This means that when Flutter marks the <code>RenderConstrainedBox</code> as dirty, it also marks box's 13 ancestors as dirty because the new dimensions might affect those ancestors.</p><p>To add information to the dump if you write your own render objects, override <a href="https://api.flutter.dev/flutter/rendering/Layer/debugFillProperties.html"><code>debugFillProperties()</code></a>. Add <a href="https://api.flutter.dev/flutter/foundation/DiagnosticsProperty-class.html">DiagnosticsProperty</a> objects to the method's argument then call the superclass method.</p><div class="header-wrapper"><h3 id="print-the-layer-tree">Print the layer tree</h3><a class="heading-link" href="#print-the-layer-tree" aria-label="Link to 'Print the layer tree' section">#</a></div><p>To debug a compositing issue, use <a href="https://api.flutter.dev/flutter/rendering/debugDumpLayerTree.html"><code>debugDumpLayerTree()</code></a>.</p><div class="header-wrapper"><h4 id="example-6-call-debugdumplayertree">Example 6: Call <code>debugDumpLayerTree()</code></h4><a class="heading-link" href="#example-6-call-debugdumplayertree" aria-label="Link to 'Example 6: Call debugDumpLayerTree()' section">#</a></div> <?code-excerpt "lib/dump_layer_tree.dart"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#BD2314">import</span><span style="color:#0C7064"> 'package:flutter/material.dart'</span><span style="color:#222222">;</span></span> <span class="line"></span> <span class="line"><span style="color:#BD2314">void</span><span style="color:#6200EE"> main</span><span style="color:#222222">() {</span></span> <span class="line"><span style="color:#6200EE"> runApp</span><span style="color:#222222">(</span><span style="color:#BD2314">const</span><span style="color:#0468D7"> MaterialApp</span><span style="color:#222222">(home: </span><span style="color:#0468D7">AppHome</span><span style="color:#222222">()));</span></span> <span class="line"><span style="color:#222222">}</span></span> <span class="line"></span> <span class="line"><span style="color:#BD2314">class</span><span style="color:#0468D7"> AppHome</span><span style="color:#BD2314"> extends</span><span style="color:#0468D7"> StatelessWidget</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#BD2314"> const</span><span style="color:#0468D7"> AppHome</span><span style="color:#222222">({</span><span style="color:#BD2314">super</span><span style="color:#222222">.key});</span></span> <span class="line"></span> <span class="line"><span style="color:#BD2314"> @override</span></span> <span class="line"><span style="color:#0468D7"> Widget</span><span style="color:#6200EE"> build</span><span style="color:#222222">(</span><span style="color:#0468D7">BuildContext</span><span style="color:#222222"> context) {</span></span> <span class="line"><span style="color:#BD2314"> return</span><span style="color:#0468D7"> Material</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#222222"> child: </span><span style="color:#0468D7">Center</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#222222"> child: </span><span style="color:#0468D7">TextButton</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#222222"> onPressed: () {</span></span> <span class="line"><span style="color:#6200EE"> debugDumpLayerTree</span><span style="color:#222222">();</span></span> <span class="line"><span style="color:#222222"> },</span></span> <span class="line"><span style="color:#222222"> child: </span><span style="color:#BD2314">const</span><span style="color:#0468D7"> Text</span><span style="color:#222222">(</span><span style="color:#0C7064">'Dump Layer Tree'</span><span style="color:#222222">),</span></span> <span class="line"><span style="color:#222222"> ),</span></span> <span class="line"><span style="color:#222222"> ),</span></span> <span class="line"><span style="color:#222222"> );</span></span> <span class="line"><span style="color:#222222"> }</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><details><summary><strong>Expand to view the output of layer tree for Example 6</strong></summary><div class="code-block-wrapper language-plaintext"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span>flutter: TransformLayer#214da</span></span> <span class="line"><span>flutter: │ owner: RenderView#ebaaf</span></span> <span class="line"><span>flutter: │ creator: [root]</span></span> <span class="line"><span>flutter: │ engine layer: TransformEngineLayer#535de</span></span> <span class="line"><span>flutter: │ handles: 1</span></span> <span class="line"><span>flutter: │ offset: Offset(0.0, 0.0)</span></span> <span class="line"><span>flutter: │ transform:</span></span> <span class="line"><span>flutter: │ [0] 1.0,0.0,0.0,0.0</span></span> <span class="line"><span>flutter: │ [1] 0.0,1.0,0.0,0.0</span></span> <span class="line"><span>flutter: │ [2] 0.0,0.0,1.0,0.0</span></span> <span class="line"><span>flutter: │ [3] 0.0,0.0,0.0,1.0</span></span> <span class="line"><span>flutter: │</span></span> <span class="line"><span>flutter: ├─child 1: OffsetLayer#0f766</span></span> <span class="line"><span>flutter: │ │ creator: RepaintBoundary ← _FocusInheritedScope ← Semantics ←</span></span> <span class="line"><span>flutter: │ │ FocusScope ← PrimaryScrollController ← _ActionsScope ← Actions</span></span> <span class="line"><span>flutter: │ │ ← Builder ← PageStorage ← Offstage ← _ModalScopeStatus ←</span></span> <span class="line"><span>flutter: │ │ UnmanagedRestorationScope ← ⋯</span></span> <span class="line"><span>flutter: │ │ engine layer: OffsetEngineLayer#1768d</span></span> <span class="line"><span>flutter: │ │ handles: 2</span></span> <span class="line"><span>flutter: │ │ offset: Offset(0.0, 0.0)</span></span> <span class="line"><span>flutter: │ │</span></span> <span class="line"><span>flutter: │ ├─child 1: PictureLayer#dd023</span></span> <span class="line"><span>flutter: │ │ handles: 1</span></span> <span class="line"><span>flutter: │ │ paint bounds: Rect.fromLTRB(0.0, 0.0, 800.0, 600.0)</span></span> <span class="line"><span>flutter: │ │ picture: _NativePicture#36f94</span></span> <span class="line"><span>flutter: │ │ raster cache hints: isComplex = false, willChange = false</span></span> <span class="line"><span>flutter: │ │</span></span> <span class="line"><span>flutter: │ └─child 2: OffsetLayer#4cfc8</span></span> <span class="line"><span>flutter: │ │ creator: RepaintBoundary-[GlobalKey#bd5d9] ← IgnorePointer ←</span></span> <span class="line"><span>flutter: │ │ AnimatedBuilder ← Stack ←</span></span> <span class="line"><span>flutter: │ │ _CupertinoBackGestureDetector<dynamic> ← DecoratedBox ←</span></span> <span class="line"><span>flutter: │ │ DecoratedBoxTransition ← FractionalTranslation ←</span></span> <span class="line"><span>flutter: │ │ SlideTransition ← FractionalTranslation ← SlideTransition ←</span></span> <span class="line"><span>flutter: │ │ CupertinoPageTransition ← ⋯</span></span> <span class="line"><span>flutter: │ │ engine layer: OffsetEngineLayer#a1676</span></span> <span class="line"><span>flutter: │ │ handles: 2</span></span> <span class="line"><span>flutter: │ │ offset: Offset(0.0, 0.0)</span></span> <span class="line"><span>flutter: │ │</span></span> <span class="line"><span>flutter: │ └─child 1: PictureLayer#aee55</span></span> <span class="line"><span>flutter: │ handles: 1</span></span> <span class="line"><span>flutter: │ paint bounds: Rect.fromLTRB(0.0, 0.0, 800.0, 600.0)</span></span> <span class="line"><span>flutter: │ picture: _NativePicture#e732d</span></span> <span class="line"><span>flutter: │ raster cache hints: isComplex = false, willChange = false</span></span> <span class="line"><span>flutter: │</span></span> <span class="line"><span>flutter: └─child 2: PictureLayer#b16e5</span></span> <span class="line"><span>flutter: handles: 1</span></span> <span class="line"><span>flutter: paint bounds: Rect.fromLTRB(0.0, 0.0, 800.0, 600.0)</span></span> <span class="line"><span>flutter: picture: _NativePicture#eef0a</span></span> <span class="line"><span>flutter: raster cache hints: isComplex = false, willChange = false</span></span> <span class="line"><span>flutter:</span></span></code></pre></div></div></details><p>The <code>RepaintBoundary</code> widget creates:</p><ol><li><p>A <code>RenderRepaintBoundary</code> RenderObject in the render tree as shown in the <strong>Example 5</strong> results.</p><div class="code-block-wrapper language-plaintext"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span>╎ └─child: RenderRepaintBoundary#f8f28</span></span> <span class="line"><span>╎ │ needs compositing</span></span> <span class="line"><span>╎ │ creator: RepaintBoundary ← _FocusInheritedScope ← Semantics ←</span></span> <span class="line"><span>╎ │ FocusScope ← PrimaryScrollController ← _ActionsScope ← Actions</span></span> <span class="line"><span>╎ │ ← Builder ← PageStorage ← Offstage ← _ModalScopeStatus ←</span></span> <span class="line"><span>╎ │ UnmanagedRestorationScope ← ⋯</span></span> <span class="line"><span>╎ │ parentData: <none> (can use size)</span></span> <span class="line"><span>╎ │ constraints: BoxConstraints(w=800.0, h=600.0)</span></span> <span class="line"><span>╎ │ layer: OffsetLayer#e73b7</span></span> <span class="line"><span>╎ │ size: Size(800.0, 600.0)</span></span> <span class="line"><span>╎ │ metrics: 66.7% useful (1 bad vs 2 good)</span></span> <span class="line"><span>╎ │ diagnosis: insufficient data to draw conclusion (less than five</span></span> <span class="line"><span>╎ │ repaints)</span></span></code></pre></div></div></li><li><p>A new layer in the layer tree as shown in the <strong>Example 6</strong> results.</p><div class="code-block-wrapper language-plaintext"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span>├─child 1: OffsetLayer#0f766</span></span> <span class="line"><span>│ │ creator: RepaintBoundary ← _FocusInheritedScope ← Semantics ←</span></span> <span class="line"><span>│ │ FocusScope ← PrimaryScrollController ← _ActionsScope ← Actions</span></span> <span class="line"><span>│ │ ← Builder ← PageStorage ← Offstage ← _ModalScopeStatus ←</span></span> <span class="line"><span>│ │ UnmanagedRestorationScope ← ⋯</span></span> <span class="line"><span>│ │ engine layer: OffsetEngineLayer#1768d</span></span> <span class="line"><span>│ │ handles: 2</span></span> <span class="line"><span>│ │ offset: Offset(0.0, 0.0)</span></span></code></pre></div></div></li></ol><p>This reduces how much needs to be repainted.</p><div class="header-wrapper"><h3 id="print-the-focus-tree">Print the focus tree</h3><a class="heading-link" href="#print-the-focus-tree" aria-label="Link to 'Print the focus tree' section">#</a></div><p>To debug a focus or shortcut issue, dump the focus tree using the <a href="https://api.flutter.dev/flutter/widgets/debugDumpFocusTree.html"><code>debugDumpFocusTree()</code></a> function.</p><p>The <code>debugDumpFocusTree()</code> method returns the focus tree for the app.</p><p>The focus tree labels nodes in the following way:</p><ul><li>The focused node is labeled <code>PRIMARY FOCUS</code>.</li><li>Ancestors of the focus nodes are labeled <code>IN FOCUS PATH</code>.</li></ul><p>If your app uses the <a href="https://api.flutter.dev/flutter/widgets/Focus-class.html"><code>Focus</code></a> widget, use the <a href="https://api.flutter.dev/flutter/widgets/Focus/debugLabel.html"><code>debugLabel</code></a> property to simplify finding its focus node in the tree.</p><p>You can also use the <a href="https://api.flutter.dev/flutter/widgets/debugFocusChanges.html"><code>debugFocusChanges</code></a> boolean property to enable extensive logging when the focus changes.</p><div class="header-wrapper"><h4 id="example-7-call-debugdumpfocustree">Example 7: Call <code>debugDumpFocusTree()</code></h4><a class="heading-link" href="#example-7-call-debugdumpfocustree" aria-label="Link to 'Example 7: Call debugDumpFocusTree()' section">#</a></div> <?code-excerpt "lib/dump_focus_tree.dart"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#BD2314">import</span><span style="color:#0C7064"> 'package:flutter/material.dart'</span><span style="color:#222222">;</span></span> <span class="line"></span> <span class="line"><span style="color:#BD2314">void</span><span style="color:#6200EE"> main</span><span style="color:#222222">() {</span></span> <span class="line"><span style="color:#6200EE"> runApp</span><span style="color:#222222">(</span><span style="color:#BD2314">const</span><span style="color:#0468D7"> MaterialApp</span><span style="color:#222222">(home: </span><span style="color:#0468D7">AppHome</span><span style="color:#222222">()));</span></span> <span class="line"><span style="color:#222222">}</span></span> <span class="line"></span> <span class="line"><span style="color:#BD2314">class</span><span style="color:#0468D7"> AppHome</span><span style="color:#BD2314"> extends</span><span style="color:#0468D7"> StatelessWidget</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#BD2314"> const</span><span style="color:#0468D7"> AppHome</span><span style="color:#222222">({</span><span style="color:#BD2314">super</span><span style="color:#222222">.key});</span></span> <span class="line"></span> <span class="line"><span style="color:#BD2314"> @override</span></span> <span class="line"><span style="color:#0468D7"> Widget</span><span style="color:#6200EE"> build</span><span style="color:#222222">(</span><span style="color:#0468D7">BuildContext</span><span style="color:#222222"> context) {</span></span> <span class="line"><span style="color:#BD2314"> return</span><span style="color:#0468D7"> Material</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#222222"> child: </span><span style="color:#0468D7">Center</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#222222"> child: </span><span style="color:#0468D7">TextButton</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#222222"> onPressed: () {</span></span> <span class="line"><span style="color:#6200EE"> debugDumpFocusTree</span><span style="color:#222222">();</span></span> <span class="line"><span style="color:#222222"> },</span></span> <span class="line"><span style="color:#222222"> child: </span><span style="color:#BD2314">const</span><span style="color:#0468D7"> Text</span><span style="color:#222222">(</span><span style="color:#0C7064">'Dump Focus Tree'</span><span style="color:#222222">),</span></span> <span class="line"><span style="color:#222222"> ),</span></span> <span class="line"><span style="color:#222222"> ),</span></span> <span class="line"><span style="color:#222222"> );</span></span> <span class="line"><span style="color:#222222"> }</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><details><summary><strong>Expand to view the focus tree for Example 7</strong></summary><div class="code-block-wrapper language-plaintext"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span>flutter: FocusManager#9d096</span></span> <span class="line"><span>flutter: │ primaryFocus: FocusScopeNode#926dc(_ModalScopeState<dynamic></span></span> <span class="line"><span>flutter: │ Focus Scope [PRIMARY FOCUS])</span></span> <span class="line"><span>flutter: │ primaryFocusCreator: FocusScope ← PrimaryScrollController ←</span></span> <span class="line"><span>flutter: │ _ActionsScope ← Actions ← Builder ← PageStorage ← Offstage ←</span></span> <span class="line"><span>flutter: │ _ModalScopeStatus ← UnmanagedRestorationScope ←</span></span> <span class="line"><span>flutter: │ RestorationScope ← AnimatedBuilder ←</span></span> <span class="line"><span>flutter: │ _ModalScope<dynamic>-[LabeledGlobalKey<_ModalScopeState<dynamic>>#bd53e]</span></span> <span class="line"><span>flutter: │ ← Semantics ← _RenderTheaterMarker ← _EffectiveTickerMode ←</span></span> <span class="line"><span>flutter: │ TickerMode ←</span></span> <span class="line"><span>flutter: │ _OverlayEntryWidget-[LabeledGlobalKey<_OverlayEntryWidgetState>#89dd7]</span></span> <span class="line"><span>flutter: │ ← _Theater ← Overlay-[LabeledGlobalKey<OverlayState>#52f82] ←</span></span> <span class="line"><span>flutter: │ UnmanagedRestorationScope ← ⋯</span></span> <span class="line"><span>flutter: │</span></span> <span class="line"><span>flutter: └─rootScope: FocusScopeNode#f4205(Root Focus Scope [IN FOCUS PATH])</span></span> <span class="line"><span>flutter: │ IN FOCUS PATH</span></span> <span class="line"><span>flutter: │ focusedChildren: FocusScopeNode#a0d10(Navigator Scope [IN FOCUS</span></span> <span class="line"><span>flutter: │ PATH])</span></span> <span class="line"><span>flutter: │</span></span> <span class="line"><span>flutter: └─Child 1: FocusNode#088ec([IN FOCUS PATH])</span></span> <span class="line"><span>flutter: │ context: Focus</span></span> <span class="line"><span>flutter: │ NOT FOCUSABLE</span></span> <span class="line"><span>flutter: │ IN FOCUS PATH</span></span> <span class="line"><span>flutter: │</span></span> <span class="line"><span>flutter: └─Child 1: FocusNode#85f70(Shortcuts [IN FOCUS PATH])</span></span> <span class="line"><span>flutter: │ context: Focus</span></span> <span class="line"><span>flutter: │ NOT FOCUSABLE</span></span> <span class="line"><span>flutter: │ IN FOCUS PATH</span></span> <span class="line"><span>flutter: │</span></span> <span class="line"><span>flutter: └─Child 1: FocusNode#f0c18(Shortcuts [IN FOCUS PATH])</span></span> <span class="line"><span>flutter: │ context: Focus</span></span> <span class="line"><span>flutter: │ NOT FOCUSABLE</span></span> <span class="line"><span>flutter: │ IN FOCUS PATH</span></span> <span class="line"><span>flutter: │</span></span> <span class="line"><span>flutter: └─Child 1: FocusNode#0749f(Shortcuts [IN FOCUS PATH])</span></span> <span class="line"><span>flutter: │ context: Focus</span></span> <span class="line"><span>flutter: │ NOT FOCUSABLE</span></span> <span class="line"><span>flutter: │ IN FOCUS PATH</span></span> <span class="line"><span>flutter: │</span></span> <span class="line"><span>flutter: └─Child 1: _FocusTraversalGroupNode#28990(FocusTraversalGroup [IN FOCUS PATH])</span></span> <span class="line"><span>flutter: │ context: Focus</span></span> <span class="line"><span>flutter: │ NOT FOCUSABLE</span></span> <span class="line"><span>flutter: │ IN FOCUS PATH</span></span> <span class="line"><span>flutter: │</span></span> <span class="line"><span>flutter: └─Child 1: FocusNode#5b515(Shortcuts [IN FOCUS PATH])</span></span> <span class="line"><span>flutter: │ context: Focus</span></span> <span class="line"><span>flutter: │ NOT FOCUSABLE</span></span> <span class="line"><span>flutter: │ IN FOCUS PATH</span></span> <span class="line"><span>flutter: │</span></span> <span class="line"><span>flutter: └─Child 1: FocusScopeNode#a0d10(Navigator Scope [IN FOCUS PATH])</span></span> <span class="line"><span>flutter: │ context: FocusScope</span></span> <span class="line"><span>flutter: │ IN FOCUS PATH</span></span> <span class="line"><span>flutter: │ focusedChildren: FocusScopeNode#926dc(_ModalScopeState<dynamic></span></span> <span class="line"><span>flutter: │ Focus Scope [PRIMARY FOCUS])</span></span> <span class="line"><span>flutter: │</span></span> <span class="line"><span>flutter: └─Child 1: _FocusTraversalGroupNode#72c8a(FocusTraversalGroup [IN FOCUS PATH])</span></span> <span class="line"><span>flutter: │ context: Focus</span></span> <span class="line"><span>flutter: │ NOT FOCUSABLE</span></span> <span class="line"><span>flutter: │ IN FOCUS PATH</span></span> <span class="line"><span>flutter: │</span></span> <span class="line"><span>flutter: └─Child 1: FocusNode#eb709(Navigator [IN FOCUS PATH])</span></span> <span class="line"><span>flutter: │ context: Focus</span></span> <span class="line"><span>flutter: │ IN FOCUS PATH</span></span> <span class="line"><span>flutter: │</span></span> <span class="line"><span>flutter: └─Child 1: FocusScopeNode#926dc(_ModalScopeState<dynamic> Focus Scope [PRIMARY FOCUS])</span></span> <span class="line"><span>flutter: │ context: FocusScope</span></span> <span class="line"><span>flutter: │ PRIMARY FOCUS</span></span> <span class="line"><span>flutter: │</span></span> <span class="line"><span>flutter: └─Child 1: FocusNode#a6b74</span></span> <span class="line"><span>flutter: context: Focus</span></span> <span class="line"><span>flutter:</span></span></code></pre></div></div></details><div class="header-wrapper"><h3 id="print-the-semantics-tree">Print the semantics tree</h3><a class="heading-link" href="#print-the-semantics-tree" aria-label="Link to 'Print the semantics tree' section">#</a></div><p>The <code>debugDumpSemanticsTree()</code> function prints the semantic tree for the app.</p><p>The Semantics tree is presented to the system accessibility APIs. To obtain a dump of the Semantics tree:</p><ol><li>Enable accessibility using a system accessibility tool or the <code>SemanticsDebugger</code></li><li>Use the <a href="https://api.flutter.dev/flutter/rendering/debugDumpSemanticsTree.html"><code>debugDumpSemanticsTree()</code></a> function.</li></ol><div class="header-wrapper"><h4 id="example-8-call-debugdumpsemanticstree">Example 8: Call <code>debugDumpSemanticsTree()</code></h4><a class="heading-link" href="#example-8-call-debugdumpsemanticstree" aria-label="Link to 'Example 8: Call debugDumpSemanticsTree()' section">#</a></div> <?code-excerpt "lib/dump_semantic_tree.dart"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#BD2314">import</span><span style="color:#0C7064"> 'package:flutter/foundation.dart'</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#BD2314">import</span><span style="color:#0C7064"> 'package:flutter/material.dart'</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#BD2314">import</span><span style="color:#0C7064"> 'package:flutter/rendering.dart'</span><span style="color:#222222">;</span></span> <span class="line"></span> <span class="line"><span style="color:#BD2314">void</span><span style="color:#6200EE"> main</span><span style="color:#222222">() {</span></span> <span class="line"><span style="color:#6200EE"> runApp</span><span style="color:#222222">(</span><span style="color:#BD2314">const</span><span style="color:#0468D7"> MaterialApp</span><span style="color:#222222">(home: </span><span style="color:#0468D7">AppHome</span><span style="color:#222222">()));</span></span> <span class="line"><span style="color:#222222">}</span></span> <span class="line"></span> <span class="line"><span style="color:#BD2314">class</span><span style="color:#0468D7"> AppHome</span><span style="color:#BD2314"> extends</span><span style="color:#0468D7"> StatelessWidget</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#BD2314"> const</span><span style="color:#0468D7"> AppHome</span><span style="color:#222222">({</span><span style="color:#BD2314">super</span><span style="color:#222222">.key});</span></span> <span class="line"></span> <span class="line"><span style="color:#BD2314"> @override</span></span> <span class="line"><span style="color:#0468D7"> Widget</span><span style="color:#6200EE"> build</span><span style="color:#222222">(</span><span style="color:#0468D7">BuildContext</span><span style="color:#222222"> context) {</span></span> <span class="line"><span style="color:#BD2314"> return</span><span style="color:#0468D7"> Material</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#222222"> child: </span><span style="color:#0468D7">Center</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#222222"> child: </span><span style="color:#0468D7">Semantics</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#222222"> button: </span><span style="color:#0C7064">true</span><span style="color:#222222">,</span></span> <span class="line"><span style="color:#222222"> enabled: </span><span style="color:#0C7064">true</span><span style="color:#222222">,</span></span> <span class="line"><span style="color:#222222"> label: </span><span style="color:#0C7064">'Clickable text here!'</span><span style="color:#222222">,</span></span> <span class="line"><span style="color:#222222"> child: </span><span style="color:#0468D7">GestureDetector</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#222222"> onTap: () {</span></span> <span class="line"><span style="color:#6200EE"> debugDumpSemanticsTree</span><span style="color:#222222">();</span></span> <span class="line"><span style="color:#BD2314"> if</span><span style="color:#222222"> (kDebugMode) {</span></span> <span class="line"><span style="color:#6200EE"> print</span><span style="color:#222222">(</span><span style="color:#0C7064">'Clicked!'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222"> }</span></span> <span class="line"><span style="color:#222222"> },</span></span> <span class="line"><span style="color:#222222"> child: </span><span style="color:#BD2314">const</span><span style="color:#0468D7"> Text</span><span style="color:#222222">(</span><span style="color:#0C7064">'Click Me!'</span><span style="color:#222222">, style: </span><span style="color:#0468D7">TextStyle</span><span style="color:#222222">(fontSize: </span><span style="color:#0C7064">56</span><span style="color:#222222">)),</span></span> <span class="line"><span style="color:#222222"> ),</span></span> <span class="line"><span style="color:#222222"> ),</span></span> <span class="line"><span style="color:#222222"> ),</span></span> <span class="line"><span style="color:#222222"> );</span></span> <span class="line"><span style="color:#222222"> }</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><details><summary><strong>Expand to view the semantic tree for Example 8</strong></summary><div class="code-block-wrapper language-plaintext"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span>flutter: SemanticsNode#0</span></span> <span class="line"><span>flutter: │ Rect.fromLTRB(0.0, 0.0, 800.0, 600.0)</span></span> <span class="line"><span>flutter: │</span></span> <span class="line"><span>flutter: └─SemanticsNode#1</span></span> <span class="line"><span>flutter: │ Rect.fromLTRB(0.0, 0.0, 800.0, 600.0)</span></span> <span class="line"><span>flutter: │ textDirection: ltr</span></span> <span class="line"><span>flutter: │</span></span> <span class="line"><span>flutter: └─SemanticsNode#2</span></span> <span class="line"><span>flutter: │ Rect.fromLTRB(0.0, 0.0, 800.0, 600.0)</span></span> <span class="line"><span>flutter: │ sortKey: OrdinalSortKey#824a2(order: 0.0)</span></span> <span class="line"><span>flutter: │</span></span> <span class="line"><span>flutter: └─SemanticsNode#3</span></span> <span class="line"><span>flutter: │ Rect.fromLTRB(0.0, 0.0, 800.0, 600.0)</span></span> <span class="line"><span>flutter: │ flags: scopesRoute</span></span> <span class="line"><span>flutter: │</span></span> <span class="line"><span>flutter: └─SemanticsNode#4</span></span> <span class="line"><span>flutter: Rect.fromLTRB(278.0, 267.0, 522.0, 333.0)</span></span> <span class="line"><span>flutter: actions: tap</span></span> <span class="line"><span>flutter: flags: isButton, hasEnabledState, isEnabled</span></span> <span class="line"><span>flutter: label:</span></span> <span class="line"><span>flutter: "Clickable text here!</span></span> <span class="line"><span>flutter: Click Me!"</span></span> <span class="line"><span>flutter: textDirection: ltr</span></span> <span class="line"><span>flutter:</span></span> <span class="line"><span>flutter: Clicked!</span></span></code></pre></div></div></details><div class="header-wrapper"><h3 id="print-event-timings">Print event timings</h3><a class="heading-link" href="#print-event-timings" aria-label="Link to 'Print event timings' section">#</a></div><p>If you want to find out where your events happen relative to the frame's begin and end, you can set prints to log these events. To print the beginning and end of the frames to the console, toggle the <a href="https://api.flutter.dev/flutter/scheduler/debugPrintBeginFrameBanner.html"><code>debugPrintBeginFrameBanner</code></a> and the <a href="https://api.flutter.dev/flutter/scheduler/debugPrintEndFrameBanner.html"><code>debugPrintEndFrameBanner</code></a>.</p><p><strong>The print frame banner log for Example 1</strong></p><div class="code-block-wrapper language-plaintext"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span>I/flutter : ▄▄▄▄▄▄▄▄ Frame 12 30s 437.086ms ▄▄▄▄▄▄▄▄</span></span> <span class="line"><span>I/flutter : Debug print: Am I performing this work more than once per frame?</span></span> <span class="line"><span>I/flutter : Debug print: Am I performing this work more than once per frame?</span></span> <span class="line"><span>I/flutter : ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀</span></span></code></pre></div></div><p>To print the call stack causing the current frame to be scheduled, use the <a href="https://api.flutter.dev/flutter/scheduler/debugPrintScheduleFrameStacks.html"><code>debugPrintScheduleFrameStacks</code></a> flag.</p><div class="header-wrapper"><h2 id="debug-layout-issues">Debug layout issues</h2><a class="heading-link" href="#debug-layout-issues" aria-label="Link to 'Debug layout issues' section">#</a></div><p>To debug a layout problem using a GUI, set <a href="https://api.flutter.dev/flutter/rendering/debugPaintSizeEnabled.html"><code>debugPaintSizeEnabled</code></a> to <code>true</code>. This flag can be found in the <code>rendering</code> library. You can enable it at any time and affects all painting while <code>true</code>. Consider adding it to the top of your <code>void main()</code> entry point.</p><div class="header-wrapper"><h4 id="example-9">Example 9</h4><a class="heading-link" href="#example-9" aria-label="Link to 'Example 9' section">#</a></div><p>See an example in the following code:</p> <?code-excerpt "lib/debug_flags.dart (debug-paint-size-enabled)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#6E6E70">// Add import to the Flutter rendering library.</span></span> <span class="line"><span style="color:#BD2314">import</span><span style="color:#0C7064"> 'package:flutter/rendering.dart'</span><span style="color:#222222">;</span></span> <span class="line"></span> <span class="line"><span style="color:#BD2314">void</span><span style="color:#6200EE"> main</span><span style="color:#222222">() {</span></span> <span class="line"><span style="color:#222222"> debugPaintSizeEnabled = </span><span style="color:#0C7064">true</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#6200EE"> runApp</span><span style="color:#222222">(</span><span style="color:#BD2314">const</span><span style="color:#0468D7"> MyApp</span><span style="color:#222222">());</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p>When enabled, Flutter displays the following changes to your app:</p><ul><li>Displays all boxes in a bright teal border.</li><li>Displays all padding as a box with a faded blue fill and blue border around the child widget.</li><li>Displays all alignment positioning with yellow arrows.</li><li>Displays all spacers in gray, when they have no child.</li></ul><p>The <a href="https://api.flutter.dev/flutter/rendering/debugPaintBaselinesEnabled.html"><code>debugPaintBaselinesEnabled</code></a> flag does something similar but for objects with baselines. The app displays the baseline for alphabetic characters in bright green and the baseline for ideographic characters in orange. Alphabetic characters "sit" on the alphabetic baseline, but that baseline "cuts" through the bottom of <a href="https://en.wikipedia.org/wiki/CJK_characters">CJK characters</a>. Flutter positions the ideographic baseline at the very bottom of the text line.</p><p>The <a href="https://api.flutter.dev/flutter/rendering/debugPaintPointersEnabled.html"><code>debugPaintPointersEnabled</code></a> flag turns on a special mode that highlights any objects that you tap in teal. This can help you determine if an object fails to hit test. This might happen if the object falls outside the bounds of its parent and thus not considered for hit testing in the first place.</p><p>If you're trying to debug compositor layers, consider using the following flags.</p><ul><li><p>Use the <a href="https://api.flutter.dev/flutter/rendering/debugPaintLayerBordersEnabled.html"><code>debugPaintLayerBordersEnabled</code></a> flag to find the boundaries of each layer. This flag results in outlining each layer's bounds in orange.</p></li><li><p>Use the <a href="https://api.flutter.dev/flutter/rendering/debugRepaintRainbowEnabled.html"><code>debugRepaintRainbowEnabled</code></a> flag to display a repainted layer. Whenever a layer repaints, it overlays with a rotating set of colors.</p></li></ul><p>Any function or method in the Flutter framework that starts with <code>debug...</code> only works in <a href="/testing/build-modes#debug">debug mode</a>.</p><div class="header-wrapper"><h2 id="debug-animation-issues">Debug animation issues</h2><a class="heading-link" href="#debug-animation-issues" aria-label="Link to 'Debug animation issues' section">#</a></div><aside class="alert alert-info"><div class="alert-header"><i class="material-symbols" aria-hidden="true">info</i> <span>Note</span></div><div class="alert-content"><p>To debug animations with the least effort, slow them down. To slow down the animation, click <strong>Slow Animations</strong> in DevTools' <a href="/tools/devtools/inspector">Inspector view</a>. This reduces the animation to 20% speed. If you want more control over the amount of slowness, use the following instructions.</p></div></aside><p>Set the <a href="https://api.flutter.dev/flutter/scheduler/timeDilation.html"><code>timeDilation</code></a> variable (from the <code>scheduler</code> library) to a number greater than 1.0, for instance, 50.0. It's best to only set this once on app startup. If you change it on the fly, especially if you reduce it while animations are running, it's possible that the framework will observe time going backwards, which will probably result in asserts and generally interfere with your efforts.</p><div class="header-wrapper"><h2 id="debug-performance-issues">Debug performance issues</h2><a class="heading-link" href="#debug-performance-issues" aria-label="Link to 'Debug performance issues' section">#</a></div><aside class="alert alert-info"><div class="alert-header"><i class="material-symbols" aria-hidden="true">info</i> <span>Note</span></div><div class="alert-content"><p>You can achieve similar results to some of these debug flags using <a href="/tools/devtools">DevTools</a>. Some of the debug flags provide little benefit. If you find a flag with functionality you would like to add to <a href="/tools/devtools">DevTools</a>, <a href="https://github.com/flutter/devtools/issues">file an issue</a>.</p></div></aside><p>Flutter provides a wide variety of top-level properties and functions to help you debug your app at various points along the development cycle. To use these features, compile your app in debug mode.</p><p>The following list highlights some of flags and one function from the <a href="https://api.flutter.dev/flutter/rendering/rendering-library.html">rendering library</a> for debugging performance issues.</p><dl><dt><a href="https://api.flutter.dev/flutter/rendering/debugDumpRenderTree.html"><code>debugDumpRenderTree()</code></a></dt><dd><p>To dump the rendering tree to the console, call this function when not in a layout or repaint phase.</p><p>To set these flags either:</p></dd></dl><ul><li>edit the framework code</li><li>import the module, set the value in your <code>main()</code> function, then hot restart.</li></ul><dl><dt><a href="https://api.flutter.dev/flutter/rendering/debugPaintLayerBordersEnabled.html"><code>debugPaintLayerBordersEnabled</code></a></dt><dd>To display the boundaries of each layer, set this property to <code>true</code>. When set, each layer paints a box around its boundary.</dd><dt><a href="https://api.flutter.dev/flutter/rendering/debugRepaintRainbowEnabled.html"><code>debugRepaintRainbowEnabled</code></a></dt><dd>To display a colored border around each widget, set this property to <code>true</code>. These borders change color as the app user scrolls in the app. To set this flag, add <code>debugRepaintRainbowEnabled = true;</code> as a top-level property in your app. If any static widgets rotate through colors after setting this flag, consider adding repaint boundaries to those areas.</dd><dt><a href="https://api.flutter.dev/flutter/rendering/debugPrintMarkNeedsLayoutStacks.html"><code>debugPrintMarkNeedsLayoutStacks</code></a></dt><dd>To determine if your app creates more layouts than expected, set this property to <code>true</code>. This layout issue could happen on the timeline, on a profile, or from a <code>print</code> statement inside a layout method. When set, the framework outputs stack traces to the console to explain why your app marks each render object to be laid out.</dd><dt><a href="https://api.flutter.dev/flutter/rendering/debugPrintMarkNeedsPaintStacks.html"><code>debugPrintMarkNeedsPaintStacks</code></a></dt><dd>To determine if your app paints more layouts than expected, set this property to <code>true</code>.</dd></dl><p>You can generate stack traces on demand as well. To print your own stack traces, add the <code>debugPrintStack()</code> function to your app.</p><div class="header-wrapper"><h3 id="trace-dart-code-performance">Trace Dart code performance</h3><a class="heading-link" href="#trace-dart-code-performance" aria-label="Link to 'Trace Dart code performance' section">#</a></div><aside class="alert alert-info"><div class="alert-header"><i class="material-symbols" aria-hidden="true">info</i> <span>Note</span></div><div class="alert-content"><p>You can use the DevTools <a href="/tools/devtools/performance#timeline-events-tab">Timeline events tab</a> to perform traces. You can also import and export trace files into the Timeline view, but only files generated by DevTools.</p></div></aside><p>To perform custom performance traces and measure wall or CPU time of arbitrary segments of Dart code, use <code>dart:developer</code> <a href="https://api.dart.dev/dart-developer/Timeline-class.html">Timeline</a> utilities.</p><ol><li><p>Open your source code.</p></li><li><p>Wrap the code you want to measure in <code>Timeline</code> methods.</p> <?code-excerpt "lib/perf_trace.dart"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#BD2314">import</span><span style="color:#0C7064"> 'dart:developer'</span><span style="color:#222222">;</span></span> <span class="line"></span> <span class="line"><span style="color:#BD2314">void</span><span style="color:#6200EE"> main</span><span style="color:#222222">() {</span></span> <span class="line"><span style="color:#0468D7"> Timeline</span><span style="color:#222222">.</span><span style="color:#6200EE">startSync</span><span style="color:#222222">(</span><span style="color:#0C7064">'interesting function'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#6E6E70"> // iWonderHowLongThisTakes();</span></span> <span class="line"><span style="color:#0468D7"> Timeline</span><span style="color:#222222">.</span><span style="color:#6200EE">finishSync</span><span style="color:#222222">();</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div></li><li><p>While connected to your app, open DevTools' <a href="/tools/devtools/performance#timeline-events-tab">Timeline events tab</a>.</p></li><li><p>Select the <strong>Dart</strong> recording option in the <strong>Performance settings</strong>.</p></li><li><p>Perform the function you want to measure.</p></li></ol><p>To ensure that the runtime performance characteristics closely match that of your final product, run your app in <a href="/testing/build-modes#profile">profile mode</a>.</p><div class="header-wrapper"><h3 id="add-performance-overlay">Add performance overlay</h3><a class="heading-link" href="#add-performance-overlay" aria-label="Link to 'Add performance overlay' section">#</a></div><aside class="alert alert-info"><div class="alert-header"><i class="material-symbols" aria-hidden="true">info</i> <span>Note</span></div><div class="alert-content"><p>You can toggle display of the performance overlay on your app using the <strong>Performance Overlay</strong> button in the <a href="/tools/devtools/inspector">Flutter inspector</a>. If you prefer to do it in code, use the following instructions.</p></div></aside><p>To enable the <code>PerformanceOverlay</code> widget in your code, set the <code>showPerformanceOverlay</code> property to <code>true</code> on the <a href="https://api.flutter.dev/flutter/material/MaterialApp/MaterialApp.html"><code>MaterialApp</code></a>, <a href="https://api.flutter.dev/flutter/cupertino/CupertinoApp-class.html"><code>CupertinoApp</code></a>, or <a href="https://api.flutter.dev/flutter/widgets/WidgetsApp-class.html"><code>WidgetsApp</code></a> constructor:</p><div class="header-wrapper"><h4 id="example-10">Example 10</h4><a class="heading-link" href="#example-10" aria-label="Link to 'Example 10' section">#</a></div> <?code-excerpt "lib/performance_overlay.dart (show-overlay)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#BD2314">import</span><span style="color:#0C7064"> 'package:flutter/material.dart'</span><span style="color:#222222">;</span></span> <span class="line"></span> <span class="line"><span style="color:#BD2314">class</span><span style="color:#0468D7"> MyApp</span><span style="color:#BD2314"> extends</span><span style="color:#0468D7"> StatelessWidget</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#BD2314"> const</span><span style="color:#0468D7"> MyApp</span><span style="color:#222222">({</span><span style="color:#BD2314">super</span><span style="color:#222222">.key});</span></span> <span class="line"></span> <span class="line"><span style="color:#BD2314"> @override</span></span> <span class="line"><span style="color:#0468D7"> Widget</span><span style="color:#6200EE"> build</span><span style="color:#222222">(</span><span style="color:#0468D7">BuildContext</span><span style="color:#222222"> context) {</span></span> <span class="line"><span style="color:#BD2314"> return</span><span style="color:#0468D7"> MaterialApp</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#222222"> showPerformanceOverlay: </span><span style="color:#0C7064">true</span><span style="color:#222222">,</span></span> <span class="line"><span style="color:#222222"> title: </span><span style="color:#0C7064">'My Awesome App'</span><span style="color:#222222">,</span></span> <span class="line"><span style="color:#222222"> theme: </span><span style="color:#0468D7">ThemeData</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#222222"> colorScheme: </span><span style="color:#0468D7">ColorScheme</span><span style="color:#222222">.</span><span style="color:#6200EE">fromSeed</span><span style="color:#222222">(seedColor: </span><span style="color:#0468D7">Colors</span><span style="color:#222222">.deepPurple),</span></span> <span class="line"><span style="color:#222222"> ),</span></span> <span class="line"><span style="color:#222222"> home: </span><span style="color:#BD2314">const</span><span style="color:#0468D7"> MyHomePage</span><span style="color:#222222">(title: </span><span style="color:#0C7064">'My Awesome App'</span><span style="color:#222222">),</span></span> <span class="line"><span style="color:#222222"> );</span></span> <span class="line"><span style="color:#222222"> }</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><p>(If you're not using <code>MaterialApp</code>, <code>CupertinoApp</code>, or <code>WidgetsApp</code>, you can get the same effect by wrapping your application in a stack and putting a widget on your stack that was created by calling <a href="https://api.flutter.dev/flutter/widgets/PerformanceOverlay/PerformanceOverlay.allEnabled.html"><code>PerformanceOverlay.allEnabled()</code></a>.)</p><p>To learn how to interpret the graphs in the overlay, check out <a href="/perf/ui-performance#the-performance-overlay">The performance overlay</a> in <a href="/perf/ui-performance">Profiling Flutter performance</a>.</p><div class="header-wrapper"><h2 id="add-widget-alignment-grid">Add widget alignment grid</h2><a class="heading-link" href="#add-widget-alignment-grid" aria-label="Link to 'Add widget alignment grid' section">#</a></div><p>To add an overlay to a <a href="https://m3.material.io/foundations/layout/understanding-layout/spacing">Material Design baseline grid</a> on your app to help verify alignments, add the <code>debugShowMaterialGrid</code> argument in the <a href="https://api.flutter.dev/flutter/material/MaterialApp/MaterialApp.html"><code>MaterialApp</code> constructor</a>.</p><p>To add an overlay to non-Material applications, add a <a href="https://api.flutter.dev/flutter/widgets/GridPaper-class.html"><code>GridPaper</code></a> widget.</p><p id="page-github-links"><span>Unless stated otherwise, the documentation on this site reflects the latest stable version of Flutter. Page last updated on 2025-02-12.</span> <a href="https://github.com/flutter/website/tree/main/src/content/testing/code-debugging.md" target="_blank" rel="noopener">View source</a> <span>or </span><a href="https://github.com/flutter/website/issues/new?template=1_page_issue.yml&&page-url=https://docs.flutter.dev/testing/code-debugging/&page-source=https://github.com/flutter/website/tree/main/src/content/testing/code-debugging.md" title="Report an issue with this page" target="_blank" rel="noopener">report an issue</a>.</p></article></main></div><footer id="site-footer"><div class="footer-section footer-main"><a class="brand" href="https://flutter.dev"><img src="/assets/images/branding/flutter/logo+text/horizontal/white.svg" alt="Flutter logo" width="164"></a><div class="footer-social-links"><a class="icon-button" href="https://medium.com/flutter" target="_blank" rel="noopener" title="Flutter's Medium blog"><svg><use href="/assets/images/social/medium.svg#medium"></use></svg> </a><a class="icon-button" href="https://youtube.com/@flutterdev" target="_blank" rel="noopener" title="Flutter's YouTube"><svg><use href="/assets/images/social/youtube.svg#youtube"></use></svg> </a><a class="icon-button" href="https://github.com/flutter" target="_blank" rel="noopener" title="Flutter's GitHub"><svg><use href="/assets/images/social/github.svg#github"></use></svg> </a><a class="icon-button" href="https://bsky.app/profile/flutter.dev" target="_blank" rel="noopener" title="Flutter's Bluesky"><svg><use href="/assets/images/social/bluesky.svg#bluesky"></use></svg> </a><a class="icon-button" href="https://twitter.com/FlutterDev" target="_blank" rel="noopener" title="Flutter's X (Twitter)"><svg><use href="/assets/images/social/x.svg#x"></use></svg></a></div></div><div class="footer-section footer-tray"><div class="footer-licenses">Except as otherwise noted, this site is licensed under a <a href="https://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 International License</a>, and code samples are licensed under the <a href="https://opensource.org/licenses/BSD-3-Clause">3-Clause BSD License</a>.</div><div class="footer-utility-links"><ul><li><a href="/tos" title="Terms of use">Terms</a></li><li><a href="/brand" title="Brand usage guidelines">Brand</a></li><li><a href="https://policies.google.com/privacy" target="_blank" rel="noopener" title="Privacy policy">Privacy</a></li><li><a href="/security" title="Security philosophy and practices">Security</a></li></ul></div></div></footer></div><script src="/assets/js/tabs.js?v=4"></script><script src="/assets/js/archive.js?v=4"></script><script src="/assets/js/main.js?v=4"></script></body></html>