Using the Flutter inspector
Note: The inspector works with Flutter mobile and web applications.
What is it?
The Flutter widget inspector is a powerful tool for visualizing and exploring Flutter widget trees. The Flutter framework uses widgets as the core building block for anything from controls (such as text, buttons, and toggles), to layout (such as centering, padding, rows, and columns). The inspector helps you visualize and explore Flutter widget trees, and can be used for the following:
- understanding existing layouts
- diagnosing layout issues
Note: You can still access the Flutter inspector directly from Android Studio/IntelliJ, but you might prefer the more spacious view when running it from DevTools in a browser. Also note that the UI for the inspector varies slightly between these environments. This page describes the UI for the DevTools version of the inspector.
Debugging layout issues visually
The following is a guide to the features available in the inspector’s toolbar. When space is limited, the icon is used as the visual version of the label.
|Select widget mode||Enable this button in order to select a widget on the device to inspect it. For more information, see Inspecting a widget.|
|Refresh tree||Reload the current widget info.|
|Performance Overlay||Toggle display of performance graphs for the GPU & CPU threads. For more information on interpreting these graphs, see The performance overlay in Flutter performance profiling.|
|iOS||Toggle rendering and gesture behaviors between Android and iOS.|
|Debug Paint||Add visual debugging hints to the rendering that display borders, padding, alignment, and spacers.|
|Paint Baselines||Cause each RenderBox to paint a line at each of its text baselines.|
|Slow Animations||Slow down animations to enable visual inspection.|
|Repaint Rainbow||Shows rotating colors on layers when repainting.|
|Debug Mode Banner||Toggles display of the debug banner even when running a debug build.|
Inspecting a widget
You can browse the interactive widget tree to view nearby widgets and see their field values.
To locate individual UI elements in the widget tree, click the Select Widget Mode button in the toolbar. This puts the app on the device into a “widget select” mode. Click any widget in the app’s UI; this selects the widget on the app’s screen, and scrolls the widget tree to the corresponding node. Toggle the Select Widget Mode button again to exit widget select mode.
When debugging layout issues, the key fields to look at are the
constraints fields. The constraints flow down the tree, and the sizes flow back up.
Flutter Layout Explorer
The Flutter Layout Explorer helps you to better understand Flutter layouts. Currently, the Layout Explorer only supports exploration of flex layouts, but it may be extended to other types of layouts in the future.
Using the Layout Explorer
From the Flutter Inspector, select a flex widget (e.g., Row, Column, Flex, etc.) or direct child of a flex widget. If you are using Flutter 1.12.16 or later, you will see an additional tab “Layout Explorer” next to “Details Tree”. Selecting this tab will display the new Layout Explorer feature.
The Layout Explorer visualizes how Flex widgets and their children are laid out. The explorer identifies the main axis and cross axis, as well as the current alignment for each (e.g., start, end, spaceBetween, etc.). It also shows details like flex factor and layout constraints.
Additionally, the explorer shows layout constraint violations and render overflow errors. Violated layout constraints are colored red, and overflow errors are presented in the standard “yellow-tape” pattern, as you would see on a running device. These visualizations aim to improve understanding of why overflow errors occur as well as how to fix them.
Clicking on a widget in the layout explorer will mirror the selection on the on-device inspector. “Select Widget Mode” needs to be enabled for this. To enable it, click on the “Select Widget Mode” button in the inspector.
For some properties, like flex factor and alignment, you can modify the value via dropdown lists in the explorer. When modifying a widget property, you will see the new value reflected not only in the Layout Explorer, but also on the device running your Flutter app. The explorer animates on property changes so that the effect of the change is clear. Widget property changes made from the layout explorer do not modify your source code and are reverted on hot reload.
Layout Explorer supports modifying mainAxisAlignment, crossAxisAlignment, and FlexParentData.flex. In the future, we may add support for additional properties such as mainAxisSize, textDirection, and FlexParentData.fit.
Layout Explorer supports 7 flex options in the UI (null, 0, 1, 2, 3, 4, 5), but technically the flex factor of a flex widget’s child can be any int.
Track widget creation
Part of the functionality of the Flutter inspector is based on instrumenting the application code in order to better understand the source locations where widgets are created. The source instrumentation allows the Flutter inspector to present the widget tree in a manner similar to how the UI was defined in your source code. Without it, the tree of nodes in the widget tree are much deeper, and it can be more difficult to understand how the runtime widget hierarchy corresponds to your application’s UI.
When launching an application from an IDE, the source instrumentation happens by default. For command line launches, you need to opt-in to the source instrumentation. To do this, run the app with the
flutter run --track-widget-creation
If you launch without the flag, you can still use the inspector—you’ll see an inline, dismissable reminder message about using the source instrumentation flag.
Track widget creation enabled (recommended):
Track widget creation disabled (not recommended):
You create a layout by composing widgets to build more complex widgets. For example, the first screenshot below shows 3 icons with a label under each one:. The second screenshot displays the visual layout, showing a row of 3 columns where each column contains an icon and a label.. Here’s a diagram of the widget tree for this UI:.