From 98fe9e01ac775f549891f39f54566aeed661f144 Mon Sep 17 00:00:00 2001 From: Kenzie Davisson Date: Thu, 1 May 2025 12:13:17 -0700 Subject: [PATCH 1/5] Bump flutter candidate and update formatting. --- flutter-candidate.txt | 2 +- .../benchmark/devtools_benchmarks_test.dart | 7 +- .../benchmark/scripts/run_benchmarks.dart | 7 +- .../test_infra/client/client_shared.dart | 19 +- .../benchmark/test_infra/common.dart | 9 +- .../integration_test/run_tests.dart | 4 +- .../devtools_extensions_test.dart | 18 +- .../test_infra/run/_test_app_driver.dart | 27 +- .../test_infra/run/run_test.dart | 9 +- packages/devtools_app/lib/src/app.dart | 86 +++--- .../extensions/embedded/_controller_web.dart | 18 +- .../src/extensions/embedded/_view_web.dart | 27 +- .../lib/src/extensions/extension_screen.dart | 6 +- .../extensions/extension_screen_controls.dart | 4 +- .../lib/src/extensions/extension_service.dart | 44 +-- .../src/extensions/extension_settings.dart | 51 ++-- .../lib/src/framework/home_screen.dart | 29 +- .../lib/src/framework/initializer.dart | 7 +- .../lib/src/framework/notifications_view.dart | 29 +- .../src/framework/observer/_memory_web.dart | 4 +- .../observer/disconnect_observer.dart | 57 ++-- .../framework/observer/memory_observer.dart | 58 ++-- .../lib/src/framework/release_notes.dart | 9 +- .../src/framework/scaffold/about_dialog.dart | 13 +- .../lib/src/framework/scaffold/scaffold.dart | 71 +++-- .../framework/scaffold/settings_dialog.dart | 16 +- .../src/framework/scaffold/status_line.dart | 91 +++--- .../screens/app_size/app_size_controller.dart | 28 +- .../src/screens/app_size/app_size_screen.dart | 145 +++++----- .../src/screens/app_size/app_size_table.dart | 19 +- .../app_size/code_size_attribution.dart | 27 +- .../screens/debugger/breakpoint_manager.dart | 16 +- .../lib/src/screens/debugger/breakpoints.dart | 7 +- .../lib/src/screens/debugger/call_stack.dart | 20 +- .../lib/src/screens/debugger/codeview.dart | 148 +++++----- .../screens/debugger/codeview_controller.dart | 9 +- .../lib/src/screens/debugger/controls.dart | 63 ++-- .../screens/debugger/debugger_controller.dart | 31 +- .../src/screens/debugger/debugger_screen.dart | 27 +- .../lib/src/screens/debugger/file_search.dart | 71 ++--- .../screens/debugger/program_explorer.dart | 126 ++++---- .../debugger/program_explorer_controller.dart | 64 ++--- .../debugger/program_explorer_model.dart | 45 ++- .../lib/src/screens/debugger/span_parser.dart | 42 ++- .../lib/src/screens/debugger/variables.dart | 5 +- .../deep_link_list_view.dart | 91 +++--- .../deep_links_controller.dart | 109 ++++--- .../deep_links_model.dart | 36 ++- .../deep_links_services.dart | 44 ++- .../project_root_selection/root_selector.dart | 18 +- .../select_project_view.dart | 4 +- .../validation_details_view.dart | 217 +++++++------- .../inspector/inspector_breadcrumbs.dart | 90 +++--- .../inspector/inspector_controller.dart | 54 ++-- .../inspector/inspector_data_models.dart | 103 ++++--- .../inspector/inspector_screen_body.dart | 53 ++-- .../inspector/inspector_tree_controller.dart | 126 ++++---- .../inspector/layout_explorer/box/box.dart | 12 +- .../inspector/layout_explorer/flex/flex.dart | 159 +++++------ .../inspector/layout_explorer/flex/utils.dart | 22 +- .../inspector/layout_explorer/ui/arrow.dart | 53 ++-- .../layout_explorer/ui/dimension.dart | 7 +- .../ui/overflow_indicator_painter.dart | 17 +- .../inspector/layout_explorer/ui/utils.dart | 68 +++-- .../ui/widget_constraints.dart | 12 +- .../inspector_shared/inspector_controls.dart | 20 +- .../inspector_settings_dialog.dart | 28 +- .../inspector_v2/inspector_controller.dart | 55 ++-- .../inspector_v2/inspector_data_models.dart | 132 +++++---- .../inspector_v2/inspector_screen_body.dart | 58 ++-- .../inspector_tree_controller.dart | 169 ++++++----- .../inspector_v2/layout_explorer/box/box.dart | 12 +- .../layout_explorer/flex/flex.dart | 159 +++++------ .../layout_explorer/flex/utils.dart | 22 +- .../layout_explorer/ui/arrow.dart | 53 ++-- .../layout_explorer/ui/dimension.dart | 7 +- .../ui/overflow_indicator_painter.dart | 17 +- .../layout_explorer/ui/utils.dart | 111 ++++---- .../ui/widget_constraints.dart | 12 +- .../widget_properties/properties_view.dart | 24 +- .../lib/src/screens/logging/_log_details.dart | 49 ++-- .../lib/src/screens/logging/_when_column.dart | 22 +- .../screens/logging/logging_controller.dart | 34 +-- .../src/screens/logging/logging_controls.dart | 24 +- .../src/screens/logging/logging_screen.dart | 7 +- .../lib/src/screens/logging/metadata.dart | 21 +- .../memory/framework/memory_controller.dart | 12 +- .../controller/chart_pane_controller.dart | 9 +- .../chart/controller/memory_tracker.dart | 9 +- .../memory/panes/chart/data/charts.dart | 5 +- .../chart/widgets/chart_control_pane.dart | 24 +- .../panes/chart/widgets/chart_pane.dart | 108 ++++--- .../chart/widgets/interval_dropdown.dart | 9 +- .../memory/panes/chart/widgets/legend.dart | 26 +- .../panes/control/widgets/control_pane.dart | 17 +- .../diff/controller/diff_pane_controller.dart | 40 ++- .../memory/panes/diff/data/classes_diff.dart | 22 +- .../panes/diff/data/heap_diff_data.dart | 22 +- .../panes/diff/data/heap_diff_store.dart | 19 +- .../screens/memory/panes/diff/diff_pane.dart | 5 +- .../diff/widgets/class_details/path.dart | 49 ++-- .../diff/widgets/class_details/paths.dart | 9 +- .../diff/widgets/classes_table_diff.dart | 35 +-- .../diff/widgets/classes_table_single.dart | 7 +- .../memory/panes/diff/widgets/instances.dart | 51 ++-- .../diff/widgets/snapshot_control_pane.dart | 79 ++--- .../panes/diff/widgets/snapshot_list.dart | 77 +++-- .../panes/diff/widgets/snapshot_view.dart | 13 +- .../memory/panes/profile/instances.dart | 16 +- .../screens/memory/panes/profile/model.dart | 16 +- .../memory/panes/profile/profile_view.dart | 18 +- .../memory/panes/tracing/tracing_data.dart | 20 +- .../memory/panes/tracing/tracing_tree.dart | 22 +- .../memory/shared/heap/class_filter.dart | 22 +- .../screens/memory/shared/heap/sampler.dart | 5 +- .../shared/primitives/memory_timeline.dart | 19 +- .../memory/shared/primitives/painting.dart | 7 +- .../memory/shared/widgets/class_filter.dart | 11 +- .../src/screens/network/har_data_entry.dart | 112 ++++---- .../src/screens/network/har_network_data.dart | 7 +- .../screens/network/network_controller.dart | 14 +- .../src/screens/network/network_model.dart | 25 +- .../network/network_request_inspector.dart | 34 +-- .../network_request_inspector_views.dart | 72 ++--- .../src/screens/network/network_screen.dart | 40 ++- .../src/screens/network/network_service.dart | 8 +- .../screens/network/offline_network_data.dart | 10 +- .../src/screens/network/utils/http_utils.dart | 19 +- .../enhance_tracing/enhance_tracing.dart | 28 +- .../enhance_tracing_controller.dart | 5 +- .../flutter_frames/flutter_frame_model.dart | 7 +- .../flutter_frames/flutter_frames_chart.dart | 97 +++---- .../flutter_frames_controller.dart | 7 +- .../frame_analysis/frame_analysis_model.dart | 12 +- .../panes/frame_analysis/frame_hints.dart | 95 +++---- .../frame_analysis/frame_time_visualizer.dart | 42 ++- .../panes/rebuild_stats/rebuild_stats.dart | 5 +- .../rebuild_stats/rebuild_stats_model.dart | 4 +- .../perfetto/_perfetto_controller_web.dart | 11 +- .../perfetto/tracing/model.dart | 7 +- .../timeline_event_processor.dart | 4 +- .../timeline_events_controller.dart | 25 +- .../timeline_events/timeline_events_view.dart | 56 ++-- .../performance/performance_controller.dart | 15 +- .../performance/performance_model.dart | 11 +- .../performance/performance_screen.dart | 6 +- .../performance/tabbed_performance_view.dart | 37 ++- .../screens/profiler/cpu_profile_model.dart | 134 ++++----- .../screens/profiler/cpu_profile_service.dart | 17 +- .../src/screens/profiler/cpu_profiler.dart | 19 +- .../profiler/cpu_profiler_controller.dart | 30 +- .../src/screens/profiler/panes/bottom_up.dart | 10 +- .../panes/controls/cpu_profiler_controls.dart | 28 +- .../controls/profiler_screen_controls.dart | 27 +- .../panes/method_table/method_table.dart | 20 +- .../method_table/method_table_controller.dart | 16 +- .../src/screens/profiler/profiler_screen.dart | 11 +- .../profiler/profiler_screen_controller.dart | 11 +- .../isolate_statistics_view.dart | 60 ++-- .../class_hierarchy_explorer.dart | 9 +- .../class_hierarchy_explorer_controller.dart | 9 +- .../object_inspector_view.dart | 15 +- .../object_inspector/object_viewport.dart | 7 +- .../object_inspector/vm_field_display.dart | 5 +- .../object_inspector/vm_ic_data_display.dart | 19 +- .../object_inspector/vm_instance_display.dart | 11 +- .../object_inspector/vm_library_display.dart | 5 +- .../object_inspector/vm_object_model.dart | 29 +- .../vm_simple_list_display.dart | 13 +- .../process_memory_tree_columns.dart | 4 +- .../process_memory/process_memory_view.dart | 5 +- .../vm_developer_common_widgets.dart | 101 ++++--- .../vm_service_private_extensions.dart | 104 +++---- .../vm_statistics/vm_statistics_view.dart | 9 +- .../vm_statistics_view_controller.dart | 5 +- .../src/service/json_to_service_cache.dart | 5 +- .../service/service_extension_widgets.dart | 89 +++--- .../lib/src/service/service_extensions.dart | 45 ++- .../lib/src/service/service_manager.dart | 63 ++-- .../lib/src/service/timeline_streams.dart | 7 +- .../lib/src/service/vm_flags.dart | 13 +- .../lib/src/service/vm_service_wrapper.dart | 11 +- .../src/shared/analytics/_analytics_web.dart | 269 ++++++++---------- .../shared/analytics/analytics_common.dart | 7 +- .../lib/src/shared/analytics/prompt.dart | 12 +- .../lib/src/shared/charts/chart.dart | 130 ++++----- .../src/shared/charts/chart_controller.dart | 12 +- .../lib/src/shared/charts/chart_trace.dart | 21 +- .../lib/src/shared/charts/flame_chart.dart | 93 +++--- .../lib/src/shared/charts/treemap.dart | 97 +++---- .../drag_and_drop/drag_and_drop.dart | 25 +- .../lib/src/shared/console/console.dart | 5 +- .../shared/console/eval/auto_complete.dart | 9 +- .../src/shared/console/eval/eval_service.dart | 10 +- .../shared/console/widgets/console_pane.dart | 10 +- .../shared/console/widgets/description.dart | 111 ++++---- .../console/widgets/display_provider.dart | 23 +- .../src/shared/console/widgets/evaluate.dart | 62 ++-- .../lib/src/shared/development_helpers.dart | 5 +- .../shared/diagnostics/dart_object_node.dart | 12 +- .../shared/diagnostics/inspector_service.dart | 81 +++--- .../src/shared/diagnostics/references.dart | 66 +++-- .../src/shared/diagnostics/tree_builder.dart | 8 +- .../lib/src/shared/editor/api_classes.dart | 45 ++- .../lib/src/shared/editor/editor_client.dart | 24 +- .../environment_parameters_external.dart | 15 +- .../shared/framework/app_error_handling.dart | 12 +- .../lib/src/shared/framework/screen.dart | 25 +- .../shared/framework/screen_controllers.dart | 21 +- .../lib/src/shared/http/_http_exception.dart | 7 +- .../src/shared/http/http_request_data.dart | 38 ++- .../src/shared/managers/banner_messages.dart | 189 ++++++------ .../src/shared/managers/notifications.dart | 21 +- .../lib/src/shared/managers/survey.dart | 44 +-- .../lib/src/shared/memory/class_name.dart | 5 +- .../lib/src/shared/memory/classes.dart | 24 +- .../lib/src/shared/memory/retainers.dart | 25 +- .../preferences/_inspector_preferences.dart | 28 +- .../custom_pointer_scroll_view.dart | 49 ++-- .../primitives/diagnostics_text_styles.dart | 5 +- .../lib/src/shared/primitives/encoding.dart | 9 +- .../primitives/extent_delegate_list.dart | 20 +- .../linked_scroll_controller.dart | 7 +- .../lib/src/shared/primitives/trees.dart | 5 +- .../lib/src/shared/primitives/utils.dart | 42 +-- .../lib/src/shared/server/server.dart | 5 +- .../src/shared/server/server_api_client.dart | 7 +- .../lib/src/shared/table/_flat_table.dart | 20 +- .../lib/src/shared/table/_table_column.dart | 28 +- .../lib/src/shared/table/_table_row.dart | 79 +++-- .../lib/src/shared/table/_tree_table.dart | 7 +- .../lib/src/shared/table/column_widths.dart | 23 +- .../lib/src/shared/table/table.dart | 35 +-- .../lib/src/shared/table/table_data.dart | 14 +- .../devtools_app/lib/src/shared/title.dart | 4 +- .../lib/src/shared/ui/common_widgets.dart | 121 ++++---- .../lib/src/shared/ui/dialogs.dart | 28 +- .../lib/src/shared/ui/drop_down_button.dart | 5 +- .../lib/src/shared/ui/editable_list.dart | 24 +- .../lib/src/shared/ui/file_import.dart | 80 +++--- .../lib/src/shared/ui/filter.dart | 112 ++++---- .../lib/src/shared/ui/history_viewport.dart | 139 +++++---- .../devtools_app/lib/src/shared/ui/hover.dart | 7 +- .../lib/src/shared/ui/search.dart | 200 +++++++------ .../lib/src/shared/ui/side_panel.dart | 11 +- .../lib/src/shared/ui/tree_view.dart | 26 +- .../devtools_app/lib/src/shared/ui/utils.dart | 7 +- .../lib/src/shared/ui/vm_flag_widgets.dart | 23 +- .../lib/src/shared/utils/utils.dart | 4 +- .../lib/src/shared/utils/vm_utils.dart | 18 +- .../property_editor_controller.dart | 64 ++--- .../property_editor_inputs.dart | 17 +- .../property_editor_messages.dart | 10 +- .../property_editor_panel.dart | 7 +- .../property_editor_types.dart | 11 +- .../property_editor/property_editor_view.dart | 34 ++- .../property_editor/utils/utils.dart | 11 +- .../standalone_ui/vs_code/debug_sessions.dart | 33 +-- .../src/standalone_ui/vs_code/devices.dart | 18 +- .../vs_code/devtools/devtools_view.dart | 44 ++- .../vs_code/devtools/shared.dart | 44 +-- .../sidebar_extensions_controller.dart | 32 +-- .../standalone_ui/vs_code/flutter_panel.dart | 7 +- .../extensions/extension_settings_test.dart | 72 +++-- .../observer/memory_observer_test.dart | 52 ++-- .../cpu_profiler_controller_test.dart | 36 +-- .../cpu_profiler/cpu_profiler_test.dart | 14 +- .../method_table/method_table_model_test.dart | 28 +- .../debugger_screen_call_stack_test.dart | 7 +- .../screens/debugger/eval_field_test.dart | 5 +- .../screens/debugger/file_search_test.dart | 8 +- .../screens/debugger/span_parser_test.dart | 14 +- .../deep_links_screen_test.dart | 5 +- .../screens/inspector/diagnostics_test.dart | 17 +- .../inspector/inspector_tree_test.dart | 27 +- .../inspector_data_models_test.dart | 12 +- .../inspector/utils/inspector_tree.dart | 17 +- .../inspector_v2/diagnostics_test.dart | 17 +- .../inspector_integration_test.dart | 5 +- .../inspector_v2/inspector_screen_test.dart | 7 +- .../inspector_v2/inspector_tree_test.dart | 22 +- .../inspector_data_models_test.dart | 12 +- .../inspector_v2/utils/inspector_tree.dart | 17 +- .../logging/logging_screen_data_test.dart | 11 +- .../test/screens/logging/metadata_test.dart | 17 +- .../controller/diff_pane_controller_test.dart | 8 +- .../diff/controller/heap_diff_test.dart | 26 +- .../diff/widgets/class_filter_test.dart | 7 +- .../framework/memory_controller_test.dart | 7 +- .../shared/heap/heap_analyzer_test.dart | 162 +++++------ .../screens/memory/shared/heap/heap_test.dart | 82 +++--- .../memory/tracing/tracing_view_test.dart | 21 +- .../network/network_controller_test.dart | 41 +-- .../network/network_profiler_test.dart | 4 +- .../timeline_event_processor_test.dart | 22 +- .../test/shared/analytics/analytics_test.dart | 5 +- .../test/shared/ansi_output_test.dart | 13 +- .../test/shared/charts/flame_chart_test.dart | 23 +- .../test/shared/charts/treemap_test.dart | 9 +- .../diagnostics/inspector_service_test.dart | 52 ++-- .../test/shared/eval_integration_test.dart | 24 +- .../test/shared/framework/screens_test.dart | 19 +- .../framework/visible_screens_test.dart | 11 +- .../test/shared/import_export_test.dart | 17 +- .../shared/memory/retaining_path_test.dart | 20 +- .../preferences_controller_test.dart | 20 +- .../test/shared/primitives/trees_test.dart | 58 ++-- .../test/shared/primitives/utils_test.dart | 91 +++--- .../test/shared/table/table_test.dart | 59 ++-- .../test/shared/ui/filter_test.dart | 5 +- .../test/shared/ui/hover_test.dart | 15 +- .../test/shared/ui/ui_utils_test.dart | 15 +- .../test/shared/ui/vm_flag_widgets_test.dart | 20 +- .../standalone_ui/vs_code/devtools_test.dart | 21 +- .../fixtures/networking_app/bin/main.dart | 9 +- .../test/test_infra/flutter_test_driver.dart | 12 +- .../test_infra/scenes/memory/default.dart | 27 +- .../editor_service/simulated_editor.dart | 9 +- .../standalone_ui/mock_editor_widget.dart | 131 ++++----- .../property_editor_sidebar.dart | 21 +- .../test_data/cpu_profiler/cpu_profile.dart | 255 +++++++++-------- .../debugger/vm_service_object_tree.dart | 25 +- .../test_data/memory/heap/heap_data.dart | 5 +- .../performance/sample_performance_data.dart | 209 +++++++------- .../test/test_infra/utils/ansi.dart | 11 +- .../test_infra/utils/rendering_tester.dart | 8 +- .../test/test_infra/utils/test_utils.dart | 5 +- .../test_driver/integration_test.dart | 146 +++++----- .../lib/src/ui/text_field.dart | 26 +- 329 files changed, 5626 insertions(+), 6189 deletions(-) diff --git a/flutter-candidate.txt b/flutter-candidate.txt index 61f6f6d653e..a50a5ca0e41 100644 --- a/flutter-candidate.txt +++ b/flutter-candidate.txt @@ -1 +1 @@ -a7f820163c5d7d5321872c60f22fa047fb94bd7b +80d0409d137acdd55af4124b7622915c062c9d21 diff --git a/packages/devtools_app/benchmark/devtools_benchmarks_test.dart b/packages/devtools_app/benchmark/devtools_benchmarks_test.dart index aa7cc2640b8..7cabd140ae3 100644 --- a/packages/devtools_app/benchmark/devtools_benchmarks_test.dart +++ b/packages/devtools_app/benchmark/devtools_benchmarks_test.dart @@ -53,10 +53,9 @@ Future _runBenchmarks({bool useWasm = false}) async { final taskResult = await serveWebBenchmark( benchmarkAppDirectory: projectRootDirectory(), entryPoint: generateBenchmarkEntryPoint(useWasm: useWasm), - compilationOptions: - useWasm - ? const CompilationOptions.wasm() - : const CompilationOptions.js(), + compilationOptions: useWasm + ? const CompilationOptions.wasm() + : const CompilationOptions.js(), treeShakeIcons: false, benchmarkPath: benchmarkPath(useWasm: useWasm), ); diff --git a/packages/devtools_app/benchmark/scripts/run_benchmarks.dart b/packages/devtools_app/benchmark/scripts/run_benchmarks.dart index bc0dd115e78..797821a024d 100644 --- a/packages/devtools_app/benchmark/scripts/run_benchmarks.dart +++ b/packages/devtools_app/benchmark/scripts/run_benchmarks.dart @@ -56,10 +56,9 @@ Future runBenchmarks({ await serveWebBenchmark( benchmarkAppDirectory: projectRootDirectory(), entryPoint: generateBenchmarkEntryPoint(useWasm: useWasm), - compilationOptions: - useWasm - ? const CompilationOptions.wasm() - : const CompilationOptions.js(), + compilationOptions: useWasm + ? const CompilationOptions.wasm() + : const CompilationOptions.js(), treeShakeIcons: false, benchmarkPath: benchmarkPath(useWasm: useWasm), headless: !useBrowser, diff --git a/packages/devtools_app/benchmark/test_infra/client/client_shared.dart b/packages/devtools_app/benchmark/test_infra/client/client_shared.dart index 3e33cbdf969..be919a56e9a 100644 --- a/packages/devtools_app/benchmark/test_infra/client/client_shared.dart +++ b/packages/devtools_app/benchmark/test_infra/client/client_shared.dart @@ -10,16 +10,11 @@ import '../devtools_recorder.dart'; typedef RecorderFactory = Recorder Function(); final benchmarks = { - DevToolsBenchmark.navigateThroughOfflineScreens.id: - () => DevToolsRecorder( - benchmark: DevToolsBenchmark.navigateThroughOfflineScreens, - ), - DevToolsBenchmark.offlineCpuProfilerScreen.id: - () => DevToolsRecorder( - benchmark: DevToolsBenchmark.offlineCpuProfilerScreen, - ), - DevToolsBenchmark.offlinePerformanceScreen.id: - () => DevToolsRecorder( - benchmark: DevToolsBenchmark.offlinePerformanceScreen, - ), + DevToolsBenchmark.navigateThroughOfflineScreens.id: () => DevToolsRecorder( + benchmark: DevToolsBenchmark.navigateThroughOfflineScreens, + ), + DevToolsBenchmark.offlineCpuProfilerScreen.id: () => + DevToolsRecorder(benchmark: DevToolsBenchmark.offlineCpuProfilerScreen), + DevToolsBenchmark.offlinePerformanceScreen.id: () => + DevToolsRecorder(benchmark: DevToolsBenchmark.offlinePerformanceScreen), }; diff --git a/packages/devtools_app/benchmark/test_infra/common.dart b/packages/devtools_app/benchmark/test_infra/common.dart index d6b9dcb2fb1..2915822c626 100644 --- a/packages/devtools_app/benchmark/test_infra/common.dart +++ b/packages/devtools_app/benchmark/test_infra/common.dart @@ -12,11 +12,10 @@ const _benchmarkInitialPage = ''; const _wasmQueryParameters = {'wasm': 'true'}; -String benchmarkPath({required bool useWasm}) => - Uri( - path: _benchmarkInitialPage, - queryParameters: useWasm ? _wasmQueryParameters : null, - ).toString(); +String benchmarkPath({required bool useWasm}) => Uri( + path: _benchmarkInitialPage, + queryParameters: useWasm ? _wasmQueryParameters : null, +).toString(); String generateBenchmarkEntryPoint({required bool useWasm}) { return 'benchmark/test_infra/client/client_${useWasm ? 'wasm' : 'js'}.dart'; diff --git a/packages/devtools_app/integration_test/run_tests.dart b/packages/devtools_app/integration_test/run_tests.dart index d2a4d978c95..e5dee8cb64b 100644 --- a/packages/devtools_app/integration_test/run_tests.dart +++ b/packages/devtools_app/integration_test/run_tests.dart @@ -55,8 +55,8 @@ void main(List args) async { testRunnerArgs: testRunnerArgs, runTest: _runTest, newArgsGenerator: (args) => DevToolsAppTestRunnerArgs(args), - testIsSupported: - (testFile) => testRunnerArgs.testAppDevice.supportsTest(testFile.path), + testIsSupported: (testFile) => + testRunnerArgs.testAppDevice.supportsTest(testFile.path), debugLogging: debugTestScript, ); } diff --git a/packages/devtools_app/integration_test/test/live_connection/devtools_extensions_test.dart b/packages/devtools_app/integration_test/test/live_connection/devtools_extensions_test.dart index b1350535f41..c80a3c0861b 100644 --- a/packages/devtools_app/integration_test/test/live_connection/devtools_extensions_test.dart +++ b/packages/devtools_app/integration_test/test/live_connection/devtools_extensions_test.dart @@ -268,11 +268,10 @@ Future _verifyExtensionsSettingsMenu( await _openExtensionSettingsMenu(tester); expect(find.byType(ExtensionSetting), findsNWidgets(enabledStates.length)); - final toggleButtonGroups = - tester - .widgetList(find.byType(DevToolsToggleButtonGroup)) - .cast() - .toList(); + final toggleButtonGroups = tester + .widgetList(find.byType(DevToolsToggleButtonGroup)) + .cast() + .toList(); for (int i = 0; i < toggleButtonGroups.length; i++) { logStatus('verify extension settings toggle button states (index $i)'); final group = toggleButtonGroups[i]; @@ -313,11 +312,10 @@ Future _changeExtensionSetting( 'changing the extension setting at index $extensionIndex to value $settingValue', ); await _openExtensionSettingsMenu(tester); - final extensionSetting = - tester - .widgetList(find.byType(DevToolsToggleButtonGroup)) - .cast() - .toList()[extensionIndex]; + final extensionSetting = tester + .widgetList(find.byType(DevToolsToggleButtonGroup)) + .cast() + .toList()[extensionIndex]; await tester.tap( find.descendant( of: find.byWidget(extensionSetting), diff --git a/packages/devtools_app/integration_test/test_infra/run/_test_app_driver.dart b/packages/devtools_app/integration_test/test_infra/run/_test_app_driver.dart index 917b0ede36d..21305bf5624 100644 --- a/packages/devtools_app/integration_test/test_infra/run/_test_app_driver.dart +++ b/packages/devtools_app/integration_test/test_infra/run/_test_app_driver.dart @@ -133,10 +133,9 @@ class TestFlutterApp extends IntegrationTestApp { return _timeoutWithMessages>( () => response.future, timeout: timeout, - message: - event != null - ? 'Did not receive expected $event event.' - : 'Did not receive response to request "$id".', + message: event != null + ? 'Did not receive expected $event event.' + : 'Did not receive response to request "$id".', ).whenComplete(() => sub.cancel()); } @@ -350,8 +349,8 @@ abstract class IntegrationTestApp with IOMixin { _debugPrint('Waiting for process to end'); return runProcess!.exitCode.timeout( IOMixin.killTimeout, - onTimeout: - () => killGracefully(runProcess!, debugLogging: debugTestScript), + onTimeout: () => + killGracefully(runProcess!, debugLogging: debugTestScript), ); } @@ -387,8 +386,9 @@ abstract class IntegrationTestApp with IOMixin { String _debugPrint(String msg) { const maxLength = 500; - final truncatedMsg = - msg.length > maxLength ? '${msg.substring(0, maxLength)}...' : msg; + final truncatedMsg = msg.length > maxLength + ? '${msg.substring(0, maxLength)}...' + : msg; _allMessages.add(truncatedMsg); debugLog('_TestApp - $truncatedMsg'); return msg; @@ -404,12 +404,11 @@ Uri convertToWebSocketUrl({required Uri serviceProtocolUrl}) { serviceProtocolUrl.isScheme('https'); final scheme = isSecure ? 'wss' : 'ws'; - final path = - serviceProtocolUrl.path.endsWith('/ws') - ? serviceProtocolUrl.path - : (serviceProtocolUrl.path.endsWith('/') - ? '${serviceProtocolUrl.path}ws' - : '${serviceProtocolUrl.path}/ws'); + final path = serviceProtocolUrl.path.endsWith('/ws') + ? serviceProtocolUrl.path + : (serviceProtocolUrl.path.endsWith('/') + ? '${serviceProtocolUrl.path}ws' + : '${serviceProtocolUrl.path}/ws'); return serviceProtocolUrl.replace(scheme: scheme, path: path); } diff --git a/packages/devtools_app/integration_test/test_infra/run/run_test.dart b/packages/devtools_app/integration_test/test_infra/run/run_test.dart index bdb72236dc1..4ac52746efe 100644 --- a/packages/devtools_app/integration_test/test_infra/run/run_test.dart +++ b/packages/devtools_app/integration_test/test_infra/run/run_test.dart @@ -89,11 +89,10 @@ Future runFlutterIntegrationTest( class DevToolsAppTestRunnerArgs extends IntegrationTestRunnerArgs { DevToolsAppTestRunnerArgs(super.args, {super.verifyValidTarget = true}) : super(addExtraArgs: _addExtraArgs) { - testAppDevice = - TestAppDevice.fromArgName( - argResults.option(_testAppDeviceArg) ?? - TestAppDevice.flutterTester.argName, - )!; + testAppDevice = TestAppDevice.fromArgName( + argResults.option(_testAppDeviceArg) ?? + TestAppDevice.flutterTester.argName, + )!; } /// The type of device for the test app to run on. diff --git a/packages/devtools_app/lib/src/app.dart b/packages/devtools_app/lib/src/app.dart index e78679344ac..612aa313508 100644 --- a/packages/devtools_app/lib/src/app.dart +++ b/packages/devtools_app/lib/src/app.dart @@ -87,16 +87,17 @@ class DevToolsAppState extends State with AutoDisposeMixin { if (FeatureFlags.devToolsExtensions) { // TODO(https://github.com/flutter/devtools/issues/6273): stop special // casing the package:provider extension. - final containsProviderExtension = - extensionService.currentExtensions.value.visibleExtensions - .where((e) => e.name == 'provider') - .isNotEmpty; - final devToolsScreens = - containsProviderExtension - ? _originalScreens - .where((s) => s.screenId != ScreenMetaData.provider.id) - .toList() - : _originalScreens; + final containsProviderExtension = extensionService + .currentExtensions + .value + .visibleExtensions + .where((e) => e.name == 'provider') + .isNotEmpty; + final devToolsScreens = containsProviderExtension + ? _originalScreens + .where((s) => s.screenId != ScreenMetaData.provider.id) + .toList() + : _originalScreens; return [...devToolsScreens, ..._extensionScreens]; } return _originalScreens; @@ -287,16 +288,15 @@ class DevToolsAppState extends State with AutoDisposeMixin { extensionService.currentExtensions, ], builder: (_, _, child) { - final screensInScaffold = - _visibleScreens() - .where( - (s) => maybeIncludeOnlyEmbeddedScreen( - s, - page: page, - embedMode: embedMode, - ), - ) - .toList(); + final screensInScaffold = _visibleScreens() + .where( + (s) => maybeIncludeOnlyEmbeddedScreen( + s, + page: page, + embedMode: embedMode, + ), + ) + .toList(); removeHiddenScreens(screensInScaffold, queryParams); @@ -354,26 +354,25 @@ class DevToolsAppState extends State with AutoDisposeMixin { embedMode: embedMode, page: page, screens: screensInScaffold, - actions: - isEmbedded() - ? [] - : [ - if (paramsContainVmServiceUri) ...[ - // Hide the hot reload button for Dart web apps, where the - // hot reload service extension is not avilable and where the - // [service.reloadServices] RPC is not implemented. - // TODO(https://github.com/flutter/devtools/issues/6441): find - // a way to show this for Dart web apps when supported. - if (!connectedToDartWebApp) - HotReloadButton( - callOnVmServiceDirectly: !connectedToFlutterApp, - ), - // This button will hide itself based on whether the - // hot restart service is available for the connected app. - const HotRestartButton(), - ], - ...DevToolsScaffold.defaultActions(), + actions: isEmbedded() + ? [] + : [ + if (paramsContainVmServiceUri) ...[ + // Hide the hot reload button for Dart web apps, where the + // hot reload service extension is not avilable and where the + // [service.reloadServices] RPC is not implemented. + // TODO(https://github.com/flutter/devtools/issues/6441): find + // a way to show this for Dart web apps when supported. + if (!connectedToDartWebApp) + HotReloadButton( + callOnVmServiceDirectly: !connectedToFlutterApp, + ), + // This button will hide itself based on whether the + // hot restart service is available for the connected app. + const HotRestartButton(), ], + ...DevToolsScaffold.defaultActions(), + ], ); } return scaffold; @@ -657,8 +656,8 @@ class ScreenUnavailable extends StatelessWidget { if (embedMode == EmbedMode.none) ...[ const SizedBox(height: defaultSpacing), ElevatedButton( - onPressed: - () => routerDelegate.navigateHome(clearScreenParam: true), + onPressed: () => + routerDelegate.navigateHome(clearScreenParam: true), child: const Text('Go to Home screen'), ), ], @@ -702,9 +701,8 @@ List defaultScreens({ ), DevToolsScreen( DebuggerScreen(), - createController: - (routerDelegate) => - DebuggerController(routerDelegate: routerDelegate), + createController: (routerDelegate) => + DebuggerController(routerDelegate: routerDelegate), ), DevToolsScreen( NetworkScreen(), diff --git a/packages/devtools_app/lib/src/extensions/embedded/_controller_web.dart b/packages/devtools_app/lib/src/extensions/embedded/_controller_web.dart index 9d349d94cc2..388fe7ab9d8 100644 --- a/packages/devtools_app/lib/src/extensions/embedded/_controller_web.dart +++ b/packages/devtools_app/lib/src/extensions/embedded/_controller_web.dart @@ -61,10 +61,9 @@ class EmbeddedExtensionControllerImpl extends EmbeddedExtensionController ); final queryParams = { ...DevToolsQueryParams.load().params, - ExtensionEventParameters.theme: - isDarkThemeEnabled() - ? ExtensionEventParameters.themeValueDark - : ExtensionEventParameters.themeValueLight, + ExtensionEventParameters.theme: isDarkThemeEnabled() + ? ExtensionEventParameters.themeValueDark + : ExtensionEventParameters.themeValueLight, if (dtdManager.uri != null) 'dtdUri': dtdManager.uri.toString(), }; return Uri.parse(baseUri).replace(queryParameters: queryParams).toString(); @@ -89,12 +88,11 @@ class EmbeddedExtensionControllerImpl extends EmbeddedExtensionController ); _initialized = true; - _extensionIFrame = - HTMLIFrameElement() - // This url is safe because we built it ourselves and it does not include - // any user input. - ..src = extensionUrl - ..allow = 'usb'; + _extensionIFrame = HTMLIFrameElement() + // This url is safe because we built it ourselves and it does not include + // any user input. + ..src = extensionUrl + ..allow = 'usb'; _extensionIFrame.style ..border = 'none' ..height = '100%' diff --git a/packages/devtools_app/lib/src/extensions/embedded/_view_web.dart b/packages/devtools_app/lib/src/extensions/embedded/_view_web.dart index 47cce6525b5..7174fea5a82 100644 --- a/packages/devtools_app/lib/src/extensions/embedded/_view_web.dart +++ b/packages/devtools_app/lib/src/extensions/embedded/_view_web.dart @@ -148,10 +148,9 @@ class _ExtensionIFrameController extends DisposableController addAutoDisposeListener(preferences.darkModeEnabled, () { updateTheme( - theme: - isDarkThemeEnabled() - ? ExtensionEventParameters.themeValueDark - : ExtensionEventParameters.themeValueLight, + theme: isDarkThemeEnabled() + ? ExtensionEventParameters.themeValueDark + : ExtensionEventParameters.themeValueLight, ); }); } @@ -184,10 +183,9 @@ class _ExtensionIFrameController extends DisposableController if (extensionEvent != null) { onEventReceived( extensionEvent, - onUnknownEvent: - () => notificationService.push( - 'Unknown event received from extension: $extensionEvent}', - ), + onUnknownEvent: () => notificationService.push( + 'Unknown event received from extension: $extensionEvent}', + ), ); } } @@ -316,13 +314,12 @@ class _ExtensionIFrameController extends DisposableController screenId: '${showBannerMessageEvent.extensionName}_ext', dismissOnConnectionChanges: showBannerMessageEvent.dismissOnConnectionChanges, - buildTextSpans: - (_) => [ - TextSpan( - text: showBannerMessageEvent.message, - style: TextStyle(fontSize: defaultFontSize), - ), - ], + buildTextSpans: (_) => [ + TextSpan( + text: showBannerMessageEvent.message, + style: TextStyle(fontSize: defaultFontSize), + ), + ], ); bannerMessages.addMessage( bannerMessage, diff --git a/packages/devtools_app/lib/src/extensions/extension_screen.dart b/packages/devtools_app/lib/src/extensions/extension_screen.dart index b6bd80c1c0c..e54cb646f41 100644 --- a/packages/devtools_app/lib/src/extensions/extension_screen.dart +++ b/packages/devtools_app/lib/src/extensions/extension_screen.dart @@ -106,10 +106,8 @@ class ExtensionView extends StatelessWidget { children: [ EmbeddedExtensionHeader( ext: ext, - onForceReload: - () => controller.postMessage( - DevToolsExtensionEventType.forceReload, - ), + onForceReload: () => + controller.postMessage(DevToolsExtensionEventType.forceReload), ), const SizedBox(height: intermediateSpacing), Expanded( diff --git a/packages/devtools_app/lib/src/extensions/extension_screen_controls.dart b/packages/devtools_app/lib/src/extensions/extension_screen_controls.dart index b77d3d36dae..39e6c948e8b 100644 --- a/packages/devtools_app/lib/src/extensions/extension_screen_controls.dart +++ b/packages/devtools_app/lib/src/extensions/extension_screen_controls.dart @@ -64,8 +64,8 @@ class EmbeddedExtensionHeader extends StatelessWidget { url: ext.issueTrackerLink, gaScreenName: gac.DevToolsExtensionEvents.extensionScreenId.name, - gaSelectedItemDescription: gac - .DevToolsExtensionEvents.extensionFeedback(ext), + gaSelectedItemDescription: + gac.DevToolsExtensionEvents.extensionFeedback(ext), ), context: context, ), diff --git a/packages/devtools_app/lib/src/extensions/extension_service.dart b/packages/devtools_app/lib/src/extensions/extension_service.dart index 4a46e15e5d5..2c7513b48ca 100644 --- a/packages/devtools_app/lib/src/extensions/extension_service.dart +++ b/packages/devtools_app/lib/src/extensions/extension_service.dart @@ -18,20 +18,19 @@ final _log = Logger('ExtensionService'); /// Data pattern containing a [List] of available extensions and a [List] of /// visible extensions. -typedef DevToolsExtensionsGroup = - ({ - // All the DevTools extensions, runtime and static, that are available for - // the connected application, regardless of whether they have been enabled - // or disabled by the user. - // - // This set of extensions will include one version of a DevTools extension - // per package. - List availableExtensions, - - // DevTools extensions that are visible in their own DevTools screen (i.e. - // extensions that have not been manually disabled by the user). - List visibleExtensions, - }); +typedef DevToolsExtensionsGroup = ({ + // All the DevTools extensions, runtime and static, that are available for + // the connected application, regardless of whether they have been enabled + // or disabled by the user. + // + // This set of extensions will include one version of a DevTools extension + // per package. + List availableExtensions, + + // DevTools extensions that are visible in their own DevTools screen (i.e. + // extensions that have not been manually disabled by the user). + List visibleExtensions, +}); class ExtensionService extends DisposableController with AutoDisposeControllerMixin { @@ -189,10 +188,12 @@ class ExtensionService extends DisposableController _refreshInProgress.value = true; final allExtensions = await server.refreshAvailableExtensions(_appRoot); - runtimeExtensions = - allExtensions.where((e) => !e.detectedFromStaticContext).toList(); - staticExtensions = - allExtensions.where((e) => e.detectedFromStaticContext).toList(); + runtimeExtensions = allExtensions + .where((e) => !e.detectedFromStaticContext) + .toList(); + staticExtensions = allExtensions + .where((e) => e.detectedFromStaticContext) + .toList(); // TODO(kenz): consider handling duplicates in a way that gives the user a // choice of which version they want to use. @@ -261,10 +262,9 @@ class ExtensionService extends DisposableController ); stateNotifier.value = stateFromOptionsFile; - final shouldIncludeInVisible = - onlyIncludeEnabled - ? stateFromOptionsFile == ExtensionEnabledState.enabled - : stateFromOptionsFile != ExtensionEnabledState.disabled; + final shouldIncludeInVisible = onlyIncludeEnabled + ? stateFromOptionsFile == ExtensionEnabledState.enabled + : stateFromOptionsFile != ExtensionEnabledState.disabled; if (shouldIncludeInVisible) { visible.add(extension); } diff --git a/packages/devtools_app/lib/src/extensions/extension_settings.dart b/packages/devtools_app/lib/src/extensions/extension_settings.dart index f74df9d0278..fb26a80eaa2 100644 --- a/packages/devtools_app/lib/src/extensions/extension_settings.dart +++ b/packages/devtools_app/lib/src/extensions/extension_settings.dart @@ -26,14 +26,12 @@ class ExtensionSettingsAction extends ScaffoldAction { unawaited( showDialog( context: context, - builder: - (context) => ExtensionSettingsDialog( - extensions: - extensionService - .currentExtensions - .value - .availableExtensions, - ), + builder: (context) => ExtensionSettingsDialog( + extensions: extensionService + .currentExtensions + .value + .availableExtensions, + ), ), ); }, @@ -50,8 +48,9 @@ class ExtensionSettingsDialog extends StatelessWidget { Widget build(BuildContext context) { final theme = Theme.of(context); // This dialog needs a fixed height because it contains a scrollable list. - final dialogHeight = - anyTestMode ? scaleByFontFactor(1000.0) : scaleByFontFactor(300.0); + final dialogHeight = anyTestMode + ? scaleByFontFactor(1000.0) + : scaleByFontFactor(300.0); return DevToolsDialog( title: const DialogTitleText('DevTools Extensions'), content: SizedBox( @@ -76,15 +75,14 @@ class ExtensionSettingsDialog extends StatelessWidget { ), const PaddedDivider(), Expanded( - child: - extensions.isEmpty - ? Center( - child: Text( - 'No extensions available.', - style: theme.subtleTextStyle, - ), - ) - : _ExtensionsList(extensions: extensions), + child: extensions.isEmpty + ? Center( + child: Text( + 'No extensions available.', + style: theme.subtleTextStyle, + ), + ) + : _ExtensionsList(extensions: extensions), ), ], ), @@ -126,9 +124,8 @@ class __ExtensionsListState extends State<_ExtensionsList> { child: ListView.builder( controller: scrollController, itemCount: widget.extensions.length, - itemBuilder: - (context, index) => - ExtensionSetting(extension: widget.extensions[index]), + itemBuilder: (context, index) => + ExtensionSetting(extension: widget.extensions[index]), ), ); } @@ -145,9 +142,8 @@ class ExtensionSetting extends StatelessWidget { final buttonStates = [ ( title: 'Enabled', - isSelected: - (ExtensionEnabledState state) => - state == ExtensionEnabledState.enabled, + isSelected: (ExtensionEnabledState state) => + state == ExtensionEnabledState.enabled, onPressed: () { ga.select( gac.DevToolsExtensionEvents.extensionSettingsId.name, @@ -160,9 +156,8 @@ class ExtensionSetting extends StatelessWidget { ), ( title: 'Disabled', - isSelected: - (ExtensionEnabledState state) => - state == ExtensionEnabledState.disabled, + isSelected: (ExtensionEnabledState state) => + state == ExtensionEnabledState.disabled, onPressed: () { ga.select( gac.DevToolsExtensionEvents.extensionSettingsId.name, diff --git a/packages/devtools_app/lib/src/framework/home_screen.dart b/packages/devtools_app/lib/src/framework/home_screen.dart index 6e9b7ed2877..b13512837c6 100644 --- a/packages/devtools_app/lib/src/framework/home_screen.dart +++ b/packages/devtools_app/lib/src/framework/home_screen.dart @@ -104,8 +104,8 @@ class ConnectionSection extends StatelessWidget { minScreenWidthForTextBeforeScaling: _primaryMinScreenWidthForTextBeforeScaling, routerDelegate: DevToolsRouterDelegate.of(context), - onPressed: - () => Navigator.of(context, rootNavigator: true).pop('dialog'), + onPressed: () => + Navigator.of(context, rootNavigator: true).pop('dialog'), ), ], child: const ConnectedAppSummary(narrowView: false), @@ -205,8 +205,9 @@ class _ConnectInputState extends State with BlockingActionMixin { width: scaleByFontFactor(350.0), child: DevToolsClearableTextField( labelText: 'URL', - onSubmitted: - actionInProgress ? null : (str) => unawaited(_connect()), + onSubmitted: actionInProgress + ? null + : (str) => unawaited(_connect()), autofocus: true, controller: connectDialogController, ), @@ -310,20 +311,18 @@ class _SampleDataDropDownButtonState extends State { RoundedDropDownButton( value: value, items: [for (final data in widget.sampleData) _buildMenuItem(data)], - onChanged: - (file) => setState(() { - value = file; - }), + onChanged: (file) => setState(() { + value = file; + }), ), const SizedBox(width: defaultSpacing), ElevatedButton( - onPressed: - value == null - ? null - : () => Provider.of( - context, - listen: false, - ).importData(value!), + onPressed: value == null + ? null + : () => Provider.of( + context, + listen: false, + ).importData(value!), child: const MaterialIconLabel( label: 'Load sample data', iconData: Icons.file_upload, diff --git a/packages/devtools_app/lib/src/framework/initializer.dart b/packages/devtools_app/lib/src/framework/initializer.dart index f736692a701..8bc2760a6a4 100644 --- a/packages/devtools_app/lib/src/framework/initializer.dart +++ b/packages/devtools_app/lib/src/framework/initializer.dart @@ -79,10 +79,9 @@ class _InitializerState extends State children: [ const Spacer(), CenteredMessage( - message: - _showConnectToNewAppButton - ? 'Cannot connect to VM service.' - : 'Waiting for VM service connection...', + message: _showConnectToNewAppButton + ? 'Cannot connect to VM service.' + : 'Waiting for VM service connection...', ), if (_showConnectToNewAppButton) ...[ const SizedBox(height: defaultSpacing), diff --git a/packages/devtools_app/lib/src/framework/notifications_view.dart b/packages/devtools_app/lib/src/framework/notifications_view.dart index 3e5f66af961..3c7757b51ac 100644 --- a/packages/devtools_app/lib/src/framework/notifications_view.dart +++ b/packages/devtools_app/lib/src/framework/notifications_view.dart @@ -243,17 +243,17 @@ class _NotificationState extends State<_Notification> children: [ widget.message.isDismissible ? Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Flexible(child: _NotificationMessage(widget: widget)), - _DismissAction( - onPressed: () { - widget.remove(widget); - }, - ), - ], - ) + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Flexible(child: _NotificationMessage(widget: widget)), + _DismissAction( + onPressed: () { + widget.remove(widget); + }, + ), + ], + ) : _NotificationMessage(widget: widget), const SizedBox(height: defaultSpacing), _NotificationActions(actions: widget.message.actions), @@ -299,10 +299,9 @@ class _NotificationMessage extends StatelessWidget { ), child: Text( widget.message.text, - style: - widget.message.isError - ? textStyle.copyWith(color: theme.colorScheme.error) - : textStyle, + style: widget.message.isError + ? textStyle.copyWith(color: theme.colorScheme.error) + : textStyle, overflow: TextOverflow.visible, maxLines: 10, ), diff --git a/packages/devtools_app/lib/src/framework/observer/_memory_web.dart b/packages/devtools_app/lib/src/framework/observer/_memory_web.dart index 7f393e4e877..d9af70a73ff 100644 --- a/packages/devtools_app/lib/src/framework/observer/_memory_web.dart +++ b/packages/devtools_app/lib/src/framework/observer/_memory_web.dart @@ -27,8 +27,8 @@ extension on Performance { Future<_UserAgentSpecificMemory>? measureUserAgentSpecificMemory() => has('measureUserAgentSpecificMemory') - ? _measureUserAgentSpecificMemory().toDart - : null; + ? _measureUserAgentSpecificMemory().toDart + : null; } @JS() diff --git a/packages/devtools_app/lib/src/framework/observer/disconnect_observer.dart b/packages/devtools_app/lib/src/framework/observer/disconnect_observer.dart index f2b1224019f..bf415e4b3c8 100644 --- a/packages/devtools_app/lib/src/framework/observer/disconnect_observer.dart +++ b/packages/devtools_app/lib/src/framework/observer/disconnect_observer.dart @@ -117,37 +117,36 @@ class DisconnectObserverState extends State OverlayEntry _createDisconnectedOverlay() { final theme = Theme.of(context); currentDisconnectedOverlay = OverlayEntry( - builder: - (context) => Material( - child: Container( - color: theme.colorScheme.surface, - child: Center( - child: Column( - children: [ - const Spacer(), - Text('Disconnected', style: theme.textTheme.headlineMedium), - const SizedBox(height: defaultSpacing), - if (!isEmbedded()) - ConnectToNewAppButton( - routerDelegate: widget.routerDelegate, - onPressed: hideDisconnectedOverlay, - gaScreen: gac.devToolsMain, - ) - else - const Text('Run a new debug session to reconnect.'), - const Spacer(), - if (offlineDataController.offlineDataJson.isNotEmpty) ...[ - ElevatedButton( - onPressed: _reviewHistory, - child: const Text('Review recent data (offline)'), - ), - const Spacer(), - ], - ], - ), - ), + builder: (context) => Material( + child: Container( + color: theme.colorScheme.surface, + child: Center( + child: Column( + children: [ + const Spacer(), + Text('Disconnected', style: theme.textTheme.headlineMedium), + const SizedBox(height: defaultSpacing), + if (!isEmbedded()) + ConnectToNewAppButton( + routerDelegate: widget.routerDelegate, + onPressed: hideDisconnectedOverlay, + gaScreen: gac.devToolsMain, + ) + else + const Text('Run a new debug session to reconnect.'), + const Spacer(), + if (offlineDataController.offlineDataJson.isNotEmpty) ...[ + ElevatedButton( + onPressed: _reviewHistory, + child: const Text('Review recent data (offline)'), + ), + const Spacer(), + ], + ], ), ), + ), + ), ); return currentDisconnectedOverlay!; } diff --git a/packages/devtools_app/lib/src/framework/observer/memory_observer.dart b/packages/devtools_app/lib/src/framework/observer/memory_observer.dart index 148f86686cc..0826cdab59f 100644 --- a/packages/devtools_app/lib/src/framework/observer/memory_observer.dart +++ b/packages/devtools_app/lib/src/framework/observer/memory_observer.dart @@ -23,8 +23,12 @@ import '_memory_desktop.dart' if (dart.library.js_interop) '_memory_web.dart'; /// `toBytes` - total memory usage after the reduction request is completed. /// `success` - whether the reduction in memory brought DevTools memory usage /// below the threshold [MemoryObserver._memoryPressureLimitGb]. -typedef ReduceMemoryResult = - ({bool success, int? fromBytes, int? toBytes, String? error}); +typedef ReduceMemoryResult = ({ + bool success, + int? fromBytes, + int? toBytes, + String? error, +}); /// Observes the memory usage of the DevTools app (web only) and shows a memory /// pressure warning to users when DevTools is nearing the memory limit. @@ -86,10 +90,9 @@ class MemoryObserver extends DisposableController { static Future _memoryExceedsThreshold({ @visibleForTesting Future Function()? debugMeasureUsageInBytes, }) async { - final memoryUsageInBytes = - debugMeasureUsageInBytes != null - ? await debugMeasureUsageInBytes() - : await measureMemoryUsageInBytes(); + final memoryUsageInBytes = debugMeasureUsageInBytes != null + ? await debugMeasureUsageInBytes() + : await measureMemoryUsageInBytes(); _lastMemoryUsageInBytes = memoryUsageInBytes; if (memoryUsageInBytes == null) return false; @@ -132,10 +135,9 @@ class MemoryObserver extends DisposableController { }); } - final success = - !(await _memoryExceedsThreshold( - debugMeasureUsageInBytes: debugMeasureUsageInBytes, - )); + final success = !(await _memoryExceedsThreshold( + debugMeasureUsageInBytes: debugMeasureUsageInBytes, + )); final toBytes = _lastMemoryUsageInBytes; return ( success: success, @@ -186,12 +188,11 @@ class _MemoryPressureBannerMessage extends banner_messages.BannerWarning { ), ]; }, - buildActions: - (_) => [ - // Wrapping with an `Expanded` is okay because this list is set as - // the `children` parameter of a `Row` widget in `BannerMessage`. - const Expanded(child: _ReduceMemoryButton()), - ], + buildActions: (_) => [ + // Wrapping with an `Expanded` is okay because this list is set as + // the `children` parameter of a `Row` widget in `BannerMessage`. + const Expanded(child: _ReduceMemoryButton()), + ], ); static const _messageKey = Key('MemoryPressureBannerMessage'); @@ -229,19 +230,18 @@ class _ReduceMemoryButtonState extends State<_ReduceMemoryButton> { Flexible( child: Padding( padding: const EdgeInsets.symmetric(horizontal: denseSpacing), - child: - inProgress - ? SizedBox( - height: actionsIconSize, - width: actionsIconSize, - child: const CircularProgressIndicator(), - ) - : ValueListenableBuilder( - valueListenable: result, - builder: (context, result, _) { - return _SuccessOrFailureMessage(result: result); - }, - ), + child: inProgress + ? SizedBox( + height: actionsIconSize, + width: actionsIconSize, + child: const CircularProgressIndicator(), + ) + : ValueListenableBuilder( + valueListenable: result, + builder: (context, result, _) { + return _SuccessOrFailureMessage(result: result); + }, + ), ), ), ], diff --git a/packages/devtools_app/lib/src/framework/release_notes.dart b/packages/devtools_app/lib/src/framework/release_notes.dart index be9243f6caf..b6a05b1c04b 100644 --- a/packages/devtools_app/lib/src/framework/release_notes.dart +++ b/packages/devtools_app/lib/src/framework/release_notes.dart @@ -70,15 +70,16 @@ class ReleaseNotesController extends SidePanelController { // user's perspective, these tools are part of the IDE. if (isEmbedded()) { final currentUrl = getWebUrl(); - final currentPage = - currentUrl != null ? extractCurrentPageFromUrl(currentUrl) : null; + final currentPage = currentUrl != null + ? extractCurrentPageFromUrl(currentUrl) + : null; if (StandaloneScreenType.includes(currentPage)) return; } SemanticVersion previousVersion = SemanticVersion(); if (server.isDevToolsServerAvailable) { - final lastReleaseNotesShownVersion = - await server.getLastShownReleaseNotesVersion(); + final lastReleaseNotesShownVersion = await server + .getLastShownReleaseNotesVersion(); _log.fine('lastReleaseNotesShownVersion: $lastReleaseNotesShownVersion'); if (lastReleaseNotesShownVersion.isNotEmpty) { previousVersion = SemanticVersion.parse(lastReleaseNotesShownVersion); diff --git a/packages/devtools_app/lib/src/framework/scaffold/about_dialog.dart b/packages/devtools_app/lib/src/framework/scaffold/about_dialog.dart index 86d4bba775d..cc0fb5a8b2a 100644 --- a/packages/devtools_app/lib/src/framework/scaffold/about_dialog.dart +++ b/packages/devtools_app/lib/src/framework/scaffold/about_dialog.dart @@ -34,10 +34,8 @@ class DevToolsAboutDialog extends StatelessWidget { const Text(' - '), InkWell( child: Text('release notes', style: theme.linkTextStyle), - onTap: - () => unawaited( - releaseNotesController.openLatestReleaseNotes(), - ), + onTap: () => + unawaited(releaseNotesController.openLatestReleaseNotes()), ), ], ), @@ -135,10 +133,9 @@ class OpenAboutAction extends ScaffoldAction { unawaited( showDialog( context: context, - builder: - (context) => DevToolsAboutDialog( - Provider.of(context), - ), + builder: (context) => DevToolsAboutDialog( + Provider.of(context), + ), ), ); }, diff --git a/packages/devtools_app/lib/src/framework/scaffold/scaffold.dart b/packages/devtools_app/lib/src/framework/scaffold/scaffold.dart index e2c6de1b016..47a9caa4350 100644 --- a/packages/devtools_app/lib/src/framework/scaffold/scaffold.dart +++ b/packages/devtools_app/lib/src/framework/scaffold/scaffold.dart @@ -147,10 +147,9 @@ class DevToolsScaffoldState extends State } else if (widget.screens[_tabController!.index].screenId != widget.page) { // If the page changed (eg. the route was modified by pressing back in the // browser), animate to the new one. - var newIndex = - widget.page == null - ? 0 // When there's no supplied page, we show the first one. - : widget.screens.indexWhere((t) => t.screenId == widget.page); + var newIndex = widget.page == null + ? 0 // When there's no supplied page, we show the first one. + : widget.screens.indexWhere((t) => t.screenId == widget.page); // Ensure the returned index is in range, otherwise set to 0. if (newIndex == -1) { newIndex = 0; @@ -326,44 +325,42 @@ class DevToolsScaffoldState extends State child: KeyboardShortcuts( keyboardShortcuts: _currentScreen.buildKeyboardShortcuts(context), child: Scaffold( - appBar: - showAppBar - ? PreferredSize( - preferredSize: Size.fromHeight(defaultToolbarHeight), - // Place the AppBar inside of a Hero widget to keep it the same across - // route transitions. - child: Hero( - tag: _appBarTag, - child: DevToolsAppBar( - tabController: _tabController, - screens: widget.screens, - actions: widget.actions, - ), + appBar: showAppBar + ? PreferredSize( + preferredSize: Size.fromHeight(defaultToolbarHeight), + // Place the AppBar inside of a Hero widget to keep it the same across + // route transitions. + child: Hero( + tag: _appBarTag, + child: DevToolsAppBar( + tabController: _tabController, + screens: widget.screens, + actions: widget.actions, ), - ) - : null, + ), + ) + : null, body: OutlineDecoration.onlyTop( child: Padding( padding: widget.appPadding, - child: - showConsole - ? SplitPane( - axis: Axis.vertical, - splitters: [ConsolePaneHeader()], - initialFractions: const [0.8, 0.2], - children: [ - Padding( - padding: const EdgeInsets.only( - bottom: intermediateSpacing, - ), - child: content, + child: showConsole + ? SplitPane( + axis: Axis.vertical, + splitters: [ConsolePaneHeader()], + initialFractions: const [0.8, 0.2], + children: [ + Padding( + padding: const EdgeInsets.only( + bottom: intermediateSpacing, ), - RoundedOutlinedBorder.onlyBottom( - child: const ConsolePane(), - ), - ], - ) - : content, + child: content, + ), + RoundedOutlinedBorder.onlyBottom( + child: const ConsolePane(), + ), + ], + ) + : content, ), ), bottomNavigationBar: StatusLine( diff --git a/packages/devtools_app/lib/src/framework/scaffold/settings_dialog.dart b/packages/devtools_app/lib/src/framework/scaffold/settings_dialog.dart index 53de8c0bb55..c73d34fde84 100644 --- a/packages/devtools_app/lib/src/framework/scaffold/settings_dialog.dart +++ b/packages/devtools_app/lib/src/framework/scaffold/settings_dialog.dart @@ -61,10 +61,9 @@ class SettingsDialog extends StatelessWidget { child: CheckboxSetting( title: 'Enable analytics', notifier: analyticsController.analyticsEnabled, - onChanged: - (enable) => unawaited( - analyticsController.toggleAnalyticsEnabled(enable), - ), + onChanged: (enable) => unawaited( + analyticsController.toggleAnalyticsEnabled(enable), + ), gaScreen: gac.settingsDialog, gaItem: gac.analytics, ), @@ -133,11 +132,10 @@ class _VerboseLoggingSetting extends StatelessWidget { gaSelection: gac.copyLogs, minScreenWidthForTextBeforeScaling: _minScreenWidthForTextBeforeScaling, - onPressed: - () async => await copyToClipboard( - LogStorage.root.toString(), - successMessage: 'Successfully copied logs', - ), + onPressed: () async => await copyToClipboard( + LogStorage.root.toString(), + successMessage: 'Successfully copied logs', + ), ), const SizedBox(width: denseSpacing), ClearButton( diff --git a/packages/devtools_app/lib/src/framework/scaffold/status_line.dart b/packages/devtools_app/lib/src/framework/scaffold/status_line.dart index 6d0515b4a39..8da298bb40f 100644 --- a/packages/devtools_app/lib/src/framework/scaffold/status_line.dart +++ b/packages/devtools_app/lib/src/framework/scaffold/status_line.dart @@ -48,10 +48,12 @@ class StatusLine extends StatelessWidget { @override Widget build(BuildContext context) { final theme = Theme.of(context); - final backgroundColor = - highlightForConnection ? theme.colorScheme.primary : null; - final foregroundColor = - highlightForConnection ? theme.colorScheme.onPrimary : null; + final backgroundColor = highlightForConnection + ? theme.colorScheme.primary + : null; + final foregroundColor = highlightForConnection + ? theme.colorScheme.onPrimary + : null; final height = statusLineHeight + padding.top + padding.bottom; return ValueListenableBuilder( valueListenable: currentScreen.showIsolateSelector, @@ -81,8 +83,9 @@ class StatusLine extends StatelessWidget { List _getStatusItems(BuildContext context, bool showIsolateSelector) { final theme = Theme.of(context); - final foregroundColor = - highlightForConnection ? theme.colorScheme.onPrimary : null; + final foregroundColor = highlightForConnection + ? theme.colorScheme.onPrimary + : null; final screenWidth = ScreenSize(context).width; // TODO(https://github.com/flutter/devtools/issues/8913): this builds the // wrong status items for offline mode. @@ -146,10 +149,9 @@ class StatusLine extends StatelessWidget { description = vm.deviceDisplay; } - final color = - highlightForConnection - ? theme.colorScheme.onPrimary - : theme.regularTextStyle.color; + final color = highlightForConnection + ? theme.colorScheme.onPrimary + : theme.regularTextStyle.color; return Row( mainAxisAlignment: MainAxisAlignment.end, @@ -160,12 +162,11 @@ class StatusLine extends StatelessWidget { return SizedBox( width: smallProgressSize, height: smallProgressSize, - child: - isBusy - ? SmallCircularProgressIndicator( - valueColor: AlwaysStoppedAnimation(color), - ) - : const SizedBox(), + child: isBusy + ? SmallCircularProgressIndicator( + valueColor: AlwaysStoppedAnimation(color), + ) + : const SizedBox(), ); }, ), @@ -174,12 +175,11 @@ class StatusLine extends StatelessWidget { message: 'Connected device', child: Text( description, - style: - highlightForConnection - ? theme.regularTextStyle.copyWith( - color: theme.colorScheme.onPrimary, - ) - : theme.regularTextStyle, + style: highlightForConnection + ? theme.regularTextStyle.copyWith( + color: theme.colorScheme.onPrimary, + ) + : theme.regularTextStyle, overflow: TextOverflow.clip, ), ), @@ -189,13 +189,12 @@ class StatusLine extends StatelessWidget { return child!; } }, - child: - screenWidth <= MediaSize.xxs - ? DevToolsTooltip( - message: noConnectionMsg, - child: Icon(Icons.warning_amber_rounded, size: actionsIconSize), - ) - : Text(noConnectionMsg, style: theme.regularTextStyle), + child: screenWidth <= MediaSize.xxs + ? DevToolsTooltip( + message: noConnectionMsg, + child: Icon(Icons.warning_amber_rounded, size: actionsIconSize), + ) + : Text(noConnectionMsg, style: theme.regularTextStyle), ); } } @@ -218,8 +217,9 @@ class DocumentationLink extends StatelessWidget { @override Widget build(BuildContext context) { - final color = - highlightForConnection ? Theme.of(context).colorScheme.onPrimary : null; + final color = highlightForConnection + ? Theme.of(context).colorScheme.onPrimary + : null; final docPageId = screen.docPageId ?? ''; return LinkIconLabel( icon: Icons.library_books_outlined, @@ -256,8 +256,9 @@ class VideoTutorialLink extends StatelessWidget { @override Widget build(BuildContext context) { - final color = - highlightForConnection ? Theme.of(context).colorScheme.onPrimary : null; + final color = highlightForConnection + ? Theme.of(context).colorScheme.onPrimary + : null; return LinkIconLabel( icon: Icons.ondemand_video_rounded, link: GaLink( @@ -290,19 +291,17 @@ class IsolateSelector extends StatelessWidget { tooltip: 'Selected Isolate', initialValue: selectedIsolateRef, onSelected: isolateManager.selectIsolate, - itemBuilder: - (BuildContext context) => - isolates.map((ref) { - return PopupMenuItem( - value: ref, - child: _IsolateOption( - ref, - // This is always rendered against the background color - // for the pop up menu, which is the `surface` color. - color: Theme.of(context).colorScheme.onSurface, - ), - ); - }).toList(), + itemBuilder: (BuildContext context) => isolates.map((ref) { + return PopupMenuItem( + value: ref, + child: _IsolateOption( + ref, + // This is always rendered against the background color + // for the pop up menu, which is the `surface` color. + color: Theme.of(context).colorScheme.onSurface, + ), + ); + }).toList(), child: _IsolateOption( isolateManager.selectedIsolate.value, color: foregroundColor, diff --git a/packages/devtools_app/lib/src/screens/app_size/app_size_controller.dart b/packages/devtools_app/lib/src/screens/app_size/app_size_controller.dart index f202d564fd0..cabe3825ebe 100644 --- a/packages/devtools_app/lib/src/screens/app_size/app_size_controller.dart +++ b/packages/devtools_app/lib/src/screens/app_size/app_size_controller.dart @@ -396,10 +396,9 @@ class AppSizeController extends DevToolsScreenController { Map _extractDeferredUnits(Map jsonFile) { if (_hasDeferredInfo(jsonFile)) { - jsonFile['children'] = - _extractChildren( - jsonFile, - ).where((child) => child['isDeferred'] == true).toList(); + jsonFile['children'] = _extractChildren( + jsonFile, + ).where((child) => child['isDeferred'] == true).toList(); jsonFile['n'] = _deferredNodeName; } return jsonFile; @@ -699,17 +698,16 @@ class AppSizeController extends DevToolsScreenController { bool skipNodesWithNoByteSizeChange = true, }) { assert(showDiff ? diffTreeType != null : true); - final rawChildren = - (treeJson['children'] as List).cast>(); + final rawChildren = (treeJson['children'] as List) + .cast>(); final treemapNodeChildren = []; int totalByteSize = 0; // Given a child, build its subtree. for (final child in rawChildren) { - final childTreemapNode = - showDiff - ? generateDiffTree(child, diffTreeType!) - : generateTree(child); + final childTreemapNode = showDiff + ? generateDiffTree(child, diffTreeType!) + : generateTree(child); if (childTreemapNode == null) { continue; } @@ -721,11 +719,11 @@ class AppSizeController extends DevToolsScreenController { return totalByteSize == 0 && skipNodesWithNoByteSizeChange ? null : _buildNode( - treeJson, - totalByteSize, - children: treemapNodeChildren, - showDiff: showDiff, - ); + treeJson, + totalByteSize, + children: treemapNodeChildren, + showDiff: showDiff, + ); } TreemapNode _buildNode( diff --git a/packages/devtools_app/lib/src/screens/app_size/app_size_screen.dart b/packages/devtools_app/lib/src/screens/app_size/app_size_screen.dart index 102c6a46e37..36e3406bc0a 100644 --- a/packages/devtools_app/lib/src/screens/app_size/app_size_screen.dart +++ b/packages/devtools_app/lib/src/screens/app_size/app_size_screen.dart @@ -345,20 +345,19 @@ class _AnalysisViewState extends State with AutoDisposeMixin { return Column( children: [ Expanded( - child: - analysisRootLocal == null - ? _buildImportFileView() - : _AppSizeView( - title: _generateSingleFileHeaderText(), - treemapKey: AppSizeScreen.analysisViewTreemapKey, - treemapRoot: analysisRootLocal, - onRootChangedCallback: controller.changeAnalysisRoot, - analysisTable: AppSizeAnalysisTable( - rootNode: analysisRootLocal.root, - controller: controller, - ), - callGraphRoot: controller.analysisCallGraphRoot.value, + child: analysisRootLocal == null + ? _buildImportFileView() + : _AppSizeView( + title: _generateSingleFileHeaderText(), + treemapKey: AppSizeScreen.analysisViewTreemapKey, + treemapRoot: analysisRootLocal, + onRootChangedCallback: controller.changeAnalysisRoot, + analysisTable: AppSizeAnalysisTable( + rootNode: analysisRootLocal.root, + controller: controller, ), + callGraphRoot: controller.analysisCallGraphRoot.value, + ), ), ], ); @@ -366,10 +365,9 @@ class _AnalysisViewState extends State with AutoDisposeMixin { String _generateSingleFileHeaderText() { final analysisFile = controller.analysisJsonFile.value!; - String output = - analysisFile.isAnalyzeSizeFile - ? 'Total size analysis: ' - : 'Dart AOT snapshot: '; + String output = analysisFile.isAnalyzeSizeFile + ? 'Total size analysis: ' + : 'Dart AOT snapshot: '; output += analysisFile.displayText; return output; } @@ -381,26 +379,26 @@ class _AnalysisViewState extends State with AutoDisposeMixin { return processing ? const CenteredMessage(message: AppSizeScreen.loadingMessage) : Column( - children: [ - Flexible( - child: FileImportContainer( - instructions: AnalysisView.importInstructions, - actionText: 'Analyze Size', - gaScreen: gac.appSize, - gaSelectionImport: gac.importFileSingle, - gaSelectionAction: gac.analyzeSingle, - onAction: (jsonFile) { - controller.loadTreeFromJsonFile( - jsonFile: jsonFile, - onError: (error) { - if (mounted) notificationService.push(error); - }, - ); - }, + children: [ + Flexible( + child: FileImportContainer( + instructions: AnalysisView.importInstructions, + actionText: 'Analyze Size', + gaScreen: gac.appSize, + gaSelectionImport: gac.importFileSingle, + gaSelectionAction: gac.analyzeSingle, + onAction: (jsonFile) { + controller.loadTreeFromJsonFile( + jsonFile: jsonFile, + onError: (error) { + if (mounted) notificationService.push(error); + }, + ); + }, + ), ), - ), - ], - ); + ], + ); }, ); } @@ -451,17 +449,16 @@ class _DiffViewState extends State with AutoDisposeMixin { return Column( children: [ Expanded( - child: - diffRootLocal == null - ? _buildImportDiffView() - : _AppSizeView( - title: _generateDualFileHeaderText(), - treemapKey: AppSizeScreen.diffViewTreemapKey, - treemapRoot: diffRootLocal, - onRootChangedCallback: controller.changeDiffRoot, - analysisTable: AppSizeDiffTable(rootNode: diffRootLocal), - callGraphRoot: controller.diffCallGraphRoot.value, - ), + child: diffRootLocal == null + ? _buildImportDiffView() + : _AppSizeView( + title: _generateDualFileHeaderText(), + treemapKey: AppSizeScreen.diffViewTreemapKey, + treemapRoot: diffRootLocal, + onRootChangedCallback: controller.changeDiffRoot, + analysisTable: AppSizeDiffTable(rootNode: diffRootLocal), + callGraphRoot: controller.diffCallGraphRoot.value, + ), ), ], ); @@ -471,10 +468,9 @@ class _DiffViewState extends State with AutoDisposeMixin { final oldFile = controller.oldDiffJsonFile.value!; final newFile = controller.newDiffJsonFile.value!; String output = 'Diffing '; - output += - oldFile.isAnalyzeSizeFile - ? 'total size analyses: ' - : 'Dart AOT snapshots: '; + output += oldFile.isAnalyzeSizeFile + ? 'total size analyses: ' + : 'Dart AOT snapshots: '; output += oldFile.displayText; output += ' (OLD) vs (NEW) '; output += newFile.displayText; @@ -488,31 +484,30 @@ class _DiffViewState extends State with AutoDisposeMixin { return processing ? const CenteredMessage(message: AppSizeScreen.loadingMessage) : Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Expanded( - child: DualFileImportContainer( - firstFileTitle: 'Old', - secondFileTitle: 'New', - // TODO(kenz): perhaps bold "original" and "modified". - firstInstructions: DiffView.importOldInstructions, - secondInstructions: DiffView.importNewInstructions, - actionText: 'Analyze Diff', - gaScreen: gac.appSize, - gaSelectionImportFirst: gac.importFileDiffFirst, - gaSelectionImportSecond: gac.importFileDiffSecond, - gaSelectionAction: gac.analyzeDiff, - onAction: - (oldFile, newFile, onError) => - controller.loadDiffTreeFromJsonFiles( - oldFile: oldFile, - newFile: newFile, - onError: onError, - ), + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Expanded( + child: DualFileImportContainer( + firstFileTitle: 'Old', + secondFileTitle: 'New', + // TODO(kenz): perhaps bold "original" and "modified". + firstInstructions: DiffView.importOldInstructions, + secondInstructions: DiffView.importNewInstructions, + actionText: 'Analyze Diff', + gaScreen: gac.appSize, + gaSelectionImportFirst: gac.importFileDiffFirst, + gaSelectionImportSecond: gac.importFileDiffSecond, + gaSelectionAction: gac.analyzeDiff, + onAction: (oldFile, newFile, onError) => + controller.loadDiffTreeFromJsonFiles( + oldFile: oldFile, + newFile: newFile, + onError: onError, + ), + ), ), - ), - ], - ); + ], + ); }, ); } diff --git a/packages/devtools_app/lib/src/screens/app_size/app_size_table.dart b/packages/devtools_app/lib/src/screens/app_size/app_size_table.dart index 9c28f5c7627..0708b40ebdd 100644 --- a/packages/devtools_app/lib/src/screens/app_size/app_size_table.dart +++ b/packages/devtools_app/lib/src/screens/app_size/app_size_table.dart @@ -19,20 +19,18 @@ class AppSizeAnalysisTable extends StatelessWidget { required AppSizeController controller, }) { final treeColumn = _NameColumn( - currentRootLevel: - controller.isDeferredApp.value - ? rootNode.children.first.level - : rootNode.level, + currentRootLevel: controller.isDeferredApp.value + ? rootNode.children.first.level + : rootNode.level, ); final sizeColumn = _SizeColumn(); final columns = List>.unmodifiable([ treeColumn, sizeColumn, _SizePercentageColumn( - totalSize: - controller.isDeferredApp.value - ? rootNode.children[0].root.byteSize - : rootNode.root.byteSize, + totalSize: controller.isDeferredApp.value + ? rootNode.children[0].root.byteSize + : rootNode.root.byteSize, ), ]); @@ -65,8 +63,9 @@ class AppSizeAnalysisTable extends StatelessWidget { Widget build(BuildContext context) { return TreeTable( keyFactory: (node) => PageStorageKey(node.name), - dataRoots: - controller.isDeferredApp.value ? rootNode.children : [rootNode], + dataRoots: controller.isDeferredApp.value + ? rootNode.children + : [rootNode], dataKey: 'app-size-analysis', columns: columns, treeColumn: treeColumn, diff --git a/packages/devtools_app/lib/src/screens/app_size/code_size_attribution.dart b/packages/devtools_app/lib/src/screens/app_size/code_size_attribution.dart index 7bb60800838..b3c3668263a 100644 --- a/packages/devtools_app/lib/src/screens/app_size/code_size_attribution.dart +++ b/packages/devtools_app/lib/src/screens/app_size/code_size_attribution.dart @@ -64,13 +64,12 @@ class _CallGraphWithDominatorsState extends State { ], ), Expanded( - child: - showCallGraph - ? CallGraphView(node: widget.callGraphRoot) - : DominatorTree( - dominatorTreeRoot: dominatorTreeRoot, - selectedNode: widget.callGraphRoot, - ), + child: showCallGraph + ? CallGraphView(node: widget.callGraphRoot) + : DominatorTree( + dominatorTreeRoot: dominatorTreeRoot, + selectedNode: widget.callGraphRoot, + ), ), ], ); @@ -228,10 +227,9 @@ class _CallGraphTable extends StatelessWidget { Widget build(BuildContext context) { return FlatTable( keyFactory: (CallGraphNode node) => ValueKey(node), - data: - tableType == _CallGraphTableType.from - ? selectedNode.pred - : selectedNode.succ, + data: tableType == _CallGraphTableType.from + ? selectedNode.pred + : selectedNode.succ, dataKey: tableType.dataKey, columns: [tableColumn], onItemSelected: onNodeSelected, @@ -315,10 +313,9 @@ class _PackageColumn extends TreeColumnData { extension CallGraphNodeDisplay on CallGraphNode { String get display { - final displayText = - data is ProgramInfoNode - ? (data as ProgramInfoNode).qualifiedName - : data.toString(); + final displayText = data is ProgramInfoNode + ? (data as ProgramInfoNode).qualifiedName + : data.toString(); if (displayText == '@shared') { // Special case '@shared' because this is the name of the call graph root, // and '@root' has a more intuitive meaning. diff --git a/packages/devtools_app/lib/src/screens/debugger/breakpoint_manager.dart b/packages/devtools_app/lib/src/screens/debugger/breakpoint_manager.dart index 89e887d99b6..646fffa5d4b 100644 --- a/packages/devtools_app/lib/src/screens/debugger/breakpoint_manager.dart +++ b/packages/devtools_app/lib/src/screens/debugger/breakpoint_manager.dart @@ -225,10 +225,9 @@ class BreakpointManager with DisposerMixin { }) async { _breakpoints.value = breakpoints; // Build _breakpointsWithLocation from _breakpoints. - final breakpointsWithLocation = - await _breakpoints.value - .map(breakpointManager.createBreakpointWithLocation) - .wait; + final breakpointsWithLocation = await _breakpoints.value + .map(breakpointManager.createBreakpointWithLocation) + .wait; if (isolateId != _isolateRefId) { // Current request is obsolete. @@ -401,11 +400,10 @@ class BreakpointManager with DisposerMixin { // the restart. Note we only track hot restarts triggered by DevTools, // if a hot-restart was triggered by another client we won't know. // See https://github.com/flutter/flutter/issues/134470 - final hotRestartInProgress = - serviceConnection - .serviceManager - .isolateManager - .hotRestartInProgress; + final hotRestartInProgress = serviceConnection + .serviceManager + .isolateManager + .hotRestartInProgress; if (hotRestartInProgress) break; final breakpoint = event.breakpoint; diff --git a/packages/devtools_app/lib/src/screens/debugger/breakpoints.dart b/packages/devtools_app/lib/src/screens/debugger/breakpoints.dart index 9886db476a8..c5394f1779e 100644 --- a/packages/devtools_app/lib/src/screens/debugger/breakpoints.dart +++ b/packages/devtools_app/lib/src/screens/debugger/breakpoints.dart @@ -88,10 +88,9 @@ class _Breakpoint extends StatelessWidget { children: [ TextSpan( text: ' (${breakpoint.scriptUri})', - style: - isSelected - ? theme.selectedSubtleTextStyle - : theme.subtleTextStyle, + style: isSelected + ? theme.selectedSubtleTextStyle + : theme.subtleTextStyle, ), ], ), diff --git a/packages/devtools_app/lib/src/screens/debugger/call_stack.dart b/packages/devtools_app/lib/src/screens/debugger/call_stack.dart index 9fc750781e1..eaa2d239982 100644 --- a/packages/devtools_app/lib/src/screens/debugger/call_stack.dart +++ b/packages/devtools_app/lib/src/screens/debugger/call_stack.dart @@ -93,10 +93,9 @@ class _CallStackState extends State { if (locationDescription != null) TextSpan( text: ' $locationDescription', - style: - selected - ? theme.selectedSubtleTextStyle - : theme.subtleTextStyle, + style: selected + ? theme.selectedSubtleTextStyle + : theme.subtleTextStyle, ), ], ), @@ -120,13 +119,12 @@ class _CallStackState extends State { return isAsyncBreak ? result : DevToolsTooltip( - message: - locationDescription == null - ? frameDescription - : '$frameDescription $locationDescription', - waitDuration: tooltipWaitLong, - child: result, - ); + message: locationDescription == null + ? frameDescription + : '$frameDescription $locationDescription', + waitDuration: tooltipWaitLong, + child: result, + ); } Future _onStackFrameSelected(StackFrameAndSourcePosition frame) async { diff --git a/packages/devtools_app/lib/src/screens/debugger/codeview.dart b/packages/devtools_app/lib/src/screens/debugger/codeview.dart index 841aba57f40..600d5aeb8a5 100644 --- a/packages/devtools_app/lib/src/screens/debugger/codeview.dart +++ b/packages/devtools_app/lib/src/screens/debugger/codeview.dart @@ -249,8 +249,8 @@ class _CodeViewState extends State with AutoDisposeMixin { verticalController.hasAttachedControllers ? updateScrollPositionImpl() : WidgetsBinding.instance.addPostFrameCallback( - (_) => updateScrollPositionImpl(), - ); + (_) => updateScrollPositionImpl(), + ); } @override @@ -331,8 +331,8 @@ class _CodeViewState extends State with AutoDisposeMixin { thumbVisibility: true, // Only listen for vertical scroll notifications (ignore those // from the nested horizontal SingleChildScrollView): - notificationPredicate: - (ScrollNotification notification) => notification.depth == 1, + notificationPredicate: (ScrollNotification notification) => + notification.depth == 1, child: ValueListenableBuilder( valueListenable: widget.debuggerController?.selectedStackFrame ?? @@ -340,8 +340,9 @@ class _CodeViewState extends State with AutoDisposeMixin { null, ), builder: (context, frame, _) { - final pausedFrame = - frame?.scriptRef == scriptRef ? frame : null; + final pausedFrame = frame?.scriptRef == scriptRef + ? frame + : null; return ValueListenableBuilder( valueListenable: @@ -370,9 +371,8 @@ class _CodeViewState extends State with AutoDisposeMixin { ); return Scrollbar( - key: - CodeView - .debuggerCodeViewHorizontalScrollbarKey, + key: CodeView + .debuggerCodeViewHorizontalScrollbarKey, thumbVisibility: true, controller: horizontalController, child: SingleChildScrollView( @@ -390,18 +390,15 @@ class _CodeViewState extends State with AutoDisposeMixin { widget.codeViewController, scrollController: textController, lines: lines, - selectedFrameNotifier: - widget - .debuggerController - ?.selectedStackFrame, - searchMatchesNotifier: - widget - .codeViewController - .searchMatches, - activeSearchMatchNotifier: - widget - .codeViewController - .activeSearchMatch, + selectedFrameNotifier: widget + .debuggerController + ?.selectedStackFrame, + searchMatchesNotifier: widget + .codeViewController + .searchMatches, + activeSearchMatchNotifier: widget + .codeViewController + .activeSearchMatch, showProfileInformation: showProfileInformation, ), @@ -438,11 +435,9 @@ class _CodeViewState extends State with AutoDisposeMixin { return scriptUri; }, titleIcon: Icons.search, - onTitleTap: - () => - widget.codeViewController - ..toggleFileOpenerVisibility(true) - ..toggleSearchInFileVisibility(false), + onTitleTap: () => widget.codeViewController + ..toggleFileOpenerVisibility(true) + ..toggleSearchInFileVisibility(false), controls: [ ScriptPopupMenu(widget.codeViewController), ScriptHistoryPopupMenu( @@ -482,8 +477,8 @@ class _CodeViewState extends State with AutoDisposeMixin { searchFieldEnabled: parsedScript != null, shouldRequestFocus: true, searchFieldWidth: wideSearchFieldWidth, - onClose: - () => widget.codeViewController.toggleSearchInFileVisibility(false), + onClose: () => + widget.codeViewController.toggleSearchInFileVisibility(false), ), ); } @@ -533,8 +528,8 @@ class CodeViewEmptyState extends StatelessWidget { return Center( child: ElevatedButton( autofocus: true, - onPressed: - () => widget.codeViewController.toggleFileOpenerVisibility(true), + onPressed: () => + widget.codeViewController.toggleFileOpenerVisibility(true), child: Text( 'Open a file ($openFileKeySetDescription)', style: theme.textTheme.titleMedium, @@ -785,8 +780,9 @@ class Gutters extends StatelessWidget { lineCount: lineCount, lineOffset: lineOffset, pausedFrame: pausedFrame, - breakpoints: - breakpoints.where((bp) => bp.scriptRef == scriptRef).toList(), + breakpoints: breakpoints + .where((bp) => bp.scriptRef == scriptRef) + .toList(), executableLines: parsedScript?.executableLines ?? const {}, sourceReport: sourceReport, onPressed: _onPressed, @@ -800,14 +796,14 @@ class Gutters extends StatelessWidget { !showProfileInformation ? const SizedBox(width: denseSpacing) : Padding( - padding: const EdgeInsets.only(right: denseSpacing), - child: ProfileInformationGutter( - scrollController: profileController!, - lineCount: lineCount, - lineOffset: lineOffset, - sourceReport: sourceReport, + padding: const EdgeInsets.only(right: denseSpacing), + child: ProfileInformationGutter( + scrollController: profileController!, + lineCount: lineCount, + lineOffset: lineOffset, + sourceReport: sourceReport, + ), ), - ), ], ); } @@ -939,10 +935,9 @@ class GutterItem extends StatelessWidget { TextStyle? coverageTextStyleOverride; final hasCoverage = coverageHit; if (hasCoverage != null) { - color = - hasCoverage - ? theme.colorScheme.coverageHitColor - : theme.colorScheme.coverageMissColor; + color = hasCoverage + ? theme.colorScheme.coverageHitColor + : theme.colorScheme.coverageMissColor; coverageTextStyleOverride = theme.regularTextStyleWithColor( theme.colorScheme.coverageAndPerformanceTextColor, ); @@ -1068,8 +1063,9 @@ class _LinesState extends State with AutoDisposeMixin { // the top of the profiler gutter columns. Everything needs to be shifted // down a single line so profiling information for line 1 isn't hidden by // the header. - final profileInformationHeaderOffset = - widget.showProfileInformation ? 1 : 0; + final profileInformationHeaderOffset = widget.showProfileInformation + ? 1 + : 0; return SelectionArea( child: ListView.builder( @@ -1093,10 +1089,9 @@ class _LinesState extends State with AutoDisposeMixin { pausedFrame: isPausedLine ? pausedFrame : null, focused: isPausedLine || isFocusedLine, searchMatches: _searchMatchesForLine(dataIndex), - activeSearchMatch: - activeSearch?.position.line == dataIndex - ? activeSearch - : null, + activeSearchMatch: activeSearch?.position.line == dataIndex + ? activeSearch + : null, ); }, ); @@ -1208,8 +1203,9 @@ class LineItem extends StatelessWidget { ); } - final backgroundColor = - focused ? theme.colorScheme.selectedRowBackgroundColor : null; + final backgroundColor = focused + ? theme.colorScheme.selectedRowBackgroundColor + : null; return Container( alignment: Alignment.centerLeft, @@ -1252,12 +1248,11 @@ class _HoverableLine extends StatelessWidget { if (word.isNotEmpty && !isPrimitiveValueOrNull(word)) { try { final response = await evalService.evalAtCurrentFrame(word); - final isolateRef = - serviceConnection - .serviceManager - .isolateManager - .selectedIsolate - .value; + final isolateRef = serviceConnection + .serviceManager + .isolateManager + .selectedIsolate + .value; if (response is! InstanceRef) return null; final variable = DartObjectNode.fromValue( value: response, @@ -1413,15 +1408,14 @@ class ScriptPopupMenu extends StatelessWidget { Widget build(BuildContext context) { return PopupMenuButton( onSelected: (option) => option.onSelected(context, _controller), - itemBuilder: - (_) => [ - for (final menuOption in defaultScriptPopupMenuOptions) - menuOption.build(), - for (final extensionMenuOption - in devToolsEnvironmentParameters - .buildExtraDebuggerScriptPopupMenuOptions()) - extensionMenuOption.build(), - ], + itemBuilder: (_) => [ + for (final menuOption in defaultScriptPopupMenuOptions) + menuOption.build(), + for (final extensionMenuOption + in devToolsEnvironmentParameters + .buildExtraDebuggerScriptPopupMenuOptions()) + extensionMenuOption.build(), + ], child: Icon(Icons.more_vert, size: actionsIconSize), ); } @@ -1494,12 +1488,9 @@ final defaultScriptPopupMenuOptions = [ final copyPackagePathOption = ScriptPopupMenuOption( label: 'Copy package path', icon: Icons.content_copy, - onSelected: - (_, controller) => Clipboard.setData( - ClipboardData( - text: controller.scriptLocation.value?.scriptRef.uri ?? '', - ), - ), + onSelected: (_, controller) => Clipboard.setData( + ClipboardData(text: controller.scriptLocation.value?.scriptRef.uri ?? ''), + ), ); final copyFilePathOption = ScriptPopupMenuOption( @@ -1520,13 +1511,12 @@ Future fetchScriptLocationFullFilePath( String? filePath; final packagePath = controller.scriptLocation.value!.scriptRef.uri; if (packagePath != null) { - final isolateId = - serviceConnection - .serviceManager - .isolateManager - .selectedIsolate - .value! - .id!; + final isolateId = serviceConnection + .serviceManager + .isolateManager + .selectedIsolate + .value! + .id!; filePath = serviceConnection.serviceManager.resolvedUriManager .lookupFileUri(isolateId, packagePath); if (filePath == null) { diff --git a/packages/devtools_app/lib/src/screens/debugger/codeview_controller.dart b/packages/devtools_app/lib/src/screens/debugger/codeview_controller.dart index f5fc5748754..a937cf826e1 100644 --- a/packages/devtools_app/lib/src/screens/debugger/codeview_controller.dart +++ b/packages/devtools_app/lib/src/screens/debugger/codeview_controller.dart @@ -390,14 +390,13 @@ class CodeViewController extends DisposableController void _maybeShowSourceMapsWarning() { final isWebApp = serviceConnection.serviceManager.connectedApp?.isDartWebAppNow ?? false; - final enableSourceMapsLink = - devToolsEnvironmentParameters.enableSourceMapsLink(); + final enableSourceMapsLink = devToolsEnvironmentParameters + .enableSourceMapsLink(); if (isWebApp && enableSourceMapsLink != null) { final enableSourceMapsAction = NotificationAction( label: 'Enable sourcemaps', - onPressed: - () => - unawaited(launchUrlWithErrorHandling(enableSourceMapsLink.url)), + onPressed: () => + unawaited(launchUrlWithErrorHandling(enableSourceMapsLink.url)), ); notificationService.pushNotification( NotificationMessage( diff --git a/packages/devtools_app/lib/src/screens/debugger/controls.dart b/packages/devtools_app/lib/src/screens/debugger/controls.dart index 0c32662fd11..ec4f7cb70f8 100644 --- a/packages/devtools_app/lib/src/screens/debugger/controls.dart +++ b/packages/devtools_app/lib/src/screens/debugger/controls.dart @@ -98,24 +98,24 @@ class _DebuggingControlsState extends State items: [ !isPaused ? ButtonGroupItemData( - tooltip: 'Pause', - icon: Icons.pause, - autofocus: true, - // Disable when selected isolate is a system isolate. - onPressed: - isSystemIsolate ? null : () => unawaited(controller.pause()), - ) + tooltip: 'Pause', + icon: Icons.pause, + autofocus: true, + // Disable when selected isolate is a system isolate. + onPressed: isSystemIsolate + ? null + : () => unawaited(controller.pause()), + ) : ButtonGroupItemData( - tooltip: 'Resume', - iconAsset: 'icons/material_symbols/resume.png', - iconSize: DebuggingControls.materialIconSize, - // Enable not resuming and selected isolate is not a system - // isolate. - onPressed: - (!resuming && !isSystemIsolate) - ? () => unawaited(controller.resume()) - : null, - ), + tooltip: 'Resume', + iconAsset: 'icons/material_symbols/resume.png', + iconSize: DebuggingControls.materialIconSize, + // Enable not resuming and selected isolate is not a system + // isolate. + onPressed: (!resuming && !isSystemIsolate) + ? () => unawaited(controller.resume()) + : null, + ), ], ); } @@ -156,10 +156,9 @@ class _DebuggingControlsState extends State label: 'File Explorer', onPressed: controller.codeViewController.toggleLibrariesVisible, gaScreen: gac.debugger, - gaSelection: - visible - ? gac.DebuggerEvents.hideFileExplorer.name - : gac.DebuggerEvents.showFileExplorer.name, + gaSelection: visible + ? gac.DebuggerEvents.hideFileExplorer.name + : gac.DebuggerEvents.showFileExplorer.name, minScreenWidthForTextBeforeScaling: DebuggingControls.minWidthBeforeScaling, ); @@ -213,12 +212,11 @@ class CodeStatisticsControls extends StatelessWidget { tooltip: 'Refresh statistics', gaScreen: gac.debugger, gaSelection: gac.DebuggerEvents.refreshStatistics.name, - onPressed: - showCodeCoverage || showProfileInformation - ? () => unawaited( - controller.codeViewController.refreshCodeStatistics(), - ) - : null, + onPressed: showCodeCoverage || showProfileInformation + ? () => unawaited( + controller.codeViewController.refreshCodeStatistics(), + ) + : null, ), ], ); @@ -264,12 +262,11 @@ class BreakOnExceptionsControl extends StatelessWidget { child: RoundedDropDownButton( value: exceptionMode, // Cannot set exception pause mode for system isolates. - onChanged: - controller.isSystemIsolate - ? null - : (ExceptionMode? mode) { - unawaited(controller.setIsolatePauseMode(mode!.id)); - }, + onChanged: controller.isSystemIsolate + ? null + : (ExceptionMode? mode) { + unawaited(controller.setIsolatePauseMode(mode!.id)); + }, isDense: true, items: [ for (final mode in ExceptionMode.modes) diff --git a/packages/devtools_app/lib/src/screens/debugger/debugger_controller.dart b/packages/devtools_app/lib/src/screens/debugger/debugger_controller.dart index d69ebc1ee42..fceb7d332ad 100644 --- a/packages/devtools_app/lib/src/screens/debugger/debugger_controller.dart +++ b/packages/devtools_app/lib/src/screens/debugger/debugger_controller.dart @@ -271,10 +271,9 @@ class DebuggerController extends DevToolsScreenController return _service .resume( _isolateRefId, - step: - useAsyncStepping - ? StepOption.kOverAsyncSuspension - : StepOption.kOver, + step: useAsyncStepping + ? StepOption.kOverAsyncSuspension + : StepOption.kOver, ) .whenComplete(() => _debugTimingLog.log('stepOver() completed')); } @@ -595,10 +594,9 @@ class DebuggerController extends DevToolsScreenController return []; } - final variables = - frame.vars! - .map((v) => DartObjectNode.create(v, _isolate.value)) - .toList(); + final variables = frame.vars! + .map((v) => DartObjectNode.create(v, _isolate.value)) + .toList(); // TODO(jacobr): would be nice to be able to remove this call to unawaited // but it would require a significant refactor. variables @@ -631,13 +629,12 @@ class DebuggerController extends DevToolsScreenController } Future _fetchDapFrame(Frame vmFrame) async { - final isolateNumber = - serviceConnection - .serviceManager - .isolateManager - .selectedIsolate - .value - ?.number; + final isolateNumber = serviceConnection + .serviceManager + .isolateManager + .selectedIsolate + .value + ?.number; final frameIndex = vmFrame.index; if (isolateNumber == null || frameIndex == null) return null; @@ -675,8 +672,8 @@ class DebuggerController extends DevToolsScreenController // Prefer asyncCausalFrames if they exist. List frames = asyncCausalFrames != null && asyncCausalFrames.isNotEmpty - ? asyncCausalFrames - : stackFrames; + ? asyncCausalFrames + : stackFrames; // Include any reported exception as a variable in the first frame. if (reportedException != null && frames.isNotEmpty) { diff --git a/packages/devtools_app/lib/src/screens/debugger/debugger_screen.dart b/packages/devtools_app/lib/src/screens/debugger/debugger_screen.dart index ad0bddfa29d..f7d80c89c52 100644 --- a/packages/devtools_app/lib/src/screens/debugger/debugger_screen.dart +++ b/packages/devtools_app/lib/src/screens/debugger/debugger_screen.dart @@ -189,10 +189,11 @@ class DebuggerWindows extends StatelessWidget { actions: [ CopyToClipboardControl( dataProvider: () { - final callStackList = - controller.stackFramesWithLocation.value - .map((frame) => frame.callStackDisplay) - .toList(); + final callStackList = controller + .stackFramesWithLocation + .value + .map((frame) => frame.callStackDisplay) + .toList(); for (var i = 0; i < callStackList.length; i++) { callStackList[i] = '#$i ${callStackList[i]}'; } @@ -235,10 +236,9 @@ class _BreakpointsWindowActions extends StatelessWidget { child: ToolbarAction( icon: Icons.delete, size: defaultIconSize, - onPressed: - breakpoints.isNotEmpty - ? () => unawaited(breakpointManager.clearBreakpoints()) - : null, + onPressed: breakpoints.isNotEmpty + ? () => unawaited(breakpointManager.clearBreakpoints()) + : null, ), ), ], @@ -285,8 +285,8 @@ class DebuggerSourceAndControls extends StatelessWidget { child: ProgramExplorer( controller: codeViewController.programExplorerController, - onNodeSelected: - (node) => _onNodeSelected(context, node), + onNodeSelected: (node) => + _onNodeSelected(context, node), ), ), ], @@ -321,10 +321,9 @@ class DebuggerSourceAndControls extends StatelessWidget { debuggerController: controller, scriptRef: scriptRef, parsedScript: parsedScript, - onSelected: - (script, line) => unawaited( - breakpointManager.toggleBreakpoint(script, line), - ), + onSelected: (script, line) => unawaited( + breakpointManager.toggleBreakpoint(script, line), + ), ); }, ), diff --git a/packages/devtools_app/lib/src/screens/debugger/file_search.dart b/packages/devtools_app/lib/src/screens/debugger/file_search.dart index 2e321e077aa..f32f6e5f769 100644 --- a/packages/devtools_app/lib/src/screens/debugger/file_search.dart +++ b/packages/devtools_app/lib/src/screens/debugger/file_search.dart @@ -92,10 +92,9 @@ class FileSearchFieldState extends State // If the current query is a continuation of the previous query, then // filter down the previous matches. Otherwise search through all scripts: - final scripts = - currentQuery.startsWith(previousQuery) - ? _searchResults.scriptRefs - : scriptManager.sortedScripts.value; + final scripts = currentQuery.startsWith(previousQuery) + ? _searchResults.scriptRefs + : scriptManager.sortedScripts.value; final searchResults = _createSearchResults(currentQuery, scripts); if (searchResults.scriptRefs.isEmpty) { @@ -192,13 +191,12 @@ class FileQuery { final fileName = _fileName(scriptUri); final fileNameIndex = scriptUri.lastIndexOf(fileName); - final matchedSegments = - _findExactSegments(fileName) - .map( - (range) => - Range(range.begin + fileNameIndex, range.end + fileNameIndex), - ) - .toList(); + final matchedSegments = _findExactSegments(fileName) + .map( + (range) => + Range(range.begin + fileNameIndex, range.end + fileNameIndex), + ) + .toList(); return AutoCompleteMatch(scriptUri, matchedSegments: matchedSegments); } @@ -245,15 +243,12 @@ class FileQuery { } else { final fileName = _fileName(scriptUri); final fileNameIndex = scriptUri.lastIndexOf(fileName); - matchedSegments = - _findFuzzySegments(fileName, query) - .map( - (range) => Range( - range.begin + fileNameIndex, - range.end + fileNameIndex, - ), - ) - .toList(); + matchedSegments = _findFuzzySegments(fileName, query) + .map( + (range) => + Range(range.begin + fileNameIndex, range.end + fileNameIndex), + ) + .toList(); } return AutoCompleteMatch(scriptUri, matchedSegments: matchedSegments); @@ -350,27 +345,21 @@ class FileSearchResults { FileSearchResults get topMatches => _buildTopMatches(); - List get scriptRefs => - query.isEmpty - ? allScripts - : [ - ..._exactFileNameMatches, - ..._exactFullPathMatches, - ..._fuzzyMatches, - ]; - - List get autoCompleteMatches => - query.isEmpty - ? allScripts.map((script) => AutoCompleteMatch(script.uri!)).toList() - : [ - ..._exactFileNameMatches.map( - query.createExactFileNameAutoCompleteMatch, - ), - ..._exactFullPathMatches.map( - query.createExactFullPathAutoCompleteMatch, - ), - ..._fuzzyMatches.map(query.createFuzzyMatchAutoCompleteMatch), - ]; + List get scriptRefs => query.isEmpty + ? allScripts + : [..._exactFileNameMatches, ..._exactFullPathMatches, ..._fuzzyMatches]; + + List get autoCompleteMatches => query.isEmpty + ? allScripts.map((script) => AutoCompleteMatch(script.uri!)).toList() + : [ + ..._exactFileNameMatches.map( + query.createExactFileNameAutoCompleteMatch, + ), + ..._exactFullPathMatches.map( + query.createExactFullPathAutoCompleteMatch, + ), + ..._fuzzyMatches.map(query.createFuzzyMatchAutoCompleteMatch), + ]; FileSearchResults copyWith({ List? allScripts, diff --git a/packages/devtools_app/lib/src/screens/debugger/program_explorer.dart b/packages/devtools_app/lib/src/screens/debugger/program_explorer.dart index e0efbc2741a..dc602fa7ac6 100644 --- a/packages/devtools_app/lib/src/screens/debugger/program_explorer.dart +++ b/packages/devtools_app/lib/src/screens/debugger/program_explorer.dart @@ -243,35 +243,33 @@ class ProgramStructureIcon extends StatelessWidget { height: defaultIconSize, width: defaultIconSize, child: Container( - decoration: - icon == null - ? BoxDecoration(color: color, shape: BoxShape.circle) - : null, - child: - icon == null - ? Center( - child: Text( - character!, - style: TextStyle( - height: 1, - fontFamily: theme.fixedFontStyle.fontFamily, - color: theme.colorScheme.surface, - fontSize: smallFontSize, - ), - // Required to center the individual character within the - // shape. Since letters like 'm' are shorter than letters - // like 'f', there's padding applied to the top of shorter - // characters in order for everything to align properly. - // Since we're only dealing with individual characters, we - // want to disable this behavior so shorter characters don't - // appear to be slightly below center. - textHeightBehavior: TextHeightBehavior( - applyHeightToFirstAscent: isShortCharacter!, - applyHeightToLastDescent: false, - ), + decoration: icon == null + ? BoxDecoration(color: color, shape: BoxShape.circle) + : null, + child: icon == null + ? Center( + child: Text( + character!, + style: TextStyle( + height: 1, + fontFamily: theme.fixedFontStyle.fontFamily, + color: theme.colorScheme.surface, + fontSize: smallFontSize, ), - ) - : Icon(icon, size: defaultIconSize, color: color), + // Required to center the individual character within the + // shape. Since letters like 'm' are shorter than letters + // like 'f', there's padding applied to the top of shorter + // characters in order for everything to align properly. + // Since we're only dealing with individual characters, we + // want to disable this behavior so shorter characters don't + // appear to be slightly below center. + textHeightBehavior: TextHeightBehavior( + applyHeightToFirstAscent: isShortCharacter!, + applyHeightToLastDescent: false, + ), + ), + ) + : Icon(icon, size: defaultIconSize, color: color), ), ); } @@ -297,9 +295,8 @@ class _FileExplorerState extends State<_FileExplorer> with AutoDisposeMixin { double get selectedNodeOffset => widget.controller.selectedNodeIndex.value == -1 - ? -1 - : widget.controller.selectedNodeIndex.value * - defaultTreeViewRowHeight; + ? -1 + : widget.controller.selectedNodeIndex.value * defaultTreeViewRowHeight; @override void initState() { @@ -390,8 +387,8 @@ class _ProgramOutlineView extends StatelessWidget { }, ); }, - emptyTreeViewBuilder: - () => const Center(child: Text('Nothing to inspect')), + emptyTreeViewBuilder: () => + const Center(child: Text('Nothing to inspect')), ); }, ); @@ -423,14 +420,13 @@ class ProgramExplorer extends StatelessWidget { if (!initialized) { body = const CenteredCircularProgressIndicator(); } else { - final fileExplorerHeader = - displayHeader - ? AreaPaneHeader( - title: Text(title), - includeTopBorder: false, - roundedTopBorder: false, - ) - : const BlankHeader(); + final fileExplorerHeader = displayHeader + ? AreaPaneHeader( + title: Text(title), + includeTopBorder: false, + roundedTopBorder: false, + ) + : const BlankHeader(); final fileExplorer = _FileExplorer( controller: controller, onItemExpanded: onItemExpanded, @@ -452,31 +448,31 @@ class ProgramExplorer extends StatelessWidget { .connectedApp! .isDartWebAppNow! ? Column( - children: [ - fileExplorerHeader, - Expanded(child: fileExplorer), - ], - ) + children: [ + fileExplorerHeader, + Expanded(child: fileExplorer), + ], + ) : FlexSplitColumn( - totalHeight: constraints.maxHeight, - initialFractions: const [0.7, 0.3], - minSizes: const [0.0, 0.0], - headers: [ - fileExplorerHeader as PreferredSizeWidget, - const AreaPaneHeader( - title: Text('Outline'), - roundedTopBorder: false, - ), - ], - children: [ - fileExplorer, - _ProgramOutlineView( - controller: controller, - onItemExpanded: onItemExpanded, - onItemSelected: onItemSelected, - ), - ], - ); + totalHeight: constraints.maxHeight, + initialFractions: const [0.7, 0.3], + minSizes: const [0.0, 0.0], + headers: [ + fileExplorerHeader as PreferredSizeWidget, + const AreaPaneHeader( + title: Text('Outline'), + roundedTopBorder: false, + ), + ], + children: [ + fileExplorer, + _ProgramOutlineView( + controller: controller, + onItemExpanded: onItemExpanded, + onItemSelected: onItemSelected, + ), + ], + ); }, ); } diff --git a/packages/devtools_app/lib/src/screens/debugger/program_explorer_controller.dart b/packages/devtools_app/lib/src/screens/debugger/program_explorer_controller.dart index edf32167ce9..09ad5b74983 100644 --- a/packages/devtools_app/lib/src/screens/debugger/program_explorer_controller.dart +++ b/packages/devtools_app/lib/src/screens/debugger/program_explorer_controller.dart @@ -71,13 +71,12 @@ class ProgramExplorerController extends DisposableController final isolate = serviceConnection.serviceManager.isolateManager.selectedIsolate.value; - final libraries = - isolate != null - ? serviceConnection.serviceManager.isolateManager - .isolateState(isolate) - .isolateNow! - .libraries! - : []; + final libraries = isolate != null + ? serviceConnection.serviceManager.isolateManager + .isolateState(isolate) + .isolateNow! + .libraries! + : []; if (scriptManager.sortedScripts.value.isEmpty && isolate != null) { await scriptManager.retrieveAndSortScripts(isolate); @@ -143,10 +142,9 @@ class ProgramExplorerController extends DisposableController final matchingNode = depthFirstTraversal( node, returnCondition: matchingNodeCondition, - exploreChildrenCondition: - includeCollapsedNodes - ? null - : (VMServiceObjectNode node) => node.isExpanded, + exploreChildrenCondition: includeCollapsedNodes + ? null + : (VMServiceObjectNode node) => node.isExpanded, action: (VMServiceObjectNode _) => index++, ); if (matchingNode != null) return index; @@ -245,13 +243,12 @@ class ProgramExplorerController extends DisposableController Future populateNode(VMServiceObjectNode node) async { final object = node.object; final service = serviceConnection.serviceManager.service; - final isolateId = - serviceConnection - .serviceManager - .isolateManager - .selectedIsolate - .value! - .id; + final isolateId = serviceConnection + .serviceManager + .isolateManager + .selectedIsolate + .value! + .id; Future> getObjects(Iterable objs) { return objs.map((o) => service!.getObject(isolateId!, o.id!)).wait; @@ -299,21 +296,19 @@ class ProgramExplorerController extends DisposableController return; } else if (object is LibraryRef) { final lib = await service!.getObject(isolateId!, object.id!) as Library; - final (variableObjects, functionObjects) = - await ( - getObjects(lib.variables!), - getFuncs(lib.functions!, lib.variables), - ).wait; + final (variableObjects, functionObjects) = await ( + getObjects(lib.variables!), + getFuncs(lib.functions!, lib.variables), + ).wait; lib.variables = variableObjects.cast(); lib.functions = functionObjects; node.updateObject(lib); } else if (object is ClassRef) { final clazz = await service!.getObject(isolateId!, object.id!) as Class; - final (fieldObjects, functionObjects) = - await ( - getObjects(clazz.fields!), - getFuncs(clazz.functions!, clazz.fields), - ).wait; + final (fieldObjects, functionObjects) = await ( + getObjects(clazz.fields!), + getFuncs(clazz.functions!, clazz.fields), + ).wait; clazz.fields = fieldObjects.cast(); clazz.functions = functionObjects; node.updateObject(clazz); @@ -330,13 +325,12 @@ class ProgramExplorerController extends DisposableController /// which is the source location of the target [object]. Future searchFileExplorer(ObjRef object) async { final service = serviceConnection.serviceManager.service!; - final isolateId = - serviceConnection - .serviceManager - .isolateManager - .selectedIsolate - .value! - .id!; + final isolateId = serviceConnection + .serviceManager + .isolateManager + .selectedIsolate + .value! + .id!; // If `object` is a library, it will always be a root node and is simple to // find. diff --git a/packages/devtools_app/lib/src/screens/debugger/program_explorer_model.dart b/packages/devtools_app/lib/src/screens/debugger/program_explorer_model.dart index e21f7608ff9..d39907f1a6c 100644 --- a/packages/devtools_app/lib/src/screens/debugger/program_explorer_model.dart +++ b/packages/devtools_app/lib/src/screens/debugger/program_explorer_model.dart @@ -80,12 +80,11 @@ class VMServiceObjectNode extends TreeNode { // script's URI. if (libNode == null) { final service = serviceConnection.serviceManager.service!; - final isolate = - serviceConnection - .serviceManager - .isolateManager - .selectedIsolate - .value!; + final isolate = serviceConnection + .serviceManager + .isolateManager + .selectedIsolate + .value!; final libRef = serviceConnection.serviceManager.isolateManager .isolateState(isolate) .isolateNow! @@ -168,10 +167,9 @@ class VMServiceObjectNode extends TreeNode { // Clear out the _childrenAsMap map. root._trimChildrenAsMapEntries(); - final processed = - root.children - .map((e) => e._collapseSingleChildDirectoryNodes()) - .toList(); + final processed = root.children + .map((e) => e._collapseSingleChildDirectoryNodes()) + .toList(); root.children.clear(); root.addAllChildren(processed); @@ -185,14 +183,13 @@ class VMServiceObjectNode extends TreeNode { // Place the root library's parent node at the top of the explorer if it's // part of a package. Otherwise, it's a file path and its directory should // appear near the top of the list anyway. - final rootLibUri = - serviceConnection - .serviceManager - .isolateManager - .mainIsolateState - ?.isolateNow - ?.rootLib - ?.uri; + final rootLibUri = serviceConnection + .serviceManager + .isolateManager + .mainIsolateState + ?.isolateNow + ?.rootLib + ?.uri; if (rootLibUri != null) { if (rootLibUri.startsWith('package:') || rootLibUri.startsWith('google3:')) { @@ -301,8 +298,9 @@ class VMServiceObjectNode extends TreeNode { } return this; } - final updated = - children.map((e) => e._collapseSingleChildDirectoryNodes()).toList(); + final updated = children + .map((e) => e._collapseSingleChildDirectoryNodes()) + .toList(); children.clear(); addAllChildren(updated); return this; @@ -344,10 +342,9 @@ class VMServiceObjectNode extends TreeNode { if (scriptRef != null) { final fetchedScript = await scriptManager.getScript(scriptRef); - final position = - tokenPos == 0 - ? null - : SourcePosition.calculatePosition(fetchedScript!, tokenPos!); + final position = tokenPos == 0 + ? null + : SourcePosition.calculatePosition(fetchedScript!, tokenPos!); location = ScriptLocation(scriptRef, location: position); } diff --git a/packages/devtools_app/lib/src/screens/debugger/span_parser.dart b/packages/devtools_app/lib/src/screens/debugger/span_parser.dart index d5f80668b7d..c6d3511458c 100644 --- a/packages/devtools_app/lib/src/screens/debugger/span_parser.dart +++ b/packages/devtools_app/lib/src/screens/debugger/span_parser.dart @@ -165,9 +165,8 @@ class ScopeSpan { /// using the 'includes' keyword. class Repository { Repository.build(Map grammarJson) { - final repositoryJson = - (grammarJson['repository'] as Map?) - ?.cast>(); + final repositoryJson = (grammarJson['repository'] as Map?) + ?.cast>(); if (repositoryJson == null) { return; } @@ -259,9 +258,8 @@ abstract class GrammarMatcher { class _SimpleMatcher extends GrammarMatcher { _SimpleMatcher(super.json) : match = RegExp(json['match'] as String, multiLine: true), - captures = - (json['captures'] as Map?) - ?.cast>(), + captures = (json['captures'] as Map?) + ?.cast>(), super._(); static bool isType(Map json) { @@ -299,21 +297,18 @@ class _MultilineMatcher extends GrammarMatcher { : begin = RegExp(json['begin'] as String, multiLine: true), beginCaptures = json['beginCaptures'] as Map?, contentName = json['contentName'] as String?, - end = - json['end'] == null - ? null - : RegExp(json['end'] as String, multiLine: true), + end = json['end'] == null + ? null + : RegExp(json['end'] as String, multiLine: true), endCaptures = json['endCaptures'] as Map?, captures = json['captures'] as Map?, - whileCond = - json['while'] == null - ? null - : RegExp(json['while'] as String, multiLine: true), - patterns = - (json['patterns'] as List?) - ?.cast>() - .map((e) => GrammarMatcher.fromJson(e)) - .toList(), + whileCond = json['while'] == null + ? null + : RegExp(json['while'] as String, multiLine: true), + patterns = (json['patterns'] as List?) + ?.cast>() + .map((e) => GrammarMatcher.fromJson(e)) + .toList(), super._(); static bool isType(Map json) { @@ -523,11 +518,10 @@ class _MultilineMatcher extends GrammarMatcher { class _PatternMatcher extends GrammarMatcher { _PatternMatcher(super.json) - : patterns = - (json['patterns'] as List?) - ?.cast>() - .map((e) => GrammarMatcher.fromJson(e)) - .toList(), + : patterns = (json['patterns'] as List?) + ?.cast>() + .map((e) => GrammarMatcher.fromJson(e)) + .toList(), super._(); static bool isType(Map json) { diff --git a/packages/devtools_app/lib/src/screens/debugger/variables.dart b/packages/devtools_app/lib/src/screens/debugger/variables.dart index 14a7be86e7a..3c0dde1631e 100644 --- a/packages/devtools_app/lib/src/screens/debugger/variables.dart +++ b/packages/devtools_app/lib/src/screens/debugger/variables.dart @@ -35,9 +35,8 @@ class Variables extends StatelessWidget { } else { return TreeView( dataRootsListenable: serviceConnection.appState.variables, - dataDisplayProvider: - (variable, onPressed) => - DisplayProvider(variable: variable, onTap: onPressed), + dataDisplayProvider: (variable, onPressed) => + DisplayProvider(variable: variable, onTap: onPressed), onItemSelected: onItemPressed, ); } diff --git a/packages/devtools_app/lib/src/screens/deep_link_validation/deep_link_list_view.dart b/packages/devtools_app/lib/src/screens/deep_link_validation/deep_link_list_view.dart index bcecc8e937d..cb10ad51f2f 100644 --- a/packages/devtools_app/lib/src/screens/deep_link_validation/deep_link_list_view.dart +++ b/packages/devtools_app/lib/src/screens/deep_link_validation/deep_link_list_view.dart @@ -37,9 +37,8 @@ class _DeepLinkListViewState extends State { @override void initState() { super.initState(); - controller = - screenControllers.lookup() - ..firstLoadWithDefaultConfigurations(); + controller = screenControllers.lookup() + ..firstLoadWithDefaultConfigurations(); } @override @@ -143,23 +142,22 @@ class _ValidatedDeepLinksView extends StatelessWidget { Expanded( child: ValueListenableBuilder( valueListenable: controller.selectedLink, - builder: - (context, _, _) => TabBarView( - children: [ - ValidationDetailView( - controller: controller, - viewType: TableViewType.domainView, - ), - ValidationDetailView( - controller: controller, - viewType: TableViewType.pathView, - ), - ValidationDetailView( - controller: controller, - viewType: TableViewType.singleUrlView, - ), - ], + builder: (context, _, _) => TabBarView( + children: [ + ValidationDetailView( + controller: controller, + viewType: TableViewType.domainView, ), + ValidationDetailView( + controller: controller, + viewType: TableViewType.pathView, + ), + ValidationDetailView( + controller: controller, + viewType: TableViewType.singleUrlView, + ), + ], + ), ), ), ], @@ -268,12 +266,11 @@ class _DeepLinkListViewTopPanel extends StatelessWidget { _ConfigurationDropdown( title: 'iOS Configuration:', valueListenable: controller.selectedIosConfigurationIndex, - configurations: - controller - .selectedProject - .value! - .iosBuildOptions - .configurations, + configurations: controller + .selectedProject + .value! + .iosBuildOptions + .configurations, onChanged: controller.updateSelectedIosConfigurationIndex, ), const SizedBox(width: denseSpacing), @@ -357,10 +354,9 @@ class _AllDeepLinkDataTable extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: denseSpacing), child: SizedBox( - width: - controller.displayOptions.showSplitScreen - ? _kSearchFieldSplitScreenWidth - : _kSearchFieldFullWidth, + width: controller.displayOptions.showSplitScreen + ? _kSearchFieldSplitScreenWidth + : _kSearchFieldFullWidth, child: DevToolsClearableTextField( labelText: '', hintText: 'Search a URL, domain or path', @@ -394,26 +390,25 @@ class _AllDeepLinkDataTable extends StatelessWidget { Expanded( child: ValueListenableBuilder( valueListenable: controller.displayLinkDatasNotifier, - builder: - (context, linkDatas, _) => TabBarView( - children: [ - _DataTable( - viewType: TableViewType.domainView, - linkDatas: linkDatas.byDomain, - controller: controller, - ), - _DataTable( - viewType: TableViewType.pathView, - linkDatas: linkDatas.byPath, - controller: controller, - ), - _DataTable( - viewType: TableViewType.singleUrlView, - linkDatas: linkDatas.all, - controller: controller, - ), - ], + builder: (context, linkDatas, _) => TabBarView( + children: [ + _DataTable( + viewType: TableViewType.domainView, + linkDatas: linkDatas.byDomain, + controller: controller, + ), + _DataTable( + viewType: TableViewType.pathView, + linkDatas: linkDatas.byPath, + controller: controller, ), + _DataTable( + viewType: TableViewType.singleUrlView, + linkDatas: linkDatas.all, + controller: controller, + ), + ], + ), ), ), ], diff --git a/packages/devtools_app/lib/src/screens/deep_link_validation/deep_links_controller.dart b/packages/devtools_app/lib/src/screens/deep_link_validation/deep_links_controller.dart index 4d4ce4dec34..6e51d115fe0 100644 --- a/packages/devtools_app/lib/src/screens/deep_link_validation/deep_links_controller.dart +++ b/packages/devtools_app/lib/src/screens/deep_link_validation/deep_links_controller.dart @@ -324,9 +324,9 @@ class DeepLinksController extends DevToolsScreenController if (selectedProject.value!.androidVariants.isEmpty) { return; } - final variant = - selectedProject.value!.androidVariants[selectedAndroidVariantIndex - .value]; + final variant = selectedProject + .value! + .androidVariants[selectedAndroidVariantIndex.value]; await ga.timeAsync( gac.deeplink, gac.AnalyzeFlutterProject.loadAppLinks.name, @@ -341,8 +341,8 @@ class DeepLinksController extends DevToolsScreenController ga.impression( gac.deeplink, gac.AnalyzeFlutterProject.androidAppLinksSettingsLoaded.name, - screenMetricsProvider: - () => DeepLinkScreenMetrics(androidAppId: result.applicationId), + screenMetricsProvider: () => + DeepLinkScreenMetrics(androidAppId: result.applicationId), ); } catch (_) { ga.select( @@ -378,9 +378,8 @@ class DeepLinksController extends DevToolsScreenController ga.impression( gac.deeplink, gac.AnalyzeFlutterProject.iosUniversalLinkSettingsLoaded.name, - screenMetricsProvider: - () => - DeepLinkScreenMetrics(iosBundleId: result.bundleIdentifier), + screenMetricsProvider: () => + DeepLinkScreenMetrics(iosBundleId: result.bundleIdentifier), ); } catch (_) { pagePhase.value = PagePhase.validationErrorPage; @@ -541,12 +540,11 @@ class DeepLinksController extends DevToolsScreenController } Future> _validateDomain(List rawLinkdatas) async { - final domains = - rawLinkdatas - .where((linkdata) => linkdata.domain != null) - .map((linkdata) => linkdata.domain!) - .toSet() - .toList(); + final domains = rawLinkdatas + .where((linkdata) => linkdata.domain != null) + .map((linkdata) => linkdata.domain!) + .toSet() + .toList(); Map> androidDomainErrors = {}; Map> iosDomainErrors = {}; @@ -556,10 +554,9 @@ class DeepLinksController extends DevToolsScreenController ga.impression( gac.deeplink, gac.AnalyzeFlutterProject.androidValidateDomain.name, - screenMetricsProvider: - () => DeepLinkScreenMetrics( - androidAppId: currentAppLinkSettings!.applicationId, - ), + screenMetricsProvider: () => DeepLinkScreenMetrics( + androidAppId: currentAppLinkSettings!.applicationId, + ), ); final androidResult = await deepLinksService.validateAndroidDomain( domains: domains, @@ -574,10 +571,9 @@ class DeepLinksController extends DevToolsScreenController ga.impression( gac.deeplink, gac.AnalyzeFlutterProject.iosValidateDomain.name, - screenMetricsProvider: - () => DeepLinkScreenMetrics( - iosBundleId: currentUniversalLinkSettings!.bundleIdentifier, - ), + screenMetricsProvider: () => DeepLinkScreenMetrics( + iosBundleId: currentUniversalLinkSettings!.bundleIdentifier, + ), ); final iosResult = await deepLinksService.validateIosDomain( bundleId: bundleId, @@ -702,14 +698,12 @@ class DeepLinksController extends DevToolsScreenController byPath: linkDatasByPath(linkdata), ); displayOptionsNotifier.value = displayOptionsNotifier.value.copyWith( - domainErrorCount: - validatedLinkDatas.byDomain - .where((element) => element.domainErrors.isNotEmpty) - .length, - pathErrorCount: - validatedLinkDatas.byPath - .where((element) => element.pathErrors.isNotEmpty) - .length, + domainErrorCount: validatedLinkDatas.byDomain + .where((element) => element.domainErrors.isNotEmpty) + .length, + pathErrorCount: validatedLinkDatas.byPath + .where((element) => element.pathErrors.isNotEmpty) + .length, ); applyFilters(); @@ -803,38 +797,35 @@ class DeepLinksController extends DevToolsScreenController @visibleForTesting List getFilterredLinks(List linkDatas) { final searchContent = displayOptions.searchContent; - linkDatas = - linkDatas.where((linkData) { - if (searchContent.isNotEmpty && - !linkData.matchesSearchToken( - RegExp(searchContent, caseSensitive: false), - )) { - return false; - } + linkDatas = linkDatas.where((linkData) { + if (searchContent.isNotEmpty && + !linkData.matchesSearchToken( + RegExp(searchContent, caseSensitive: false), + )) { + return false; + } - if (!((linkData.os.contains(PlatformOS.android) && - displayOptions.filters.contains(FilterOption.android)) || - (linkData.os.contains(PlatformOS.ios) && - displayOptions.filters.contains(FilterOption.ios)))) { - return false; - } + if (!((linkData.os.contains(PlatformOS.android) && + displayOptions.filters.contains(FilterOption.android)) || + (linkData.os.contains(PlatformOS.ios) && + displayOptions.filters.contains(FilterOption.ios)))) { + return false; + } - if (!((linkData.domainErrors.isNotEmpty && - displayOptions.filters.contains( - FilterOption.failedDomainCheck, - )) || - (linkData.pathErrors.isNotEmpty && - displayOptions.filters.contains( - FilterOption.failedPathCheck, - )) || - (linkData.domainErrors.isEmpty && - linkData.pathErrors.isEmpty && - displayOptions.filters.contains(FilterOption.noIssue)))) { - return false; - } + if (!((linkData.domainErrors.isNotEmpty && + displayOptions.filters.contains( + FilterOption.failedDomainCheck, + )) || + (linkData.pathErrors.isNotEmpty && + displayOptions.filters.contains(FilterOption.failedPathCheck)) || + (linkData.domainErrors.isEmpty && + linkData.pathErrors.isEmpty && + displayOptions.filters.contains(FilterOption.noIssue)))) { + return false; + } - return true; - }).toList(); + return true; + }).toList(); return linkDatas; } diff --git a/packages/devtools_app/lib/src/screens/deep_link_validation/deep_links_model.dart b/packages/devtools_app/lib/src/screens/deep_link_validation/deep_links_model.dart index 3085c6de6ad..c5f0f823b75 100644 --- a/packages/devtools_app/lib/src/screens/deep_link_validation/deep_links_model.dart +++ b/packages/devtools_app/lib/src/screens/deep_link_validation/deep_links_model.dart @@ -569,9 +569,8 @@ class DomainColumn extends ColumnData children: [ const Text('Domain'), PopupMenuButton( - itemBuilder: - (BuildContext context) => - _buildPopupMenuSortingEntries(controller, isPath: false), + itemBuilder: (BuildContext context) => + _buildPopupMenuSortingEntries(controller, isPath: false), child: Icon(Icons.arrow_drop_down, size: actionsIconSize), ), ], @@ -592,11 +591,11 @@ class DomainColumn extends ColumnData return dataObject.domain == null ? Text('missing domain', style: Theme.of(context).errorTextStyle) : _ErrorAwareText( - isError: dataObject.domainErrors.isNotEmpty, - controller: controller, - text: dataObject.domain!, - link: dataObject, - ); + isError: dataObject.domainErrors.isNotEmpty, + controller: controller, + text: dataObject.domain!, + link: dataObject, + ); } @override @@ -632,9 +631,8 @@ class PathColumn extends ColumnData children: [ const Text('Path'), PopupMenuButton( - itemBuilder: - (BuildContext context) => - _buildPopupMenuSortingEntries(controller, isPath: true), + itemBuilder: (BuildContext context) => + _buildPopupMenuSortingEntries(controller, isPath: true), child: Icon(Icons.arrow_drop_down, size: actionsIconSize), ), ], @@ -908,15 +906,13 @@ PopupMenuEntry _buildPopupMenuFilterEntry( children: [ ValueListenableBuilder( valueListenable: controller.displayOptionsNotifier, - builder: - (context, option, _) => Checkbox( - value: option.filters.contains(filterOption), - onChanged: - (bool? checked) => controller.updateDisplayOptions( - removedFilter: checked! ? null : filterOption, - addedFilter: checked ? filterOption : null, - ), - ), + builder: (context, option, _) => Checkbox( + value: option.filters.contains(filterOption), + onChanged: (bool? checked) => controller.updateDisplayOptions( + removedFilter: checked! ? null : filterOption, + addedFilter: checked ? filterOption : null, + ), + ), ), Text(filterOption.description), ], diff --git a/packages/devtools_app/lib/src/screens/deep_link_validation/deep_links_services.dart b/packages/devtools_app/lib/src/screens/deep_link_validation/deep_links_services.dart index 73fa8b818ba..b260c74fe0c 100644 --- a/packages/devtools_app/lib/src/screens/deep_link_validation/deep_links_services.dart +++ b/packages/devtools_app/lib/src/screens/deep_link_validation/deep_links_services.dart @@ -161,17 +161,15 @@ class DeepLinksService { final result = json.decode(response.body) as Map; - final validationResult = - (result[_androidValidationResultKey] as List) - .cast>(); + final validationResult = (result[_androidValidationResultKey] as List) + .cast>(); googlePlayFingerprintsAvailable = result[_googlePlayFingerprintsAvailabilityKey] == _googlePlayFingerprintsAvailableValue; for (final domainResult in validationResult) { final domainName = domainResult[_domainNameKey] as String; - final failedChecks = - (domainResult[_failedChecksKey] as List?) - ?.cast>(); + final failedChecks = (domainResult[_failedChecksKey] as List?) + ?.cast>(); if (failedChecks != null) { for (final failedCheck in failedChecks) { final checkName = failedCheck[_checkNameKey] as String; @@ -214,15 +212,13 @@ class DeepLinksService { }), ); final result = json.decode(response.body) as Map; - final validationResult = - (result[_iosValidationResultsKey] as List) - .cast>(); + final validationResult = (result[_iosValidationResultsKey] as List) + .cast>(); for (final domainResult in validationResult) { if (domainResult[_domainNameKey] case final String domainName) { - final failedChecks = - (domainResult[_failedChecksKey] as List?) - ?.cast>(); + final failedChecks = (domainResult[_failedChecksKey] as List?) + ?.cast>(); if (failedChecks != null) { for (final failedCheck in failedChecks) { final checkName = failedCheck[_checkNameKey] as String; @@ -234,9 +230,8 @@ class DeepLinksService { []; // Adds sub checks for file format error. - final subChecks = - (failedCheck[_subCheckResultsKey] as List?) - ?.cast>(); + final subChecks = (failedCheck[_subCheckResultsKey] as List?) + ?.cast>(); for (final subCheck in (subChecks ?? [])) { final subCheckName = subCheck[_checkNameKey] as String; final subCheckResultType = @@ -264,23 +259,20 @@ class DeepLinksService { } } - final aasaAppPaths = - (domainResult[_aasaAppPathsKey] as List?) - ?.cast>(); + final aasaAppPaths = (domainResult[_aasaAppPathsKey] as List?) + ?.cast>(); if (aasaAppPaths != null) { for (final aasaAppPath in aasaAppPaths) { - final aasaPaths = - (aasaAppPath[_aasaPathsKey] as List?) - ?.cast>(); + final aasaPaths = (aasaAppPath[_aasaPathsKey] as List?) + ?.cast>(); if (aasaPaths != null) { for (final aasaPath in aasaPaths) { final path = aasaPath[_pathKey] as String?; if (path.isNullOrEmpty) { continue; } - final rawQueryParams = - (aasaPath[_queryParamsKey] as List?) - ?.cast>(); + final rawQueryParams = (aasaPath[_queryParamsKey] as List?) + ?.cast>(); final queryParams = { for (final item in rawQueryParams ?? []) item[_keyKey] as String: item[_valueKey] as String, @@ -337,8 +329,8 @@ class DeepLinksService { final errorCode = (result[_errorCodeKey] as String?) ?? ''; String generatedContent = ''; - final domains = - (result[_domainsKey] as List?)?.cast>(); + final domains = (result[_domainsKey] as List?) + ?.cast>(); if (domains != null) { generatedContent = domains.first[_generatedContentKey]! as String; } diff --git a/packages/devtools_app/lib/src/screens/deep_link_validation/project_root_selection/root_selector.dart b/packages/devtools_app/lib/src/screens/deep_link_validation/project_root_selection/root_selector.dart index c25476df4d3..dc76fb8e7ac 100644 --- a/packages/devtools_app/lib/src/screens/deep_link_validation/project_root_selection/root_selector.dart +++ b/packages/devtools_app/lib/src/screens/deep_link_validation/project_root_selection/root_selector.dart @@ -120,10 +120,9 @@ class _ProjectRootsDropdownState extends State { isExpanded: true, value: selectedUri, items: [for (final uri in widget.projectRoots) _buildMenuItem(uri)], - onChanged: - (uri) => setState(() { - this.selectedUri = uri; - }), + onChanged: (uri) => setState(() { + this.selectedUri = uri; + }), ), ); } @@ -176,7 +175,11 @@ class _FlexibleProjectSelectionView extends StatelessWidget { if (!showButtonInRow) { content = Column( mainAxisSize: MainAxisSize.min, - children: [content, const SizedBox(height: defaultSpacing), button], + children: [ + content, + const SizedBox(height: defaultSpacing), + button, + ], ); } @@ -198,8 +201,9 @@ class _ValidateDeepLinksButton extends StatelessWidget { return DevToolsButton( elevated: true, label: 'Validate deep links', - onPressed: - projectRoot == null ? null : () => onValidatePressed(projectRoot!), + onPressed: projectRoot == null + ? null + : () => onValidatePressed(projectRoot!), ); } } diff --git a/packages/devtools_app/lib/src/screens/deep_link_validation/project_root_selection/select_project_view.dart b/packages/devtools_app/lib/src/screens/deep_link_validation/project_root_selection/select_project_view.dart index 3da6e205dba..abd3dd989dc 100644 --- a/packages/devtools_app/lib/src/screens/deep_link_validation/project_root_selection/select_project_view.dart +++ b/packages/devtools_app/lib/src/screens/deep_link_validation/project_root_selection/select_project_view.dart @@ -50,8 +50,8 @@ class _SelectProjectViewState extends State { } Future _validateProject() async { - final packageDirectoryForMainIsolate = - await controller.packageDirectoryForMainIsolate(); + final packageDirectoryForMainIsolate = await controller + .packageDirectoryForMainIsolate(); if (packageDirectoryForMainIsolate != null) { _handleValidateProject(packageDirectoryForMainIsolate); } diff --git a/packages/devtools_app/lib/src/screens/deep_link_validation/validation_details_view.dart b/packages/devtools_app/lib/src/screens/deep_link_validation/validation_details_view.dart index b8f0915bb4e..9121769a080 100644 --- a/packages/devtools_app/lib/src/screens/deep_link_validation/validation_details_view.dart +++ b/packages/devtools_app/lib/src/screens/deep_link_validation/validation_details_view.dart @@ -113,8 +113,8 @@ class ValidationDetailHeader extends StatelessWidget { style: Theme.of(context).textTheme.titleMedium, ), IconButton( - onPressed: - () => controller.updateDisplayOptions(showSplitScreen: false), + onPressed: () => + controller.updateDisplayOptions(showSplitScreen: false), icon: const Icon(Icons.close), ), ], @@ -178,18 +178,18 @@ class _DomainCheckTable extends StatelessWidget { for (final error in linkData.domainErrors.whereType()) _IssuesBorderWrap( - children: - error == IosDomainError.existence - ? [ - _FailureDetails( - errors: [error], - oneFixGuideForAll: - 'To fix this issue, add an Apple-App-Site-Association file at the following location: ' - 'https://${controller.selectedLink.value!.domain}/.well-known/apple-app-site-association', - ), - const SizedBox(height: denseSpacing), - _CodeCard( - content: '''{ + children: error == IosDomainError.existence + ? [ + _FailureDetails( + errors: [error], + oneFixGuideForAll: + 'To fix this issue, add an Apple-App-Site-Association file at the following location: ' + 'https://${controller.selectedLink.value!.domain}/.well-known/apple-app-site-association', + ), + const SizedBox(height: denseSpacing), + _CodeCard( + content: + '''{ "applinks": { "details": [ { @@ -205,13 +205,13 @@ class _DomainCheckTable extends StatelessWidget { ] } }''', - ), - ] - : [ - _FailureDetails( - errors: [error, ...error.subcheckErrors], - ), - ], + ), + ] + : [ + _FailureDetails( + errors: [error, ...error.subcheckErrors], + ), + ], ), ], ), @@ -232,10 +232,9 @@ class _AssetLinksJsonFileIssues extends StatelessWidget { @override Widget build(BuildContext context) { - final errors = - controller.selectedLink.value!.domainErrors - .where((error) => domainAssetLinksJsonFileErrors.contains(error)) - .toList(); + final errors = controller.selectedLink.value!.domainErrors + .where((error) => domainAssetLinksJsonFileErrors.contains(error)) + .toList(); return ExpansionTile( controlAffinity: ListTileControlAffinity.leading, title: _VerifiedOrErrorText( @@ -271,10 +270,9 @@ class _HostingIssues extends StatelessWidget { @override Widget build(BuildContext context) { - final errors = - controller.selectedLink.value!.domainErrors - .where((error) => domainAndroidHostingErrors.contains(error)) - .toList(); + final errors = controller.selectedLink.value!.domainErrors + .where((error) => domainAndroidHostingErrors.contains(error)) + .toList(); return ExpansionTile( controlAffinity: ListTileControlAffinity.leading, title: _VerifiedOrErrorText( @@ -369,38 +367,38 @@ class _LocalFingerprint extends StatelessWidget { const SizedBox(height: intermediateSpacing), controller.localFingerprint.value == null ? TextField( - decoration: const InputDecoration( - labelText: 'Enter your local fingerprint', - hintText: - 'eg: A1:B2:C3:D4:A1:B2:C3:D4:A1:B2:C3:D4:A1:B2:C3:D4:A1:B2:C3:D4:A1:B2:C3:D4:A1:B2:C3:D4:A1:B2:C3:D4', - filled: true, - ), - onSubmitted: (fingerprint) async { - final validFingerprintAdded = controller.addLocalFingerprint( - fingerprint, - ); - - if (!validFingerprintAdded) { - await showDialog( - context: context, - builder: (_) { - return const DevToolsDialog( - title: Text('This is not a valid fingerprint'), - content: Text( - 'A valid fingerprint consists of 32 pairs of hexadecimal digits separated by colons.' - 'It should be the same encoding and format as in the assetlinks.json', - ), - actions: [DialogCloseButton()], - ); - }, + decoration: const InputDecoration( + labelText: 'Enter your local fingerprint', + hintText: + 'eg: A1:B2:C3:D4:A1:B2:C3:D4:A1:B2:C3:D4:A1:B2:C3:D4:A1:B2:C3:D4:A1:B2:C3:D4:A1:B2:C3:D4:A1:B2:C3:D4', + filled: true, + ), + onSubmitted: (fingerprint) async { + final validFingerprintAdded = controller.addLocalFingerprint( + fingerprint, ); - } - }, - ) + + if (!validFingerprintAdded) { + await showDialog( + context: context, + builder: (_) { + return const DevToolsDialog( + title: Text('This is not a valid fingerprint'), + content: Text( + 'A valid fingerprint consists of 32 pairs of hexadecimal digits separated by colons.' + 'It should be the same encoding and format as in the assetlinks.json', + ), + actions: [DialogCloseButton()], + ); + }, + ); + } + }, + ) : _CodeCard( - content: controller.localFingerprint.value, - hasCopyAction: false, - ), + content: controller.localFingerprint.value, + hasCopyAction: false, + ), ], ); } @@ -440,18 +438,17 @@ class _CodeCard extends StatelessWidget { elevation: 0.0, child: Padding( padding: const EdgeInsets.all(denseSpacing), - child: - content != null - ? Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Flexible(child: SelectionArea(child: Text(content!))), - if (hasCopyAction) - CopyToClipboardControl(dataProvider: () => content), - ], - ) - : const CenteredCircularProgressIndicator(), + child: content != null + ? Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Flexible(child: SelectionArea(child: Text(content!))), + if (hasCopyAction) + CopyToClipboardControl(dataProvider: () => content), + ], + ) + : const CenteredCircularProgressIndicator(), ), ); } @@ -471,9 +468,9 @@ class _GenerateAssetLinksPanel extends StatelessWidget { return (generatedAssetLinks != null && generatedAssetLinks.errorCode.isNotEmpty) ? Text( - 'Not able to generate assetlinks.json, because the app ${controller.applicationId} is not uploaded to Google Play.', - style: theme.subtleTextStyle, - ) + 'Not able to generate assetlinks.json, because the app ${controller.applicationId} is not uploaded to Google Play.', + style: theme.subtleTextStyle, + ) : _CodeCard(content: generatedAssetLinks?.generatedString); }, ); @@ -534,28 +531,27 @@ class _DomainAssociatedLinksPanel extends StatelessWidget { padding: const EdgeInsets.all(denseSpacing), child: Column( crossAxisAlignment: CrossAxisAlignment.start, - children: - linkData.associatedPath - .map( - (path) => Padding( - padding: const EdgeInsets.symmetric( - vertical: denseRowSpacing, - ), - child: Row( - children: [ - if (linkData.domainErrors.isNotEmpty) - Icon( - Icons.error, - color: theme.colorScheme.error, - size: defaultIconSize, - ), - const SizedBox(width: denseSpacing), - Text('${linkData.domain}$path'), - ], - ), - ), - ) - .toList(), + children: linkData.associatedPath + .map( + (path) => Padding( + padding: const EdgeInsets.symmetric( + vertical: denseRowSpacing, + ), + child: Row( + children: [ + if (linkData.domainErrors.isNotEmpty) + Icon( + Icons.error, + color: theme.colorScheme.error, + size: defaultIconSize, + ), + const SizedBox(width: denseSpacing), + Text('${linkData.domain}$path'), + ], + ), + ), + ) + .toList(), ), ), ), @@ -670,10 +666,9 @@ class _ManifestFileCheck extends StatelessWidget { @override Widget build(BuildContext context) { final linkData = controller.selectedLink.value!; - final errors = - manifestFileErrors - .where((error) => linkData.pathErrors.contains(error)) - .toList(); + final errors = manifestFileErrors + .where((error) => linkData.pathErrors.contains(error)) + .toList(); return _CheckExpansionTile( os: PlatformOS.android, @@ -836,9 +831,9 @@ class _CheckStatusText extends StatelessWidget { return hasError ? Text('Check failed', style: theme.errorTextStyle) : Text( - 'No issues found', - style: TextStyle(color: theme.colorScheme.green), - ); + 'No issues found', + style: TextStyle(color: theme.colorScheme.green), + ); } } @@ -853,15 +848,15 @@ class _VerifiedOrErrorText extends StatelessWidget { children: [ isError ? Icon( - Icons.error, - color: Theme.of(context).colorScheme.error, - size: defaultIconSize, - ) + Icons.error, + color: Theme.of(context).colorScheme.error, + size: defaultIconSize, + ) : Icon( - Icons.verified, - color: Theme.of(context).colorScheme.green, - size: defaultIconSize, - ), + Icons.verified, + color: Theme.of(context).colorScheme.green, + size: defaultIconSize, + ), const SizedBox(width: denseSpacing), Text(text), ], diff --git a/packages/devtools_app/lib/src/screens/inspector/inspector_breadcrumbs.dart b/packages/devtools_app/lib/src/screens/inspector/inspector_breadcrumbs.dart index 9830363d5b5..9beabcf1732 100644 --- a/packages/devtools_app/lib/src/screens/inspector/inspector_breadcrumbs.dart +++ b/packages/devtools_app/lib/src/screens/inspector/inspector_breadcrumbs.dart @@ -37,19 +37,18 @@ class InspectorBreadcrumbNavigator extends StatelessWidget { child: Padding( padding: const EdgeInsets.symmetric(horizontal: 6), child: Row( - children: - breadcrumbs.map((item) { - if (item.isChevron) { - return Icon(Icons.chevron_right, size: defaultIconSize); - } - - return Flexible( - child: _InspectorBreadcrumb( - data: item, - onTap: () => onTap(item.node), - ), - ); - }).toList(), + children: breadcrumbs.map((item) { + if (item.isChevron) { + return Icon(Icons.chevron_right, size: defaultIconSize); + } + + return Flexible( + child: _InspectorBreadcrumb( + data: item, + onTap: () => onTap(item.node), + ), + ); + }).toList(), ), ), ); @@ -59,25 +58,23 @@ class InspectorBreadcrumbNavigator extends StatelessWidget { List nodes, ) { final lastNode = nodes.safeLast; - final items = - nodes.map((node) { - return _InspectorBreadcrumbData.wrap( - node: node, - isSelected: node == lastNode, - ); - }).toList(); + final items = nodes.map((node) { + return _InspectorBreadcrumbData.wrap( + node: node, + isSelected: node == lastNode, + ); + }).toList(); List<_InspectorBreadcrumbData> breadcrumbs; - breadcrumbs = - items.length > _maxNumberOfBreadcrumbs - ? [ - items[0], - _InspectorBreadcrumbData.more(), - ...items.sublist( - items.length - _maxNumberOfBreadcrumbs + 1, - items.length, - ), - ] - : items; + breadcrumbs = items.length > _maxNumberOfBreadcrumbs + ? [ + items[0], + _InspectorBreadcrumbData.more(), + ...items.sublist( + items.length - _maxNumberOfBreadcrumbs + 1, + items.length, + ), + ] + : items; return breadcrumbs.joinWith(_InspectorBreadcrumbData.chevron()); } @@ -102,16 +99,15 @@ class _InspectorBreadcrumb extends StatelessWidget { ).copyWith(fontSize: scaleByFontFactor(11)), ); - final icon = - data.icon == null - ? null - : Transform.scale( - scale: _iconScale, - child: Padding( - padding: const EdgeInsets.only(right: iconPadding), - child: data.icon, - ), - ); + final icon = data.icon == null + ? null + : Transform.scale( + scale: _iconScale, + child: Padding( + padding: const EdgeInsets.only(right: iconPadding), + child: data.icon, + ), + ); return InkWell( onTap: data.isClickable ? onTap : null, @@ -123,14 +119,16 @@ class _InspectorBreadcrumb extends StatelessWidget { ), decoration: BoxDecoration( borderRadius: defaultBorderRadius, - color: - data.isSelected - ? Theme.of(context).colorScheme.selectedRowBackgroundColor - : Colors.transparent, + color: data.isSelected + ? Theme.of(context).colorScheme.selectedRowBackgroundColor + : Colors.transparent, ), child: Row( mainAxisSize: MainAxisSize.min, - children: [if (icon != null) icon, Flexible(child: text)], + children: [ + if (icon != null) icon, + Flexible(child: text), + ], ), ), ); diff --git a/packages/devtools_app/lib/src/screens/inspector/inspector_controller.dart b/packages/devtools_app/lib/src/screens/inspector/inspector_controller.dart index 2716ef3393e..9ddc8196e90 100644 --- a/packages/devtools_app/lib/src/screens/inspector/inspector_controller.dart +++ b/packages/devtools_app/lib/src/screens/inspector/inspector_controller.dart @@ -64,15 +64,14 @@ class InspectorController extends DisposableController onExpand: _onExpand, onClientActiveChange: _onClientChange, ); - details = - isSummaryTree - ? InspectorController( - inspectorTree: detailsTree!, - treeType: treeType, - parent: this, - isSummaryTree: false, - ) - : null; + details = isSummaryTree + ? InspectorController( + inspectorTree: detailsTree!, + treeType: treeType, + parent: this, + isSummaryTree: false, + ) + : null; await serviceConnection.serviceManager.onServiceAvailable; @@ -425,8 +424,8 @@ class InspectorController extends DisposableController } else { if (disposed) return; if (inspectorService is InspectorService) { - final widgetTreeReady = - await (inspectorService as InspectorService).isWidgetTreeReady(); + final widgetTreeReady = await (inspectorService as InspectorService) + .isWidgetTreeReady(); flutterAppFrameReady = widgetTreeReady; } if (isActive && flutterAppFrameReady) { @@ -450,10 +449,9 @@ class InspectorController extends DisposableController treeGroups.cancelNext(); try { final group = treeGroups.next; - final node = - await (detailsSubtree - ? group.getDetailsSubtree(subtreeRoot, subtreeDepth: subtreeDepth) - : group.getRoot(treeType, isSummaryTree: true)); + final node = await (detailsSubtree + ? group.getDetailsSubtree(subtreeRoot, subtreeDepth: subtreeDepth) + : group.getRoot(treeType, isSummaryTree: true)); if (node == null || group.disposed || disposed) { return; } @@ -644,8 +642,9 @@ class InspectorController extends DisposableController restrictToLocalProject: isSummaryTree, ); - final pendingDetailsFuture = - isSummaryTree ? group.getSelection(selectedDiagnostic, treeType) : null; + final pendingDetailsFuture = isSummaryTree + ? group.getSelection(selectedDiagnostic, treeType) + : null; try { final newSelection = await pendingSelectionFuture; @@ -736,17 +735,15 @@ class InspectorController extends DisposableController void _updateSelectedErrorFromNode(InspectorTreeNode? node) { final inspectorRef = node?.diagnostic?.valueRef.id; - final errors = - serviceConnection.errorBadgeManager - .erroredItemsForPage(InspectorScreen.id) - .value; + final errors = serviceConnection.errorBadgeManager + .erroredItemsForPage(InspectorScreen.id) + .value; // Check whether the node that was just selected has any errors associated // with it. - var errorIndex = - inspectorRef != null - ? errors.keys.toList().indexOf(inspectorRef) - : null; + var errorIndex = inspectorRef != null + ? errors.keys.toList().indexOf(inspectorRef) + : null; if (errorIndex == -1) { errorIndex = null; } @@ -772,10 +769,9 @@ class InspectorController extends DisposableController void selectErrorByIndex(int index) { _selectedErrorIndex.value = index; - final errors = - serviceConnection.errorBadgeManager - .erroredItemsForPage(InspectorScreen.id) - .value; + final errors = serviceConnection.errorBadgeManager + .erroredItemsForPage(InspectorScreen.id) + .value; unawaited( updateSelectionFromService( diff --git a/packages/devtools_app/lib/src/screens/inspector/inspector_data_models.dart b/packages/devtools_app/lib/src/screens/inspector/inspector_data_models.dart index 4d52c286f5c..a12ed91f76e 100644 --- a/packages/devtools_app/lib/src/screens/inspector/inspector_data_models.dart +++ b/packages/devtools_app/lib/src/screens/inspector/inspector_data_models.dart @@ -111,15 +111,13 @@ class LayoutProperties { isFlex = node.isFlex, flexFactor = node.flexFactor, flexFit = node.flexFit, - children = - copyLevel == 0 - ? [] - : node.childrenNow - .map( - (child) => - LayoutProperties(child, copyLevel: copyLevel - 1), - ) - .toList(growable: false) { + children = copyLevel == 0 + ? [] + : node.childrenNow + .map( + (child) => LayoutProperties(child, copyLevel: copyLevel - 1), + ) + .toList(growable: false) { for (final child in children) { child.parent = this; } @@ -182,10 +180,10 @@ class LayoutProperties { if (constraintsLocal == null) return ''; return constraintsLocal.hasBoundedWidth ? describeAxis( - constraintsLocal.minWidth, - constraintsLocal.maxWidth, - 'w', - ) + constraintsLocal.minWidth, + constraintsLocal.maxWidth, + 'w', + ) : 'width is unconstrained'; } @@ -194,10 +192,10 @@ class LayoutProperties { if (constraintsLocal == null) return ''; return constraintsLocal.hasBoundedHeight ? describeAxis( - constraintsLocal.minHeight, - constraintsLocal.maxHeight, - 'h', - ) + constraintsLocal.minHeight, + constraintsLocal.maxHeight, + 'h', + ) : 'height is unconstrained'; } @@ -365,9 +363,8 @@ class FlexLayoutProperties extends LayoutProperties { static FlexLayoutProperties _buildNode(RemoteDiagnosticsNode node) { final renderObjectJson = node.renderObject!.json; - final properties = - (renderObjectJson['properties'] as List) - .cast>(); + final properties = (renderObjectJson['properties'] as List) + .cast>(); final data = { for (final property in properties) @@ -406,8 +403,9 @@ class FlexLayoutProperties extends LayoutProperties { List get displayChildren { final displayChildren = _displayChildren; if (displayChildren != null) return displayChildren; - return _displayChildren = - startIsTopLeft ? children : children.reversed.toList(); + return _displayChildren = startIsTopLeft + ? children + : children.reversed.toList(); } int? _totalFlex; @@ -428,11 +426,10 @@ class FlexLayoutProperties extends LayoutProperties { num get totalFlex { if (children.isEmpty) return 0; - _totalFlex ??= - children - .map((child) => child.flexFactor ?? 0) - .reduce((value, element) => value + element) - .toInt(); + _totalFlex ??= children + .map((child) => child.flexFactor ?? 0) + .reduce((value, element) => value + element) + .toInt(); return _totalFlex!; } @@ -490,8 +487,9 @@ class FlexLayoutProperties extends LayoutProperties { }) { /// calculate the render empty spaces final freeSpace = dimension(direction) - sum(childrenDimensions(direction)); - final displayMainAxisAlignment = - startIsTopLeft ? mainAxisAlignment : mainAxisAlignment?.reversed; + final displayMainAxisAlignment = startIsTopLeft + ? mainAxisAlignment + : mainAxisAlignment?.reversed; double leadingSpace(double freeSpace) { if (children.isEmpty) return 0.0; @@ -539,8 +537,9 @@ class FlexLayoutProperties extends LayoutProperties { } double largestRenderSize(Axis axis) { - final lrs = - axis == Axis.horizontal ? largestRenderWidth : largestRenderHeight; + final lrs = axis == Axis.horizontal + ? largestRenderWidth + : largestRenderHeight; // use all the space when visualizing cross axis return (axis == direction) ? lrs : maxSizeAvailable(axis); } @@ -566,12 +565,11 @@ class FlexLayoutProperties extends LayoutProperties { ); } else { // uniform cross axis sizes. - double size = - crossAxisAlignment == CrossAxisAlignment.stretch - ? maxSizeAvailable(axis) - : largestSize / - math.max(dimension(axis), 1.0) * - maxSizeAvailable(axis); + double size = crossAxisAlignment == CrossAxisAlignment.stretch + ? maxSizeAvailable(axis) + : largestSize / + math.max(dimension(axis), 1.0) * + maxSizeAvailable(axis); size = math.max(size, smallestRenderSize(axis)); return sizes.map((_) => size).toList(); } @@ -580,10 +578,9 @@ class FlexLayoutProperties extends LayoutProperties { final widths = renderSizes(Axis.horizontal); final heights = renderSizes(Axis.vertical); - final renderFreeSpace = - freeSpace > 0.0 - ? (isMainAxisHorizontal ? widths.last : heights.last) - : 0.0; + final renderFreeSpace = freeSpace > 0.0 + ? (isMainAxisHorizontal ? widths.last : heights.last) + : 0.0; final renderLeadingSpace = leadingSpace(renderFreeSpace); final renderBetweenSpace = betweenSpace(renderFreeSpace); @@ -614,8 +611,9 @@ class FlexLayoutProperties extends LayoutProperties { double calculateCrossAxisOffset(int i) { final maxDimension = maxSizeAvailable(crossAxisDirection); - final usedDimension = - crossAxisDirection == Axis.horizontal ? widths[i] : heights[i]; + final usedDimension = crossAxisDirection == Axis.horizontal + ? widths[i] + : heights[i]; if (crossAxisAlignment == CrossAxisAlignment.start || crossAxisAlignment == CrossAxisAlignment.stretch || @@ -721,10 +719,9 @@ class FlexLayoutProperties extends LayoutProperties { renderProperties.crossAxisOffset, ); } else { - space.crossAxisOffset = - crossAxisAlignment == CrossAxisAlignment.end - ? 0 - : renderProperties.crossAxisDimension; + space.crossAxisOffset = crossAxisAlignment == CrossAxisAlignment.end + ? 0 + : renderProperties.crossAxisDimension; spaces.add(space); } } @@ -732,14 +729,14 @@ class FlexLayoutProperties extends LayoutProperties { } static final _directionNamesToValues = Axis.values.asNameMap(); - static final _mainAxisAlignmentNamesToValues = - MainAxisAlignment.values.asNameMap(); + static final _mainAxisAlignmentNamesToValues = MainAxisAlignment.values + .asNameMap(); static final _mainAxisSizeNamesToValues = MainAxisSize.values.asNameMap(); - static final _crossAxisAlignmentNamesToValues = - CrossAxisAlignment.values.asNameMap(); + static final _crossAxisAlignmentNamesToValues = CrossAxisAlignment.values + .asNameMap(); static final _textDirectionNamesToValues = TextDirection.values.asNameMap(); - static final _verticalDirectionNamesToValues = - VerticalDirection.values.asNameMap(); + static final _verticalDirectionNamesToValues = VerticalDirection.values + .asNameMap(); static final _textBaselineNamesToValues = TextBaseline.values.asNameMap(); } diff --git a/packages/devtools_app/lib/src/screens/inspector/inspector_screen_body.dart b/packages/devtools_app/lib/src/screens/inspector/inspector_screen_body.dart index d46b311a94f..bfcb72dbcdb 100644 --- a/packages/devtools_app/lib/src/screens/inspector/inspector_screen_body.dart +++ b/packages/devtools_app/lib/src/screens/inspector/inspector_screen_body.dart @@ -154,8 +154,8 @@ class InspectorScreenBodyState extends State constraints: constraints, onRefreshInspectorPressed: _refreshInspector, onSearchVisibleToggle: _onSearchVisibleToggle, - searchFieldBuilder: - () => StatelessSearchField( + searchFieldBuilder: () => + StatelessSearchField( controller: _summaryTreeController, searchFieldEnabled: true, shouldRequestFocus: searchVisible, @@ -189,17 +189,15 @@ class InspectorScreenBodyState extends State if (errors.isNotEmpty) ValueListenableBuilder( valueListenable: controller.selectedErrorIndex, - builder: - (_, selectedErrorIndex, _) => Positioned( - top: 0, - right: 0, - child: ErrorNavigator( - errors: inspectableErrors, - errorIndex: selectedErrorIndex, - onSelectError: - controller.selectErrorByIndex, - ), - ), + builder: (_, selectedErrorIndex, _) => Positioned( + top: 0, + right: 0, + child: ErrorNavigator( + errors: inspectableErrors, + errorIndex: selectedErrorIndex, + onSelectError: controller.selectErrorByIndex, + ), + ), ), ], ); @@ -315,18 +313,18 @@ class InspectorSummaryTreeControls extends StatelessWidget { ), ...!isSearchVisible ? [ - const Spacer(), - ToolbarAction( - icon: Icons.search, - onPressed: onSearchVisibleToggle, - tooltip: 'Search Tree', - ), - ] + const Spacer(), + ToolbarAction( + icon: Icons.search, + onPressed: onSearchVisibleToggle, + tooltip: 'Search Tree', + ), + ] : [ - constraints.maxWidth >= _searchBreakpoint - ? _buildSearchControls() - : const Spacer(), - ], + constraints.maxWidth >= _searchBreakpoint + ? _buildSearchControls() + : const Spacer(), + ], ToolbarAction( icon: Icons.refresh, onPressed: onRefreshInspectorPressed, @@ -378,10 +376,9 @@ class ErrorNavigator extends StatelessWidget { @override Widget build(BuildContext context) { final colorScheme = Theme.of(context).colorScheme; - final label = - errorIndex != null - ? 'Error ${errorIndex! + 1}/${errors.length}' - : 'Errors: ${errors.length}'; + final label = errorIndex != null + ? 'Error ${errorIndex! + 1}/${errors.length}' + : 'Errors: ${errors.length}'; return Container( color: colorScheme.errorContainer, child: Padding( diff --git a/packages/devtools_app/lib/src/screens/inspector/inspector_tree_controller.dart b/packages/devtools_app/lib/src/screens/inspector/inspector_tree_controller.dart index 3d39d484cf5..ebdcd9661b3 100644 --- a/packages/devtools_app/lib/src/screens/inspector/inspector_tree_controller.dart +++ b/packages/devtools_app/lib/src/screens/inspector/inspector_tree_controller.dart @@ -127,12 +127,11 @@ class InspectorTreeController extends DisposableController gac.inspector, gac.inspectorTreeControllerInitialized, nonInteraction: true, - screenMetricsProvider: - () => InspectorScreenMetrics.legacy( - inspectorTreeControllerId: gaId, - rootSetCount: _rootSetCount, - rowCount: _root?.subtreeSize, - ), + screenMetricsProvider: () => InspectorScreenMetrics.legacy( + inspectorTreeControllerId: gaId, + rootSetCount: _rootSetCount, + rowCount: _root?.subtreeSize, + ), ); } @@ -179,12 +178,11 @@ class InspectorTreeController extends DisposableController gac.inspector, gac.inspectorTreeControllerRootChange, nonInteraction: true, - screenMetricsProvider: - () => InspectorScreenMetrics.legacy( - inspectorTreeControllerId: gaId, - rootSetCount: ++_rootSetCount, - rowCount: _root?.subtreeSize, - ), + screenMetricsProvider: () => InspectorScreenMetrics.legacy( + inspectorTreeControllerId: gaId, + rootSetCount: ++_rootSetCount, + rowCount: _root?.subtreeSize, + ), ); }); } @@ -349,15 +347,14 @@ class InspectorTreeController extends DisposableController final rootLocal = root!; - selection = - rootLocal - .getRow( - (rootLocal.getRowIndex(selection!) + indexOffset).clamp( - 0, - numRows - 1, - ), - ) - ?.node; + selection = rootLocal + .getRow( + (rootLocal.getRowIndex(selection!) + indexOffset).clamp( + 0, + numRows - 1, + ), + ) + ?.node; } double get horizontalPadding => 10.0; @@ -517,8 +514,9 @@ class InspectorTreeController extends DisposableController final row = getRowForNode(target); if (row != null) { final rowRect = getBoundingBox(row); - targetRect = - targetRect == null ? rowRect : targetRect.expandToInclude(rowRect); + targetRect = targetRect == null + ? rowRect + : targetRect.expandToInclude(rowRect); } } @@ -872,14 +870,12 @@ class _InspectorTreeState extends State final initialX = rect.left; final initialY = rect.top; - final yOffsetAtViewportTop = - _scrollControllerY.hasClients - ? _scrollControllerY.offset - : _scrollControllerY.initialScrollOffset; - final xOffsetAtViewportLeft = - _scrollControllerX.hasClients - ? _scrollControllerX.offset - : _scrollControllerX.initialScrollOffset; + final yOffsetAtViewportTop = _scrollControllerY.hasClients + ? _scrollControllerY.offset + : _scrollControllerY.initialScrollOffset; + final xOffsetAtViewportLeft = _scrollControllerX.hasClients + ? _scrollControllerX.offset + : _scrollControllerX.initialScrollOffset; final viewPortInScrollControllerSpace = Rect.fromLTWH( xOffsetAtViewportLeft, @@ -1017,10 +1013,9 @@ class _InspectorTreeState extends State ga.timeEnd( screenId, gac.pageReady, - screenMetricsProvider: - () => InspectorScreenMetrics.legacy( - rowCount: treeControllerLocal.numRows, - ), + screenMetricsProvider: () => InspectorScreenMetrics.legacy( + rowCount: treeControllerLocal.numRows, + ), ); unawaited( serviceConnection.sendDwdsEvent( @@ -1081,9 +1076,9 @@ class _InspectorTreeState extends State viewportWidth: viewportWidth, error: widget.widgetErrors != null && - inspectorRef != null - ? widget.widgetErrors![inspectorRef] - : null, + inspectorRef != null + ? widget.widgetErrors![inspectorRef] + : null, ); }, childCount: treeControllerLocal.numRows + 1), controller: _scrollControllerY, @@ -1099,8 +1094,8 @@ class _InspectorTreeState extends State if (shouldShowBreadcrumbs) { final inspectorTreeController = widget.summaryTreeController!; - final parents = - inspectorTreeController.getPathFromSelectedRowToRoot(); + final parents = inspectorTreeController + .getPathFromSelectedRowToRoot(); return Column( children: [ InspectorBreadcrumbNavigator( @@ -1121,10 +1116,9 @@ class _InspectorTreeState extends State bool get wantKeepAlive => true; } -Paint _defaultPaint(ColorScheme colorScheme) => - Paint() - ..color = colorScheme.treeGuidelineColor - ..strokeWidth = chartLineStrokeWidth; +Paint _defaultPaint(ColorScheme colorScheme) => Paint() + ..color = colorScheme.treeGuidelineColor + ..strokeWidth = chartLineStrokeWidth; /// Custom painter that draws lines indicating how parent and child rows are /// connected to each other. @@ -1165,10 +1159,9 @@ class _RowPainter extends CustomPainter { currentX = _controller.getDepthIndent(row.depth - 1) - inspectorColumnWidth * 0.5; - final width = - showExpandCollapse - ? inspectorColumnWidth * 0.5 - : inspectorColumnWidth; + final width = showExpandCollapse + ? inspectorColumnWidth * 0.5 + : inspectorColumnWidth; canvas.drawLine( Offset(currentX, 0.0), Offset(currentX, inspectorRowHeight * 0.5), @@ -1237,10 +1230,9 @@ class InspectorRowContent extends StatelessWidget { Color? backgroundColor; if (row.isSelected) { - backgroundColor = - hasError - ? colorScheme.errorContainer - : colorScheme.selectedRowBackgroundColor; + backgroundColor = hasError + ? colorScheme.errorContainer + : colorScheme.selectedRowBackgroundColor; } final node = row.node; @@ -1257,16 +1249,16 @@ class InspectorRowContent extends StatelessWidget { children: [ node.showExpandCollapse ? InkWell( - onTap: onToggle, - child: RotationTransition( - turns: expandArrowAnimation, - child: Icon(Icons.expand_more, size: defaultIconSize), - ), - ) + onTap: onToggle, + child: RotationTransition( + turns: expandArrowAnimation, + child: Icon(Icons.expand_more, size: defaultIconSize), + ), + ) : const SizedBox( - width: defaultSpacing, - height: defaultSpacing, - ), + width: defaultSpacing, + height: defaultSpacing, + ), Expanded( child: Container( color: backgroundColor, @@ -1287,12 +1279,12 @@ class InspectorRowContent extends StatelessWidget { errorText: error?.errorMessage, nodeDescriptionHighlightStyle: searchValue.isEmpty || !row.isSearchMatch - ? DiagnosticsTextStyles.regular( - Theme.of(context).colorScheme, - ) - : row.isSelected - ? theme.searchMatchHighlightStyleFocused - : theme.searchMatchHighlightStyle, + ? DiagnosticsTextStyles.regular( + Theme.of(context).colorScheme, + ) + : row.isSelected + ? theme.searchMatchHighlightStyleFocused + : theme.searchMatchHighlightStyle, ), ), ), diff --git a/packages/devtools_app/lib/src/screens/inspector/layout_explorer/box/box.dart b/packages/devtools_app/lib/src/screens/inspector/layout_explorer/box/box.dart index 4908dc2ad04..ff579921994 100644 --- a/packages/devtools_app/lib/src/screens/inspector/layout_explorer/box/box.dart +++ b/packages/devtools_app/lib/src/screens/inspector/layout_explorer/box/box.dart @@ -77,10 +77,9 @@ class BoxLayoutExplorerWidgetState setState(() { // This implementation will need to change if we support showing more than // a single widget in the box visualization for the layout explorer. - highlighted = - newProperties != null && selectedNode == newProperties.node - ? newProperties - : null; + highlighted = newProperties != null && selectedNode == newProperties.node + ? newProperties + : null; }); } @@ -225,8 +224,9 @@ class BoxLayoutExplorerWidgetState height: constraints.maxHeight, decoration: BoxDecoration( border: Border.all( - color: - WidgetTheme.fromName(propertiesLocal.node.description).color, + color: WidgetTheme.fromName( + propertiesLocal.node.description, + ).color, ), ), child: Stack( diff --git a/packages/devtools_app/lib/src/screens/inspector/layout_explorer/flex/flex.dart b/packages/devtools_app/lib/src/screens/inspector/layout_explorer/flex/flex.dart index 4980a444237..df439c0fd5d 100644 --- a/packages/devtools_app/lib/src/screens/inspector/layout_explorer/flex/flex.dart +++ b/packages/devtools_app/lib/src/screens/inspector/layout_explorer/flex/flex.dart @@ -55,23 +55,22 @@ class FlexLayoutExplorerWidgetState Color horizontalColor(ColorScheme colorScheme) => properties!.isMainAxisHorizontal - ? colorScheme.mainAxisColor - : colorScheme.crossAxisColor; + ? colorScheme.mainAxisColor + : colorScheme.crossAxisColor; - Color verticalColor(ColorScheme colorScheme) => - properties!.isMainAxisVertical - ? colorScheme.mainAxisColor - : colorScheme.crossAxisColor; + Color verticalColor(ColorScheme colorScheme) => properties!.isMainAxisVertical + ? colorScheme.mainAxisColor + : colorScheme.crossAxisColor; Color horizontalTextColor(ColorScheme colorScheme) => properties!.isMainAxisHorizontal - ? colorScheme.mainAxisTextColor - : colorScheme.crossAxisTextColor; + ? colorScheme.mainAxisTextColor + : colorScheme.crossAxisTextColor; Color verticalTextColor(ColorScheme colorScheme) => properties!.isMainAxisVertical - ? colorScheme.mainAxisTextColor - : colorScheme.crossAxisTextColor; + ? colorScheme.mainAxisTextColor + : colorScheme.crossAxisTextColor; String get flexType => properties!.type; @@ -122,10 +121,9 @@ class FlexLayoutExplorerWidgetState Widget _buildAxisAlignmentDropdown(Axis axis, ThemeData theme) { final colorScheme = theme.colorScheme; - final color = - axis == direction - ? colorScheme.mainAxisTextColor - : colorScheme.crossAxisTextColor; + final color = axis == direction + ? colorScheme.mainAxisTextColor + : colorScheme.crossAxisTextColor; List alignmentEnumEntries; Object? selected; final propertiesLocal = properties!; @@ -153,10 +151,9 @@ class FlexLayoutExplorerWidgetState isExpanded: true, // Avoid showing an underline for the main axis and cross-axis drop downs. underline: const SizedBox(), - iconEnabledColor: - axis == propertiesLocal.direction - ? colorScheme.mainAxisColor - : colorScheme.crossAxisColor, + iconEnabledColor: axis == propertiesLocal.direction + ? colorScheme.mainAxisColor + : colorScheme.crossAxisColor, selectedItemBuilder: (context) { return [ for (final alignment in alignmentEnumEntries) @@ -177,13 +174,13 @@ class FlexLayoutExplorerWidgetState child: Image.asset( (axis == direction) ? mainAxisAssetImageUrl( - direction, - alignment as MainAxisAlignment, - ) + direction, + alignment as MainAxisAlignment, + ) : crossAxisAssetImageUrl( - direction, - alignment as CrossAxisAlignment, - ), + direction, + alignment as CrossAxisAlignment, + ), height: axisAlignmentAssetImageHeight, fit: BoxFit.fitHeight, color: color, @@ -216,13 +213,13 @@ class FlexLayoutExplorerWidgetState child: Image.asset( (axis == direction) ? mainAxisAssetImageUrl( - direction, - alignment as MainAxisAlignment, - ) + direction, + alignment as MainAxisAlignment, + ) : crossAxisAssetImageUrl( - direction, - alignment as CrossAxisAlignment, - ), + direction, + alignment as CrossAxisAlignment, + ), fit: BoxFit.fitHeight, color: color, ), @@ -238,14 +235,13 @@ class FlexLayoutExplorerWidgetState // if the axis is the main axis the type should be [MainAxisAlignment] // if the axis is the cross axis the type should be [CrossAxisAlignment] FlexLayoutProperties changedProperties; - changedProperties = - axis == direction - ? propertiesLocal.copyWith( - mainAxisAlignment: newSelection as MainAxisAlignment?, - ) - : propertiesLocal.copyWith( - crossAxisAlignment: newSelection as CrossAxisAlignment?, - ); + changedProperties = axis == direction + ? propertiesLocal.copyWith( + mainAxisAlignment: newSelection as MainAxisAlignment?, + ) + : propertiesLocal.copyWith( + crossAxisAlignment: newSelection as CrossAxisAlignment?, + ); final valueRef = propertiesLocal.node.valueRef; markAsDirty(); await objectGroup!.invokeSetFlexProperties( @@ -429,8 +425,8 @@ class _VisualizeFlexChildrenState extends State { lastHighlighted = widget.highlighted; if (widget.highlighted != null) { WidgetsBinding.instance.addPostFrameCallback((_) { - final selectedRenderObject = - selectedChildKey.currentContext?.findRenderObject(); + final selectedRenderObject = selectedChildKey.currentContext + ?.findRenderObject(); if (selectedRenderObject != null && widget.scrollController.hasClients) { unawaited( @@ -475,14 +471,12 @@ class _VisualizeFlexChildrenState extends State { maxSizeAvailable: maxSizeAvailable, ); - final renderProperties = - childrenAndMainAxisSpacesRenderProps - .where((renderProps) => !renderProps.isFreeSpace) - .toList(); - final mainAxisSpaces = - childrenAndMainAxisSpacesRenderProps - .where((renderProps) => renderProps.isFreeSpace) - .toList(); + final renderProperties = childrenAndMainAxisSpacesRenderProps + .where((renderProps) => !renderProps.isFreeSpace) + .toList(); + final mainAxisSpaces = childrenAndMainAxisSpacesRenderProps + .where((renderProps) => renderProps.isFreeSpace) + .toList(); final crossAxisSpaces = widget.properties.crossAxisSpaces( childrenRenderProperties: renderProperties, maxSizeAvailable: maxSizeAvailable, @@ -528,27 +522,24 @@ class _VisualizeFlexChildrenState extends State { scrollDirection: widget.properties.direction, controller: widget.scrollController, child: ConstrainedBox( - constraints: - BoxConstraints( - minWidth: maxWidth, - minHeight: maxHeight, - maxWidth: - widget.direction == Axis.horizontal - ? sum( - childrenAndMainAxisSpacesRenderProps.map( - (renderSize) => renderSize.width, - ), - ) - : maxWidth, - maxHeight: - widget.direction == Axis.vertical - ? sum( - childrenAndMainAxisSpacesRenderProps.map( - (renderSize) => renderSize.height, - ), - ) - : maxHeight, - ).normalize(), + constraints: BoxConstraints( + minWidth: maxWidth, + minHeight: maxHeight, + maxWidth: widget.direction == Axis.horizontal + ? sum( + childrenAndMainAxisSpacesRenderProps.map( + (renderSize) => renderSize.width, + ), + ) + : maxWidth, + maxHeight: widget.direction == Axis.vertical + ? sum( + childrenAndMainAxisSpacesRenderProps.map( + (renderSize) => renderSize.height, + ), + ) + : maxHeight, + ).normalize(), child: Stack( children: [ LayoutExplorerBackground(colorScheme: colorScheme), @@ -617,10 +608,9 @@ class FlexChildVisualizer extends StatelessWidget { Widget buildMenuitemChild(int? flexFactor) { return Text( 'flex: $flexFactor', - style: - flexFactor == propertiesLocal.flexFactor - ? theme.boldTextStyle.copyWith(color: emphasizedTextColor) - : theme.regularTextStyleWithColor(emphasizedTextColor), + style: flexFactor == propertiesLocal.flexFactor + ? theme.boldTextStyle.copyWith(color: emphasizedTextColor) + : theme.regularTextStyleWithColor(emphasizedTextColor), ); } @@ -724,20 +714,15 @@ class FlexChildVisualizer extends StatelessWidget { final horizontal = rootLocal.isMainAxisHorizontal; late Size size; - size = - propertiesLocal.hasFlexFactor - ? SizeTween( - begin: Size( - horizontal - ? minRenderWidth - entranceMargin - : renderSize.width, - vertical - ? minRenderHeight - entranceMargin - : renderSize.height, - ), - end: renderSize, - ).evaluate(state.entranceCurve)! - : renderSize; + size = propertiesLocal.hasFlexFactor + ? SizeTween( + begin: Size( + horizontal ? minRenderWidth - entranceMargin : renderSize.width, + vertical ? minRenderHeight - entranceMargin : renderSize.height, + ), + end: renderSize, + ).evaluate(state.entranceCurve)! + : renderSize; // Not-expanded widgets enter much faster. return Opacity( opacity: min([state.entranceCurve.value * 5, 1.0]), diff --git a/packages/devtools_app/lib/src/screens/inspector/layout_explorer/flex/utils.dart b/packages/devtools_app/lib/src/screens/inspector/layout_explorer/flex/utils.dart index 482152d46c2..cc3b2019ca3 100644 --- a/packages/devtools_app/lib/src/screens/inspector/layout_explorer/flex/utils.dart +++ b/packages/devtools_app/lib/src/screens/inspector/layout_explorer/flex/utils.dart @@ -80,12 +80,11 @@ class AnimatedFlexLayoutProperties } @override - double get crossAxisDimension => - lerpDouble( - begin.crossAxisDimension, - end.crossAxisDimension, - animation.value, - )!; + double get crossAxisDimension => lerpDouble( + begin.crossAxisDimension, + end.crossAxisDimension, + animation.value, + )!; @override Axis get crossAxisDirection => end.crossAxisDirection; @@ -115,12 +114,11 @@ class AnimatedFlexLayoutProperties bool get isMainAxisVertical => end.isMainAxisVertical; @override - double get mainAxisDimension => - lerpDouble( - begin.mainAxisDimension, - end.mainAxisDimension, - animation.value, - )!; + double get mainAxisDimension => lerpDouble( + begin.mainAxisDimension, + end.mainAxisDimension, + animation.value, + )!; @override MainAxisSize? get mainAxisSize => end.mainAxisSize; diff --git a/packages/devtools_app/lib/src/screens/inspector/layout_explorer/ui/arrow.dart b/packages/devtools_app/lib/src/screens/inspector/layout_explorer/ui/arrow.dart index cc7285add51..7fcf002900a 100644 --- a/packages/devtools_app/lib/src/screens/inspector/layout_explorer/ui/arrow.dart +++ b/packages/devtools_app/lib/src/screens/inspector/layout_explorer/ui/arrow.dart @@ -13,10 +13,9 @@ const defaultDistanceToArrow = 4.0; enum ArrowType { up, left, right, down } -Axis axis(ArrowType type) => - (type == ArrowType.up || type == ArrowType.down) - ? Axis.vertical - : Axis.horizontal; +Axis axis(ArrowType type) => (type == ArrowType.up || type == ArrowType.down) + ? Axis.vertical + : Axis.horizontal; /// Widget that draws a bidirectional arrow around another widget. /// @@ -49,10 +48,12 @@ class ArrowWrapper extends StatelessWidget { }) : assert(arrowHeadSize >= 0.0), assert(childMarginFromArrow >= 0.0), isBidirectional = true, - startArrowType = - direction == Axis.horizontal ? ArrowType.left : ArrowType.up, - endArrowType = - direction == Axis.horizontal ? ArrowType.right : ArrowType.down; + startArrowType = direction == Axis.horizontal + ? ArrowType.left + : ArrowType.up, + endArrowType = direction == Axis.horizontal + ? ArrowType.right + : ArrowType.down; final Color arrowColor; final double arrowHeadSize; @@ -92,11 +93,10 @@ class ArrowWrapper extends StatelessWidget { headSize: arrowHeadSize, strokeWidth: arrowStrokeWidth, type: startArrowType, - shouldDrawHead: - isBidirectional - ? true - : (startArrowType == ArrowType.left || - startArrowType == ArrowType.up), + shouldDrawHead: isBidirectional + ? true + : (startArrowType == ArrowType.left || + startArrowType == ArrowType.up), ), ), ), @@ -112,11 +112,10 @@ class ArrowWrapper extends StatelessWidget { headSize: arrowHeadSize, strokeWidth: arrowStrokeWidth, type: endArrowType, - shouldDrawHead: - isBidirectional - ? true - : (endArrowType == ArrowType.right || - endArrowType == ArrowType.down), + shouldDrawHead: isBidirectional + ? true + : (endArrowType == ArrowType.right || + endArrowType == ArrowType.down), ), ), ), @@ -199,10 +198,9 @@ class _ArrowPainter extends CustomPainter { @override void paint(Canvas canvas, Size size) { - final paint = - Paint() - ..color = color - ..strokeWidth = strokeWidth; + final paint = Paint() + ..color = color + ..strokeWidth = strokeWidth; final originX = size.width / 2, originY = size.height / 2; Offset lineStartingPoint = Offset.zero; @@ -235,12 +233,11 @@ class _ArrowPainter extends CustomPainter { p3 = Offset(originX + headSizeDividedBy2, startingY); break; } - final path = - Path() - ..moveTo(p1.dx, p1.dy) - ..lineTo(p2.dx, p2.dy) - ..lineTo(p3.dx, p3.dy) - ..close(); + final path = Path() + ..moveTo(p1.dx, p1.dy) + ..lineTo(p2.dx, p2.dy) + ..lineTo(p3.dx, p3.dy) + ..close(); canvas.drawPath(path, paint); switch (type) { diff --git a/packages/devtools_app/lib/src/screens/inspector/layout_explorer/ui/dimension.dart b/packages/devtools_app/lib/src/screens/inspector/layout_explorer/ui/dimension.dart index ca9a67e0371..cc5e40cc5df 100644 --- a/packages/devtools_app/lib/src/screens/inspector/layout_explorer/ui/dimension.dart +++ b/packages/devtools_app/lib/src/screens/inspector/layout_explorer/ui/dimension.dart @@ -15,10 +15,9 @@ Widget dimensionDescription( final text = Text.rich( description, textAlign: TextAlign.center, - style: - overflow - ? overflowingDimensionIndicatorTextStyle(colorScheme) - : dimensionIndicatorTextStyle, + style: overflow + ? overflowingDimensionIndicatorTextStyle(colorScheme) + : dimensionIndicatorTextStyle, overflow: TextOverflow.ellipsis, ); if (overflow) { diff --git a/packages/devtools_app/lib/src/screens/inspector/layout_explorer/ui/overflow_indicator_painter.dart b/packages/devtools_app/lib/src/screens/inspector/layout_explorer/ui/overflow_indicator_painter.dart index 18d87d6e7a8..298b7782ef8 100644 --- a/packages/devtools_app/lib/src/screens/inspector/layout_explorer/ui/overflow_indicator_painter.dart +++ b/packages/devtools_app/lib/src/screens/inspector/layout_explorer/ui/overflow_indicator_painter.dart @@ -34,15 +34,14 @@ class OverflowIndicatorPainter extends CustomPainter { /// since all of them are private. static const black = Color(0xBF000000); static const yellow = Color(0xBFFFFF00); - static final indicatorPaint = - Paint() - ..shader = ui.Gradient.linear( - const Offset(0.0, 0.0), - const Offset(10.0, 10.0), - [black, yellow, yellow, black], - [0.25, 0.25, 0.75, 0.75], - TileMode.repeated, - ); + static final indicatorPaint = Paint() + ..shader = ui.Gradient.linear( + const Offset(0.0, 0.0), + const Offset(10.0, 10.0), + [black, yellow, yellow, black], + [0.25, 0.25, 0.75, 0.75], + TileMode.repeated, + ); @override void paint(Canvas canvas, Size size) { diff --git a/packages/devtools_app/lib/src/screens/inspector/layout_explorer/ui/utils.dart b/packages/devtools_app/lib/src/screens/inspector/layout_explorer/ui/utils.dart index 58706da8b31..798ea7a45f7 100644 --- a/packages/devtools_app/lib/src/screens/inspector/layout_explorer/ui/utils.dart +++ b/packages/devtools_app/lib/src/screens/inspector/layout_explorer/ui/utils.dart @@ -156,22 +156,21 @@ class WidgetVisualizer extends StatelessWidget { decoration: BoxDecoration( border: Border.all( color: borderColor, - width: - isSelected ? _borderSelectedWidth : _borderUnselectedWidth, + width: isSelected + ? _borderSelectedWidth + : _borderUnselectedWidth, ), - color: - isSelected - ? theme.canvasColor.brighten() - : theme.canvasColor.darken(), - boxShadow: - isSelected - ? [ - BoxShadow( - color: Colors.black.withAlpha(255 ~/ 2), - blurRadius: 20, - ), - ] - : null, + color: isSelected + ? theme.canvasColor.brighten() + : theme.canvasColor.darken(), + boxShadow: isSelected + ? [ + BoxShadow( + color: Colors.black.withAlpha(255 ~/ 2), + blurRadius: 20, + ), + ] + : null, ), child: Stack( children: [ @@ -186,14 +185,12 @@ class WidgetVisualizer extends StatelessWidget { ), Container( margin: EdgeInsets.only( - right: - overflowSide == OverflowSide.right - ? _overflowIndicatorSize - : 0.0, - bottom: - overflowSide == OverflowSide.bottom - ? _overflowIndicatorSize - : 0.0, + right: overflowSide == OverflowSide.right + ? _overflowIndicatorSize + : 0.0, + bottom: overflowSide == OverflowSide.bottom + ? _overflowIndicatorSize + : 0.0, ), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, @@ -207,11 +204,10 @@ class WidgetVisualizer extends StatelessWidget { Flexible( child: Container( constraints: BoxConstraints( - maxWidth: - largeTitle - ? defaultMaxRenderWidth - : minRenderWidth * - widgetTitleMaxWidthPercentage, + maxWidth: largeTitle + ? defaultMaxRenderWidth + : minRenderWidth * + widgetTitleMaxWidthPercentage, ), decoration: BoxDecoration(color: borderColor), padding: const EdgeInsets.all(4.0), @@ -317,10 +313,10 @@ class AnimatedLayoutProperties final constraintsLocal = constraints!; return constraintsLocal.hasBoundedWidth ? LayoutProperties.describeAxis( - constraintsLocal.minWidth, - constraintsLocal.maxWidth, - 'w', - ) + constraintsLocal.minWidth, + constraintsLocal.maxWidth, + 'w', + ) : 'w=unconstrained'; } @@ -329,10 +325,10 @@ class AnimatedLayoutProperties final constraintsLocal = constraints!; return constraintsLocal.hasBoundedHeight ? LayoutProperties.describeAxis( - constraintsLocal.minHeight, - constraintsLocal.maxHeight, - 'h', - ) + constraintsLocal.minHeight, + constraintsLocal.maxHeight, + 'h', + ) : 'h=unconstrained'; } diff --git a/packages/devtools_app/lib/src/screens/inspector/layout_explorer/ui/widget_constraints.dart b/packages/devtools_app/lib/src/screens/inspector/layout_explorer/ui/widget_constraints.dart index 72f3eb4de53..dfc1005c534 100644 --- a/packages/devtools_app/lib/src/screens/inspector/layout_explorer/ui/widget_constraints.dart +++ b/packages/devtools_app/lib/src/screens/inspector/layout_explorer/ui/widget_constraints.dart @@ -51,9 +51,9 @@ class VisualizeWidthAndHeightWithConstraints extends StatelessWidget { text: ' (${propertiesLocal.describeHeightConstraints()})', style: propertiesLocal.constraints!.hasBoundedHeight || - !warnIfUnconstrained - ? null - : TextStyle(color: colorScheme.unconstrainedColor), + !warnIfUnconstrained + ? null + : TextStyle(color: colorScheme.unconstrainedColor), ), ], if (showOverflowHeight) @@ -111,9 +111,9 @@ class VisualizeWidthAndHeightWithConstraints extends StatelessWidget { text: '(${propertiesLocal.describeWidthConstraints()})', style: propertiesLocal.constraints!.hasBoundedWidth || - !warnIfUnconstrained - ? null - : TextStyle(color: colorScheme.unconstrainedColor), + !warnIfUnconstrained + ? null + : TextStyle(color: colorScheme.unconstrainedColor), ), ], if (showChildrenWidthsSum) diff --git a/packages/devtools_app/lib/src/screens/inspector_shared/inspector_controls.dart b/packages/devtools_app/lib/src/screens/inspector_shared/inspector_controls.dart index eae44cb02af..daba252a54f 100644 --- a/packages/devtools_app/lib/src/screens/inspector_shared/inspector_controls.dart +++ b/packages/devtools_app/lib/src/screens/inspector_shared/inspector_controls.dart @@ -27,8 +27,9 @@ class InspectorControls extends StatelessWidget { @override Widget build(BuildContext context) { - final activeButtonColor = - Theme.of(context).colorScheme.activeToggleButtonColor; + final activeButtonColor = Theme.of( + context, + ).colorScheme.activeToggleButtonColor; final isInspectorV2 = controller != null && FeatureFlags.inspectorV2; return Row( crossAxisAlignment: CrossAxisAlignment.start, @@ -48,8 +49,9 @@ class InspectorControls extends StatelessWidget { ], minScreenWidthForTextBeforeScaling: minScreenWidthForTextBeforeScaling, - minScreenWidthForTextBeforeTruncating: - isInspectorV2 ? minScreenWidthForTextBeforeTruncating : null, + minScreenWidthForTextBeforeTruncating: isInspectorV2 + ? minScreenWidthForTextBeforeTruncating + : null, ); }, ), @@ -126,11 +128,11 @@ class ShowImplementationWidgetsButton extends StatelessWidget { 'Show widgets created by the Flutter framework or other packages.', label: isScreenWiderThan( - context, - InspectorControls.minScreenWidthForTextBeforeTruncating, - ) - ? 'Show Implementation Widgets' - : 'Show', + context, + InspectorControls.minScreenWidthForTextBeforeTruncating, + ) + ? 'Show Implementation Widgets' + : 'Show', onPressed: controller.toggleImplementationWidgetsVisibility, icon: Icons.code, minScreenWidthForTextBeforeScaling: diff --git a/packages/devtools_app/lib/src/screens/inspector_shared/inspector_settings_dialog.dart b/packages/devtools_app/lib/src/screens/inspector_shared/inspector_settings_dialog.dart index dc1ed6fd9b5..ce950c777c3 100644 --- a/packages/devtools_app/lib/src/screens/inspector_shared/inspector_settings_dialog.dart +++ b/packages/devtools_app/lib/src/screens/inspector_shared/inspector_settings_dialog.dart @@ -159,10 +159,9 @@ class InspectorDefaultDetailsViewOption extends StatelessWidget { void _onChanged(InspectorDetailsViewType? value) { if (value != null) { preferences.inspector.setDefaultInspectorDetailsView(value); - final item = - value.name == InspectorDetailsViewType.layoutExplorer.name - ? gac.defaultDetailsViewToLayoutExplorer - : gac.defaultDetailsViewToWidgetDetails; + final item = value.name == InspectorDetailsViewType.layoutExplorer.name + ? gac.defaultDetailsViewToLayoutExplorer + : gac.defaultDetailsViewToWidgetDetails; ga.select(gac.inspector, item); } } @@ -185,18 +184,15 @@ class PubRootDirectorySection extends StatelessWidget { entries: preferences.inspector.pubRootDirectories, textFieldLabel: 'Enter a new package directory', isRefreshing: preferences.inspector.isRefreshingPubRootDirectories, - onEntryAdded: - (p0) => unawaited( - preferences.inspector.addPubRootDirectories([ - p0, - ], shouldCache: true), - ), - onEntryRemoved: - (p0) => unawaited( - preferences.inspector.removePubRootDirectories([p0]), - ), - onRefreshTriggered: - () => unawaited(preferences.inspector.loadPubRootDirectories()), + onEntryAdded: (p0) => unawaited( + preferences.inspector.addPubRootDirectories([ + p0, + ], shouldCache: true), + ), + onEntryRemoved: (p0) => + unawaited(preferences.inspector.removePubRootDirectories([p0])), + onRefreshTriggered: () => + unawaited(preferences.inspector.loadPubRootDirectories()), ), ); }, diff --git a/packages/devtools_app/lib/src/screens/inspector_v2/inspector_controller.dart b/packages/devtools_app/lib/src/screens/inspector_v2/inspector_controller.dart index a66cffff278..32de022bcdf 100644 --- a/packages/devtools_app/lib/src/screens/inspector_v2/inspector_controller.dart +++ b/packages/devtools_app/lib/src/screens/inspector_v2/inspector_controller.dart @@ -44,17 +44,16 @@ final _log = Logger('inspector_controller'); /// Data pattern containing the properties and render properties for a widget /// tree node. -typedef WidgetTreeNodeProperties = - ({ - /// Properties defined directly on the widget. - List widgetProperties, +typedef WidgetTreeNodeProperties = ({ + /// Properties defined directly on the widget. + List widgetProperties, - /// Properties defined on the widget's render object. - List renderProperties, + /// Properties defined on the widget's render object. + List renderProperties, - /// Layout properties for the widget. - LayoutProperties? layoutProperties, - }); + /// Layout properties for the widget. + LayoutProperties? layoutProperties, +}); /// This class is based on the InspectorPanel class from the Flutter IntelliJ /// plugin with some refactors to make it more of a true controller than a view. @@ -442,8 +441,8 @@ class InspectorController extends DisposableController } else { if (disposed) return; if (inspectorService is InspectorService) { - final widgetTreeReady = - await (inspectorService as InspectorService).isWidgetTreeReady(); + final widgetTreeReady = await (inspectorService as InspectorService) + .isWidgetTreeReady(); flutterAppFrameReady = widgetTreeReady; } if (isActive && flutterAppFrameReady) { @@ -541,10 +540,8 @@ class InspectorController extends DisposableController // TODO(https://github.com/flutter/devtools/issues/8481): Consider using a // variation of a path-finding algorithm to determine the new selection, // instead of looking for the first matching descendant. - final ( - closestUnchangedAncestor, - distanceToAncestor, - ) = _findClosestUnchangedAncestor(previousSelection); + final (closestUnchangedAncestor, distanceToAncestor) = + _findClosestUnchangedAncestor(previousSelection); if (closestUnchangedAncestor == null) return inspectorTree.root?.diagnostic; // TODO(elliette): This might cause a race event that will set this to false @@ -873,10 +870,9 @@ class InspectorController extends DisposableController // Show a notification that the user selected an implementation widget, // e.g. "Selected an implementation widget of Text: RichText." - final messageDetails = - selectedWidgetName.isEmpty - ? '' - : ' of $selectedWidgetName${implementationWidgetName.isEmpty ? '' : ': $implementationWidgetName'}'; + final messageDetails = selectedWidgetName.isEmpty + ? '' + : ' of $selectedWidgetName${implementationWidgetName.isEmpty ? '' : ': $implementationWidgetName'}'; notificationService.pushNotification( NotificationMessage( '$_implementationWidgetMessage$messageDetails.', @@ -965,17 +961,15 @@ class InspectorController extends DisposableController void _updateSelectedErrorFromNode(InspectorTreeNode? node) { final inspectorRef = node?.diagnostic?.valueRef.id; - final errors = - serviceConnection.errorBadgeManager - .erroredItemsForPage(InspectorScreen.id) - .value; + final errors = serviceConnection.errorBadgeManager + .erroredItemsForPage(InspectorScreen.id) + .value; // Check whether the node that was just selected has any errors associated // with it. - var errorIndex = - inspectorRef != null - ? errors.keys.toList().indexOf(inspectorRef) - : null; + var errorIndex = inspectorRef != null + ? errors.keys.toList().indexOf(inspectorRef) + : null; if (errorIndex == -1) { errorIndex = null; } @@ -1001,10 +995,9 @@ class InspectorController extends DisposableController void selectErrorByIndex(int index) { _selectedErrorIndex.value = index; - final errors = - serviceConnection.errorBadgeManager - .erroredItemsForPage(InspectorScreen.id) - .value; + final errors = serviceConnection.errorBadgeManager + .erroredItemsForPage(InspectorScreen.id) + .value; unawaited( updateSelectionFromService(inspectorRef: errors.keys.elementAt(index)), diff --git a/packages/devtools_app/lib/src/screens/inspector_v2/inspector_data_models.dart b/packages/devtools_app/lib/src/screens/inspector_v2/inspector_data_models.dart index b9c5ba894c9..188dabd14b6 100644 --- a/packages/devtools_app/lib/src/screens/inspector_v2/inspector_data_models.dart +++ b/packages/devtools_app/lib/src/screens/inspector_v2/inspector_data_models.dart @@ -104,23 +104,22 @@ List computeRenderSizes({ } /// Data pattern containing a widget's widths or heights. -typedef WidgetSizes = - ({ - /// Whether this record represents a widget's widths or heights. - SizeType type, +typedef WidgetSizes = ({ + /// Whether this record represents a widget's widths or heights. + SizeType type, - /// Either the widget's left (if [type] is [SizeType.widths]) or top (if - /// [type] is [SizeType.heights]) padding. - double paddingA, + /// Either the widget's left (if [type] is [SizeType.widths]) or top (if + /// [type] is [SizeType.heights]) padding. + double paddingA, - /// Either the widget's width (if [type] is [SizeType.widths]) or height (if - /// [type] is [SizeType.heights]). - double widgetSize, + /// Either the widget's width (if [type] is [SizeType.widths]) or height (if + /// [type] is [SizeType.heights]). + double widgetSize, - /// Either the widget's right (if [type] is [SizeType.widths]) or bottom (if - /// [type] is [SizeType.heights]) padding. - double paddingB, - }); + /// Either the widget's right (if [type] is [SizeType.widths]) or bottom (if + /// [type] is [SizeType.heights]) padding. + double paddingB, +}); enum SizeType { widths, heights } @@ -134,16 +133,14 @@ class LayoutProperties { isFlex = node.isFlex, flexFactor = node.flexFactor, flexFit = node.flexFit, - children = - copyLevel == 0 - ? [] - : node.childrenNow - .where((child) => child.size != null) - .map( - (child) => - LayoutProperties(child, copyLevel: copyLevel - 1), - ) - .toList(growable: false) { + children = copyLevel == 0 + ? [] + : node.childrenNow + .where((child) => child.size != null) + .map( + (child) => LayoutProperties(child, copyLevel: copyLevel - 1), + ) + .toList(growable: false) { for (final child in children) { child.parent = this; } @@ -206,10 +203,10 @@ class LayoutProperties { if (constraintsLocal == null) return ''; return constraintsLocal.hasBoundedWidth ? describeAxis( - constraintsLocal.minWidth, - constraintsLocal.maxWidth, - 'w', - ) + constraintsLocal.minWidth, + constraintsLocal.maxWidth, + 'w', + ) : 'width is unconstrained'; } @@ -218,10 +215,10 @@ class LayoutProperties { if (constraintsLocal == null) return ''; return constraintsLocal.hasBoundedHeight ? describeAxis( - constraintsLocal.minHeight, - constraintsLocal.maxHeight, - 'h', - ) + constraintsLocal.minHeight, + constraintsLocal.maxHeight, + 'h', + ) : 'height is unconstrained'; } @@ -459,9 +456,8 @@ class FlexLayoutProperties extends LayoutProperties { static FlexLayoutProperties _buildNode(RemoteDiagnosticsNode node) { final renderObjectJson = node.renderObject!.json; - final properties = - (renderObjectJson['properties'] as List) - .cast>(); + final properties = (renderObjectJson['properties'] as List) + .cast>(); final data = { for (final property in properties) @@ -500,8 +496,9 @@ class FlexLayoutProperties extends LayoutProperties { List get displayChildren { final displayChildren = _displayChildren; if (displayChildren != null) return displayChildren; - return _displayChildren = - startIsTopLeft ? children : children.reversed.toList(); + return _displayChildren = startIsTopLeft + ? children + : children.reversed.toList(); } int? _totalFlex; @@ -522,11 +519,10 @@ class FlexLayoutProperties extends LayoutProperties { num get totalFlex { if (children.isEmpty) return 0; - _totalFlex ??= - children - .map((child) => child.flexFactor ?? 0) - .reduce((value, element) => value + element) - .toInt(); + _totalFlex ??= children + .map((child) => child.flexFactor ?? 0) + .reduce((value, element) => value + element) + .toInt(); return _totalFlex!; } @@ -584,8 +580,9 @@ class FlexLayoutProperties extends LayoutProperties { }) { /// calculate the render empty spaces final freeSpace = dimension(direction) - sum(childrenDimensions(direction)); - final displayMainAxisAlignment = - startIsTopLeft ? mainAxisAlignment : mainAxisAlignment?.reversed; + final displayMainAxisAlignment = startIsTopLeft + ? mainAxisAlignment + : mainAxisAlignment?.reversed; double leadingSpace(double freeSpace) { if (children.isEmpty) return 0.0; @@ -633,8 +630,9 @@ class FlexLayoutProperties extends LayoutProperties { } double largestRenderSize(Axis axis) { - final lrs = - axis == Axis.horizontal ? largestRenderWidth : largestRenderHeight; + final lrs = axis == Axis.horizontal + ? largestRenderWidth + : largestRenderHeight; // use all the space when visualizing cross axis return (axis == direction) ? lrs : maxSizeAvailable(axis); } @@ -660,12 +658,11 @@ class FlexLayoutProperties extends LayoutProperties { ); } else { // uniform cross axis sizes. - double size = - crossAxisAlignment == CrossAxisAlignment.stretch - ? maxSizeAvailable(axis) - : largestSize / - math.max(dimension(axis), 1.0) * - maxSizeAvailable(axis); + double size = crossAxisAlignment == CrossAxisAlignment.stretch + ? maxSizeAvailable(axis) + : largestSize / + math.max(dimension(axis), 1.0) * + maxSizeAvailable(axis); size = math.max(size, smallestRenderSize(axis)); return sizes.map((_) => size).toList(); } @@ -674,10 +671,9 @@ class FlexLayoutProperties extends LayoutProperties { final widths = renderSizes(Axis.horizontal); final heights = renderSizes(Axis.vertical); - final renderFreeSpace = - freeSpace > 0.0 - ? (isMainAxisHorizontal ? widths.last : heights.last) - : 0.0; + final renderFreeSpace = freeSpace > 0.0 + ? (isMainAxisHorizontal ? widths.last : heights.last) + : 0.0; final renderLeadingSpace = leadingSpace(renderFreeSpace); final renderBetweenSpace = betweenSpace(renderFreeSpace); @@ -708,8 +704,9 @@ class FlexLayoutProperties extends LayoutProperties { double calculateCrossAxisOffset(int i) { final maxDimension = maxSizeAvailable(crossAxisDirection); - final usedDimension = - crossAxisDirection == Axis.horizontal ? widths[i] : heights[i]; + final usedDimension = crossAxisDirection == Axis.horizontal + ? widths[i] + : heights[i]; if (crossAxisAlignment == CrossAxisAlignment.start || crossAxisAlignment == CrossAxisAlignment.stretch || @@ -815,10 +812,9 @@ class FlexLayoutProperties extends LayoutProperties { renderProperties.crossAxisOffset, ); } else { - space.crossAxisOffset = - crossAxisAlignment == CrossAxisAlignment.end - ? 0 - : renderProperties.crossAxisDimension; + space.crossAxisOffset = crossAxisAlignment == CrossAxisAlignment.end + ? 0 + : renderProperties.crossAxisDimension; spaces.add(space); } } @@ -826,14 +822,14 @@ class FlexLayoutProperties extends LayoutProperties { } static final _directionNamesToValues = Axis.values.asNameMap(); - static final _mainAxisAlignmentNamesToValues = - MainAxisAlignment.values.asNameMap(); + static final _mainAxisAlignmentNamesToValues = MainAxisAlignment.values + .asNameMap(); static final _mainAxisSizeNamesToValues = MainAxisSize.values.asNameMap(); - static final _crossAxisAlignmentNamesToValues = - CrossAxisAlignment.values.asNameMap(); + static final _crossAxisAlignmentNamesToValues = CrossAxisAlignment.values + .asNameMap(); static final _textDirectionNamesToValues = TextDirection.values.asNameMap(); - static final _verticalDirectionNamesToValues = - VerticalDirection.values.asNameMap(); + static final _verticalDirectionNamesToValues = VerticalDirection.values + .asNameMap(); static final _textBaselineNamesToValues = TextBaseline.values.asNameMap(); } diff --git a/packages/devtools_app/lib/src/screens/inspector_v2/inspector_screen_body.dart b/packages/devtools_app/lib/src/screens/inspector_v2/inspector_screen_body.dart index 91903f21b1e..21bb918f517 100644 --- a/packages/devtools_app/lib/src/screens/inspector_v2/inspector_screen_body.dart +++ b/packages/devtools_app/lib/src/screens/inspector_v2/inspector_screen_body.dart @@ -123,7 +123,10 @@ class InspectorScreenBodyState extends State final widgetTrees = SplitPane( axis: splitAxis, initialFractions: const [0.33, 0.67], - children: [inspectorTree, WidgetDetails(controller: controller)], + children: [ + inspectorTree, + WidgetDetails(controller: controller), + ], ); return Column( children: [ @@ -145,8 +148,8 @@ class InspectorScreenBodyState extends State constraints: constraints, onRefreshInspectorPressed: _manualInspectorRefresh, onSearchVisibleToggle: _onSearchVisibleToggle, - searchFieldBuilder: - () => StatelessSearchField( + searchFieldBuilder: () => + StatelessSearchField( controller: _inspectorTreeController, searchFieldEnabled: true, shouldRequestFocus: searchVisible, @@ -179,17 +182,15 @@ class InspectorScreenBodyState extends State if (errors.isNotEmpty) ValueListenableBuilder( valueListenable: controller.selectedErrorIndex, - builder: - (_, selectedErrorIndex, _) => Positioned( - top: 0, - right: 0, - child: ErrorNavigator( - errors: inspectableErrors, - errorIndex: selectedErrorIndex, - onSelectError: - controller.selectErrorByIndex, - ), - ), + builder: (_, selectedErrorIndex, _) => Positioned( + top: 0, + right: 0, + child: ErrorNavigator( + errors: inspectableErrors, + errorIndex: selectedErrorIndex, + onSelectError: controller.selectErrorByIndex, + ), + ), ), ], ); @@ -269,18 +270,18 @@ class InspectorTreeControls extends StatelessWidget { ), ...!isSearchVisible ? [ - const Spacer(), - ToolbarAction( - icon: Icons.search, - onPressed: onSearchVisibleToggle, - tooltip: 'Search Tree', - ), - ] + const Spacer(), + ToolbarAction( + icon: Icons.search, + onPressed: onSearchVisibleToggle, + tooltip: 'Search Tree', + ), + ] : [ - constraints.maxWidth >= _searchBreakpoint - ? _buildSearchControls() - : const Spacer(), - ], + constraints.maxWidth >= _searchBreakpoint + ? _buildSearchControls() + : const Spacer(), + ], ToolbarAction( icon: Icons.refresh, onPressed: onRefreshInspectorPressed, @@ -332,10 +333,9 @@ class ErrorNavigator extends StatelessWidget { @override Widget build(BuildContext context) { final colorScheme = Theme.of(context).colorScheme; - final label = - errorIndex != null - ? 'Error ${errorIndex! + 1}/${errors.length}' - : 'Errors: ${errors.length}'; + final label = errorIndex != null + ? 'Error ${errorIndex! + 1}/${errors.length}' + : 'Errors: ${errors.length}'; return Container( color: colorScheme.errorContainer, child: Padding( diff --git a/packages/devtools_app/lib/src/screens/inspector_v2/inspector_tree_controller.dart b/packages/devtools_app/lib/src/screens/inspector_v2/inspector_tree_controller.dart index d2521fa4c47..e6692e4a344 100644 --- a/packages/devtools_app/lib/src/screens/inspector_v2/inspector_tree_controller.dart +++ b/packages/devtools_app/lib/src/screens/inspector_v2/inspector_tree_controller.dart @@ -133,12 +133,11 @@ class InspectorTreeController extends DisposableController gac.inspector, gac.inspectorTreeControllerInitialized, nonInteraction: true, - screenMetricsProvider: - () => InspectorScreenMetrics.v2( - inspectorTreeControllerId: gaId, - rootSetCount: _rootSetCount, - rowCount: _rowsInTree.value.length, - ), + screenMetricsProvider: () => InspectorScreenMetrics.v2( + inspectorTreeControllerId: gaId, + rootSetCount: _rootSetCount, + rowCount: _rowsInTree.value.length, + ), ); } @@ -182,12 +181,11 @@ class InspectorTreeController extends DisposableController gac.inspector, gac.inspectorTreeControllerRootChange, nonInteraction: true, - screenMetricsProvider: - () => InspectorScreenMetrics.v2( - inspectorTreeControllerId: gaId, - rootSetCount: ++_rootSetCount, - rowCount: _rowsInTree.value.length, - ), + screenMetricsProvider: () => InspectorScreenMetrics.v2( + inspectorTreeControllerId: gaId, + rootSetCount: ++_rootSetCount, + rowCount: _rowsInTree.value.length, + ), ); } @@ -393,15 +391,14 @@ class InspectorTreeController extends DisposableController refreshTree( updateTreeAction: () { - final nodeToSelect = - selection == null - ? root - : rowAtIndex( - (_rowIndexFromNode(selection!) + indexOffset).clamp( - 0, - _numRows - 1, - ), - )?.node; + final nodeToSelect = selection == null + ? root + : rowAtIndex( + (_rowIndexFromNode(selection!) + indexOffset).clamp( + 0, + _numRows - 1, + ), + )?.node; setSelectedNode(nodeToSelect); return true; }, @@ -633,8 +630,9 @@ class InspectorTreeController extends DisposableController final row = getRowForNode(target); if (row != null) { final rowRect = getBoundingBox(row); - targetRect = - targetRect == null ? rowRect : targetRect.expandToInclude(rowRect); + targetRect = targetRect == null + ? rowRect + : targetRect.expandToInclude(rowRect); } } @@ -692,8 +690,9 @@ class InspectorTreeController extends DisposableController node, node.diagnostic!.childrenNow, expandChildren: expandChildren && styleIsMultiline, - hideableGroupLeader: - inHideableGroup ? (hideableGroupLeader ?? diagnosticsNode) : null, + hideableGroupLeader: inHideableGroup + ? (hideableGroupLeader ?? diagnosticsNode) + : null, ); } else { node.clearChildren(); @@ -741,8 +740,9 @@ class InspectorTreeController extends DisposableController createNode(), child, expandChildren: expandChildren, - hideableGroupLeader: - child.inHideableGroup ? hideableGroupLeader : null, + hideableGroupLeader: child.inHideableGroup + ? hideableGroupLeader + : null, ), ); } @@ -1005,14 +1005,12 @@ class _InspectorTreeState extends State final initialX = rect.left; final initialY = rect.top; - final yOffsetAtViewportTop = - _scrollControllerY.hasClients - ? _scrollControllerY.offset - : _scrollControllerY.initialScrollOffset; - final xOffsetAtViewportLeft = - _scrollControllerX.hasClients - ? _scrollControllerX.offset - : _scrollControllerX.initialScrollOffset; + final yOffsetAtViewportTop = _scrollControllerY.hasClients + ? _scrollControllerY.offset + : _scrollControllerY.initialScrollOffset; + final xOffsetAtViewportLeft = _scrollControllerX.hasClients + ? _scrollControllerX.offset + : _scrollControllerX.initialScrollOffset; final viewPortInScrollControllerSpace = Rect.fromLTWH( xOffsetAtViewportLeft, @@ -1157,8 +1155,8 @@ class _InspectorTreeState extends State ga.timeEnd( screenId, gac.pageReady, - screenMetricsProvider: - () => InspectorScreenMetrics.v2(rowCount: rows.length), + screenMetricsProvider: () => + InspectorScreenMetrics.v2(rowCount: rows.length), ); unawaited( serviceConnection.sendDwdsEvent( @@ -1221,9 +1219,9 @@ class _InspectorTreeState extends State viewportWidth: viewportWidth, error: widget.widgetErrors != null && - inspectorRef != null - ? widget.widgetErrors![inspectorRef] - : null, + inspectorRef != null + ? widget.widgetErrors![inspectorRef] + : null, ); }, childCount: rows.length + 1), controller: _scrollControllerY, @@ -1246,10 +1244,9 @@ class _InspectorTreeState extends State bool get wantKeepAlive => true; } -Paint _defaultPaint(ColorScheme colorScheme) => - Paint() - ..color = colorScheme.treeGuidelineColor - ..strokeWidth = chartLineStrokeWidth; +Paint _defaultPaint(ColorScheme colorScheme) => Paint() + ..color = colorScheme.treeGuidelineColor + ..strokeWidth = chartLineStrokeWidth; /// The distance (on the x-axis) between the center of the widget icon and the /// start of the row, as determined by a percentage of the @@ -1306,10 +1303,9 @@ class _RowPainter extends CustomPainter { final parentExpandCollapseX = _controller.getDepthIndent(row.depth - 1) - distanceFromIconCenterToRowStart; - final width = - showExpandCollapse - ? inspectorColumnIndent * 0.45 - : inspectorColumnIndent * 0.6; + final width = showExpandCollapse + ? inspectorColumnIndent * 0.45 + : inspectorColumnIndent * 0.6; canvas.drawLine( Offset(parentExpandCollapseX, 0.0), Offset(parentExpandCollapseX, inspectorRowHeight * 0.5), @@ -1414,10 +1410,9 @@ class InspectorRowContent extends StatelessWidget { Color? backgroundColor; if (row.isSelected) { - backgroundColor = - hasError - ? colorScheme.errorContainer - : colorScheme.selectedRowBackgroundColor; + backgroundColor = hasError + ? colorScheme.errorContainer + : colorScheme.selectedRowBackgroundColor; } final node = row.node; @@ -1436,16 +1431,16 @@ class InspectorRowContent extends StatelessWidget { children: [ node.showExpandCollapse ? InkWell( - onTap: onToggle, - child: RotationTransition( - turns: expandArrowAnimation, - child: Icon(Icons.expand_more, size: defaultIconSize), - ), - ) + onTap: onToggle, + child: RotationTransition( + turns: expandArrowAnimation, + child: Icon(Icons.expand_more, size: defaultIconSize), + ), + ) : const SizedBox( - width: expandCollapseWidth, - height: defaultSpacing, - ), + width: expandCollapseWidth, + height: defaultSpacing, + ), Expanded( child: Container( color: backgroundColor, @@ -1472,37 +1467,35 @@ class InspectorRowContent extends StatelessWidget { emphasizeNodesFromLocalProject: true, nodeDescriptionHighlightStyle: searchValue.isEmpty || !row.isSearchMatch - ? DiagnosticsTextStyles.regular( - Theme.of(context).colorScheme, - ) - : row.isSelected - ? theme.searchMatchHighlightStyleFocused - : theme.searchMatchHighlightStyle, - actionLabel: - isHideableGroupLeader - ? diagnostic!.groupIsHidden - ? '(expand)' - : '(collapse)' - : null, - actionCallback: - isHideableGroupLeader - ? () { - controller.refreshTree( - updateTreeAction: () { - controller.toggleHiddenGroup(node); - return true; - }, - ); - } - : null, + ? DiagnosticsTextStyles.regular( + Theme.of(context).colorScheme, + ) + : row.isSelected + ? theme.searchMatchHighlightStyleFocused + : theme.searchMatchHighlightStyle, + actionLabel: isHideableGroupLeader + ? diagnostic!.groupIsHidden + ? '(expand)' + : '(collapse)' + : null, + actionCallback: isHideableGroupLeader + ? () { + controller.refreshTree( + updateTreeAction: () { + controller.toggleHiddenGroup(node); + return true; + }, + ); + } + : null, customDescription: isHideableGroupLeader && diagnostic!.groupIsHidden - ? '${diagnostic.hideableGroupSubordinates!.length + 1} more widgets...' - : null, + ? '${diagnostic.hideableGroupSubordinates!.length + 1} more widgets...' + : null, customIconName: isHideableGroupLeader && diagnostic!.groupIsHidden - ? 'HiddenGroup' - : null, + ? 'HiddenGroup' + : null, ), ), ), diff --git a/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/box/box.dart b/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/box/box.dart index 73bacc7aef3..bfd22ddd984 100644 --- a/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/box/box.dart +++ b/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/box/box.dart @@ -173,8 +173,9 @@ class BoxLayoutExplorerWidget extends StatelessWidget { heights: displayHeights, ); - final widgetColor = - WidgetTheme.fromName(propertiesLocal.node.description).color; + final widgetColor = WidgetTheme.fromName( + propertiesLocal.node.description, + ).color; return Column( children: [ Container( @@ -350,10 +351,9 @@ WidgetSizes _simpleFractionalLayout({ final paddingASize = sizes.paddingA; final paddingBSize = sizes.paddingB; - final paddingFraction = - paddingASize > 0 && paddingBSize > 0 - ? _narrowPaddingVisualizerPercent - : _widePaddingVisualizerPercent; + final paddingFraction = paddingASize > 0 && paddingBSize > 0 + ? _narrowPaddingVisualizerPercent + : _widePaddingVisualizerPercent; final paddingAFraction = paddingASize > 0 ? paddingFraction : 0.0; final paddingBFraction = paddingBSize > 0 ? paddingFraction : 0.0; diff --git a/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/flex/flex.dart b/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/flex/flex.dart index 8b533031be9..c91256411d8 100644 --- a/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/flex/flex.dart +++ b/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/flex/flex.dart @@ -55,23 +55,22 @@ class FlexLayoutExplorerWidgetState Color horizontalColor(ColorScheme colorScheme) => properties!.isMainAxisHorizontal - ? colorScheme.mainAxisColor - : colorScheme.crossAxisColor; + ? colorScheme.mainAxisColor + : colorScheme.crossAxisColor; - Color verticalColor(ColorScheme colorScheme) => - properties!.isMainAxisVertical - ? colorScheme.mainAxisColor - : colorScheme.crossAxisColor; + Color verticalColor(ColorScheme colorScheme) => properties!.isMainAxisVertical + ? colorScheme.mainAxisColor + : colorScheme.crossAxisColor; Color horizontalTextColor(ColorScheme colorScheme) => properties!.isMainAxisHorizontal - ? colorScheme.mainAxisTextColor - : colorScheme.crossAxisTextColor; + ? colorScheme.mainAxisTextColor + : colorScheme.crossAxisTextColor; Color verticalTextColor(ColorScheme colorScheme) => properties!.isMainAxisVertical - ? colorScheme.mainAxisTextColor - : colorScheme.crossAxisTextColor; + ? colorScheme.mainAxisTextColor + : colorScheme.crossAxisTextColor; String get flexType => properties!.type; @@ -122,10 +121,9 @@ class FlexLayoutExplorerWidgetState Widget _buildAxisAlignmentDropdown(Axis axis, ThemeData theme) { final colorScheme = theme.colorScheme; - final color = - axis == direction - ? colorScheme.mainAxisTextColor - : colorScheme.crossAxisTextColor; + final color = axis == direction + ? colorScheme.mainAxisTextColor + : colorScheme.crossAxisTextColor; List alignmentEnumEntries; Object? selected; final propertiesLocal = properties!; @@ -153,10 +151,9 @@ class FlexLayoutExplorerWidgetState isExpanded: true, // Avoid showing an underline for the main axis and cross-axis drop downs. underline: const SizedBox(), - iconEnabledColor: - axis == propertiesLocal.direction - ? colorScheme.mainAxisColor - : colorScheme.crossAxisColor, + iconEnabledColor: axis == propertiesLocal.direction + ? colorScheme.mainAxisColor + : colorScheme.crossAxisColor, selectedItemBuilder: (context) { return [ for (final alignment in alignmentEnumEntries) @@ -177,13 +174,13 @@ class FlexLayoutExplorerWidgetState child: Image.asset( (axis == direction) ? mainAxisAssetImageUrl( - direction, - alignment as MainAxisAlignment, - ) + direction, + alignment as MainAxisAlignment, + ) : crossAxisAssetImageUrl( - direction, - alignment as CrossAxisAlignment, - ), + direction, + alignment as CrossAxisAlignment, + ), height: axisAlignmentAssetImageHeight, fit: BoxFit.fitHeight, color: color, @@ -216,13 +213,13 @@ class FlexLayoutExplorerWidgetState child: Image.asset( (axis == direction) ? mainAxisAssetImageUrl( - direction, - alignment as MainAxisAlignment, - ) + direction, + alignment as MainAxisAlignment, + ) : crossAxisAssetImageUrl( - direction, - alignment as CrossAxisAlignment, - ), + direction, + alignment as CrossAxisAlignment, + ), fit: BoxFit.fitHeight, color: color, ), @@ -238,14 +235,13 @@ class FlexLayoutExplorerWidgetState // if the axis is the main axis the type should be [MainAxisAlignment] // if the axis is the cross axis the type should be [CrossAxisAlignment] FlexLayoutProperties changedProperties; - changedProperties = - axis == direction - ? propertiesLocal.copyWith( - mainAxisAlignment: newSelection as MainAxisAlignment?, - ) - : propertiesLocal.copyWith( - crossAxisAlignment: newSelection as CrossAxisAlignment?, - ); + changedProperties = axis == direction + ? propertiesLocal.copyWith( + mainAxisAlignment: newSelection as MainAxisAlignment?, + ) + : propertiesLocal.copyWith( + crossAxisAlignment: newSelection as CrossAxisAlignment?, + ); final valueRef = propertiesLocal.node.valueRef; markAsDirty(); await objectGroup!.invokeSetFlexProperties( @@ -430,8 +426,8 @@ class _VisualizeFlexChildrenState extends State { lastHighlighted = widget.highlighted; if (widget.highlighted != null) { WidgetsBinding.instance.addPostFrameCallback((_) { - final selectedRenderObject = - selectedChildKey.currentContext?.findRenderObject(); + final selectedRenderObject = selectedChildKey.currentContext + ?.findRenderObject(); if (selectedRenderObject != null && widget.scrollController.hasClients) { unawaited( @@ -476,14 +472,12 @@ class _VisualizeFlexChildrenState extends State { maxSizeAvailable: maxSizeAvailable, ); - final renderProperties = - childrenAndMainAxisSpacesRenderProps - .where((renderProps) => !renderProps.isFreeSpace) - .toList(); - final mainAxisSpaces = - childrenAndMainAxisSpacesRenderProps - .where((renderProps) => renderProps.isFreeSpace) - .toList(); + final renderProperties = childrenAndMainAxisSpacesRenderProps + .where((renderProps) => !renderProps.isFreeSpace) + .toList(); + final mainAxisSpaces = childrenAndMainAxisSpacesRenderProps + .where((renderProps) => renderProps.isFreeSpace) + .toList(); final crossAxisSpaces = widget.properties.crossAxisSpaces( childrenRenderProperties: renderProperties, maxSizeAvailable: maxSizeAvailable, @@ -529,27 +523,24 @@ class _VisualizeFlexChildrenState extends State { scrollDirection: widget.properties.direction, controller: widget.scrollController, child: ConstrainedBox( - constraints: - BoxConstraints( - minWidth: maxWidth, - minHeight: maxHeight, - maxWidth: - widget.direction == Axis.horizontal - ? sum( - childrenAndMainAxisSpacesRenderProps.map( - (renderSize) => renderSize.width, - ), - ) - : maxWidth, - maxHeight: - widget.direction == Axis.vertical - ? sum( - childrenAndMainAxisSpacesRenderProps.map( - (renderSize) => renderSize.height, - ), - ) - : maxHeight, - ).normalize(), + constraints: BoxConstraints( + minWidth: maxWidth, + minHeight: maxHeight, + maxWidth: widget.direction == Axis.horizontal + ? sum( + childrenAndMainAxisSpacesRenderProps.map( + (renderSize) => renderSize.width, + ), + ) + : maxWidth, + maxHeight: widget.direction == Axis.vertical + ? sum( + childrenAndMainAxisSpacesRenderProps.map( + (renderSize) => renderSize.height, + ), + ) + : maxHeight, + ).normalize(), child: Stack( children: [ LayoutExplorerBackground(colorScheme: colorScheme), @@ -618,10 +609,9 @@ class FlexChildVisualizer extends StatelessWidget { Widget buildMenuitemChild(int? flexFactor) { return Text( 'flex: $flexFactor', - style: - flexFactor == propertiesLocal.flexFactor - ? theme.boldTextStyle.copyWith(color: emphasizedTextColor) - : theme.regularTextStyleWithColor(emphasizedTextColor), + style: flexFactor == propertiesLocal.flexFactor + ? theme.boldTextStyle.copyWith(color: emphasizedTextColor) + : theme.regularTextStyleWithColor(emphasizedTextColor), ); } @@ -725,20 +715,15 @@ class FlexChildVisualizer extends StatelessWidget { final horizontal = rootLocal.isMainAxisHorizontal; late Size size; - size = - propertiesLocal.hasFlexFactor - ? SizeTween( - begin: Size( - horizontal - ? minRenderWidth - entranceMargin - : renderSize.width, - vertical - ? minRenderHeight - entranceMargin - : renderSize.height, - ), - end: renderSize, - ).evaluate(state.entranceCurve)! - : renderSize; + size = propertiesLocal.hasFlexFactor + ? SizeTween( + begin: Size( + horizontal ? minRenderWidth - entranceMargin : renderSize.width, + vertical ? minRenderHeight - entranceMargin : renderSize.height, + ), + end: renderSize, + ).evaluate(state.entranceCurve)! + : renderSize; // Not-expanded widgets enter much faster. return Opacity( opacity: min([state.entranceCurve.value * 5, 1.0]), diff --git a/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/flex/utils.dart b/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/flex/utils.dart index 14c775f646f..5e67d1e3117 100644 --- a/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/flex/utils.dart +++ b/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/flex/utils.dart @@ -80,12 +80,11 @@ class AnimatedFlexLayoutProperties } @override - double get crossAxisDimension => - lerpDouble( - begin.crossAxisDimension, - end.crossAxisDimension, - animation.value, - )!; + double get crossAxisDimension => lerpDouble( + begin.crossAxisDimension, + end.crossAxisDimension, + animation.value, + )!; @override Axis get crossAxisDirection => end.crossAxisDirection; @@ -115,12 +114,11 @@ class AnimatedFlexLayoutProperties bool get isMainAxisVertical => end.isMainAxisVertical; @override - double get mainAxisDimension => - lerpDouble( - begin.mainAxisDimension, - end.mainAxisDimension, - animation.value, - )!; + double get mainAxisDimension => lerpDouble( + begin.mainAxisDimension, + end.mainAxisDimension, + animation.value, + )!; @override MainAxisSize? get mainAxisSize => end.mainAxisSize; diff --git a/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/ui/arrow.dart b/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/ui/arrow.dart index 799bdd99d46..3adb4e615cb 100644 --- a/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/ui/arrow.dart +++ b/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/ui/arrow.dart @@ -13,10 +13,9 @@ const defaultDistanceToArrow = 4.0; enum ArrowType { up, left, right, down } -Axis axis(ArrowType type) => - (type == ArrowType.up || type == ArrowType.down) - ? Axis.vertical - : Axis.horizontal; +Axis axis(ArrowType type) => (type == ArrowType.up || type == ArrowType.down) + ? Axis.vertical + : Axis.horizontal; /// Widget that draws a bidirectional arrow around another widget. /// @@ -49,10 +48,12 @@ class ArrowWrapper extends StatelessWidget { }) : assert(arrowHeadSize >= 0.0), assert(childMarginFromArrow >= 0.0), isBidirectional = true, - startArrowType = - direction == Axis.horizontal ? ArrowType.left : ArrowType.up, - endArrowType = - direction == Axis.horizontal ? ArrowType.right : ArrowType.down; + startArrowType = direction == Axis.horizontal + ? ArrowType.left + : ArrowType.up, + endArrowType = direction == Axis.horizontal + ? ArrowType.right + : ArrowType.down; final Color arrowColor; final double arrowHeadSize; @@ -92,11 +93,10 @@ class ArrowWrapper extends StatelessWidget { headSize: arrowHeadSize, strokeWidth: arrowStrokeWidth, type: startArrowType, - shouldDrawHead: - isBidirectional - ? true - : (startArrowType == ArrowType.left || - startArrowType == ArrowType.up), + shouldDrawHead: isBidirectional + ? true + : (startArrowType == ArrowType.left || + startArrowType == ArrowType.up), ), ), ), @@ -112,11 +112,10 @@ class ArrowWrapper extends StatelessWidget { headSize: arrowHeadSize, strokeWidth: arrowStrokeWidth, type: endArrowType, - shouldDrawHead: - isBidirectional - ? true - : (endArrowType == ArrowType.right || - endArrowType == ArrowType.down), + shouldDrawHead: isBidirectional + ? true + : (endArrowType == ArrowType.right || + endArrowType == ArrowType.down), ), ), ), @@ -199,10 +198,9 @@ class _ArrowPainter extends CustomPainter { @override void paint(Canvas canvas, Size size) { - final paint = - Paint() - ..color = color - ..strokeWidth = strokeWidth; + final paint = Paint() + ..color = color + ..strokeWidth = strokeWidth; final originX = size.width / 2, originY = size.height / 2; Offset lineStartingPoint = Offset.zero; @@ -235,12 +233,11 @@ class _ArrowPainter extends CustomPainter { p3 = Offset(originX + headSizeDividedBy2, startingY); break; } - final path = - Path() - ..moveTo(p1.dx, p1.dy) - ..lineTo(p2.dx, p2.dy) - ..lineTo(p3.dx, p3.dy) - ..close(); + final path = Path() + ..moveTo(p1.dx, p1.dy) + ..lineTo(p2.dx, p2.dy) + ..lineTo(p3.dx, p3.dy) + ..close(); canvas.drawPath(path, paint); switch (type) { diff --git a/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/ui/dimension.dart b/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/ui/dimension.dart index c852da24d0b..7dfb1b8e2c1 100644 --- a/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/ui/dimension.dart +++ b/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/ui/dimension.dart @@ -15,10 +15,9 @@ Widget dimensionDescription( final text = Text.rich( description, textAlign: TextAlign.center, - style: - overflow - ? overflowingDimensionIndicatorTextStyle(colorScheme) - : dimensionIndicatorTextStyle, + style: overflow + ? overflowingDimensionIndicatorTextStyle(colorScheme) + : dimensionIndicatorTextStyle, overflow: TextOverflow.ellipsis, ); if (overflow) { diff --git a/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/ui/overflow_indicator_painter.dart b/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/ui/overflow_indicator_painter.dart index 702af0122af..2295666ceb5 100644 --- a/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/ui/overflow_indicator_painter.dart +++ b/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/ui/overflow_indicator_painter.dart @@ -34,15 +34,14 @@ class OverflowIndicatorPainter extends CustomPainter { /// since all of them are private. static const black = Color(0xBF000000); static const yellow = Color(0xBFFFFF00); - static final indicatorPaint = - Paint() - ..shader = ui.Gradient.linear( - const Offset(0.0, 0.0), - const Offset(10.0, 10.0), - [black, yellow, yellow, black], - [0.25, 0.25, 0.75, 0.75], - TileMode.repeated, - ); + static final indicatorPaint = Paint() + ..shader = ui.Gradient.linear( + const Offset(0.0, 0.0), + const Offset(10.0, 10.0), + [black, yellow, yellow, black], + [0.25, 0.25, 0.75, 0.75], + TileMode.repeated, + ); @override void paint(Canvas canvas, Size size) { diff --git a/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/ui/utils.dart b/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/ui/utils.dart index 0f73c55c6c3..5b4b1ec2d4f 100644 --- a/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/ui/utils.dart +++ b/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/ui/utils.dart @@ -157,22 +157,21 @@ class WidgetVisualizer extends StatelessWidget { decoration: BoxDecoration( border: Border.all( color: borderColor, - width: - isSelected ? _borderSelectedWidth : _borderUnselectedWidth, + width: isSelected + ? _borderSelectedWidth + : _borderUnselectedWidth, ), - color: - isSelected - ? theme.canvasColor.brighten() - : theme.canvasColor.darken(), - boxShadow: - isSelected - ? [ - BoxShadow( - color: Colors.black.withAlpha(255 ~/ 2), - blurRadius: 10, - ), - ] - : null, + color: isSelected + ? theme.canvasColor.brighten() + : theme.canvasColor.darken(), + boxShadow: isSelected + ? [ + BoxShadow( + color: Colors.black.withAlpha(255 ~/ 2), + blurRadius: 10, + ), + ] + : null, ), child: Stack( children: [ @@ -187,29 +186,26 @@ class WidgetVisualizer extends StatelessWidget { ), Container( margin: EdgeInsets.only( - right: - overflowSide == OverflowSide.right - ? _overflowIndicatorSize - : 0.0, - bottom: - overflowSide == OverflowSide.bottom - ? _overflowIndicatorSize - : 0.0, + right: overflowSide == OverflowSide.right + ? _overflowIndicatorSize + : 0.0, + bottom: overflowSide == OverflowSide.bottom + ? _overflowIndicatorSize + : 0.0, ), - child: - isFlex - ? FlexWidgetVisualizer( - title: title, - largeTitle: largeTitle, - borderColor: borderColor, - hint: hint, - child: child, - ) - : BoxWidgetVisualizer( - borderColor: borderColor, - title: title, - properties: properties, - ), + child: isFlex + ? FlexWidgetVisualizer( + title: title, + largeTitle: largeTitle, + borderColor: borderColor, + hint: hint, + child: child, + ) + : BoxWidgetVisualizer( + borderColor: borderColor, + title: title, + properties: properties, + ), ), ], ), @@ -255,10 +251,9 @@ class FlexWidgetVisualizer extends StatelessWidget { Flexible( child: Container( constraints: BoxConstraints( - maxWidth: - largeTitle - ? defaultMaxRenderWidth - : minRenderWidth * widgetTitleMaxWidthPercentage, + maxWidth: largeTitle + ? defaultMaxRenderWidth + : minRenderWidth * widgetTitleMaxWidthPercentage, ), decoration: BoxDecoration(color: borderColor), padding: const EdgeInsets.all(densePadding), @@ -303,7 +298,9 @@ class BoxWidgetVisualizer extends StatelessWidget { return Column( mainAxisSize: MainAxisSize.min, children: [ - Center(child: WidgetLabel(labelColor: borderColor, labelText: title)), + Center( + child: WidgetLabel(labelColor: borderColor, labelText: title), + ), Expanded( child: Column( mainAxisAlignment: MainAxisAlignment.center, @@ -444,10 +441,10 @@ class AnimatedLayoutProperties final constraintsLocal = constraints!; return constraintsLocal.hasBoundedWidth ? LayoutProperties.describeAxis( - constraintsLocal.minWidth, - constraintsLocal.maxWidth, - 'w', - ) + constraintsLocal.minWidth, + constraintsLocal.maxWidth, + 'w', + ) : 'w=unconstrained'; } @@ -456,10 +453,10 @@ class AnimatedLayoutProperties final constraintsLocal = constraints!; return constraintsLocal.hasBoundedHeight ? LayoutProperties.describeAxis( - constraintsLocal.minHeight, - constraintsLocal.maxHeight, - 'h', - ) + constraintsLocal.minHeight, + constraintsLocal.maxHeight, + 'h', + ) : 'h=unconstrained'; } @@ -593,17 +590,15 @@ class PositionedBackgroundLabel extends StatelessWidget { Widget build(BuildContext context) { return Column( // Push to the bottom if there is no padding on the top. - mainAxisAlignment: - !hasTopPadding && hasBottomPadding - ? MainAxisAlignment.end - : MainAxisAlignment.start, + mainAxisAlignment: !hasTopPadding && hasBottomPadding + ? MainAxisAlignment.end + : MainAxisAlignment.start, children: [ Row( // Push to the right if there is no padding on the left. - mainAxisAlignment: - (!hasLeftPadding && hasRightPadding) - ? MainAxisAlignment.end - : MainAxisAlignment.start, + mainAxisAlignment: (!hasLeftPadding && hasRightPadding) + ? MainAxisAlignment.end + : MainAxisAlignment.start, children: [ Flexible( child: WidgetLabel( diff --git a/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/ui/widget_constraints.dart b/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/ui/widget_constraints.dart index ce67dbc057a..70f9c9f1835 100644 --- a/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/ui/widget_constraints.dart +++ b/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/ui/widget_constraints.dart @@ -51,9 +51,9 @@ class VisualizeWidthAndHeightWithConstraints extends StatelessWidget { text: ' (${propertiesLocal.describeHeightConstraints()})', style: propertiesLocal.constraints!.hasBoundedHeight || - !warnIfUnconstrained - ? null - : TextStyle(color: colorScheme.unconstrainedColor), + !warnIfUnconstrained + ? null + : TextStyle(color: colorScheme.unconstrainedColor), ), ], if (showOverflowHeight) @@ -111,9 +111,9 @@ class VisualizeWidthAndHeightWithConstraints extends StatelessWidget { text: '(${propertiesLocal.describeWidthConstraints()})', style: propertiesLocal.constraints!.hasBoundedWidth || - !warnIfUnconstrained - ? null - : TextStyle(color: colorScheme.unconstrainedColor), + !warnIfUnconstrained + ? null + : TextStyle(color: colorScheme.unconstrainedColor), ), ], if (showChildrenWidthsSum) diff --git a/packages/devtools_app/lib/src/screens/inspector_v2/widget_properties/properties_view.dart b/packages/devtools_app/lib/src/screens/inspector_v2/widget_properties/properties_view.dart index 9900966831b..1822d718819 100644 --- a/packages/devtools_app/lib/src/screens/inspector_v2/widget_properties/properties_view.dart +++ b/packages/devtools_app/lib/src/screens/inspector_v2/widget_properties/properties_view.dart @@ -227,8 +227,9 @@ class _PropertiesViewState extends State { final layoutExplorerOffset = includeLayoutExplorer ? 1 : 0; // If there are no properties to display, include a single row that says as // much. - final propertyRowsCount = - _sortedProperties.isEmpty ? 1 : _sortedProperties.length; + final propertyRowsCount = _sortedProperties.isEmpty + ? 1 + : _sortedProperties.length; // If the layout explorer is available, it is the first row. final totalRowsCount = propertyRowsCount + layoutExplorerOffset; @@ -258,8 +259,9 @@ class _PropertiesViewState extends State { return DecoratedPropertiesTableRow( index: index + layoutExplorerOffset, child: Flex( - direction: - horizontalLayout ? Axis.horizontal : Axis.vertical, + direction: horizontalLayout + ? Axis.horizontal + : Axis.vertical, children: [ Padding( padding: const EdgeInsets.all(largeSpacing), @@ -275,10 +277,9 @@ class _PropertiesViewState extends State { ), if (layoutPropertiesList != null) Padding( - padding: - horizontalLayout - ? const EdgeInsets.only(left: largeSpacing) - : const EdgeInsets.only(bottom: largeSpacing), + padding: horizontalLayout + ? const EdgeInsets.only(left: largeSpacing) + : const EdgeInsets.only(bottom: largeSpacing), child: layoutPropertiesList, ), ], @@ -345,11 +346,8 @@ class LayoutPropertiesList extends StatelessWidget { LayoutWidthsAndHeights? get widthsAndHeights => widgetHeights != null && widgetWidths != null - ? LayoutWidthsAndHeights( - widths: widgetWidths!, - heights: widgetHeights!, - ) - : null; + ? LayoutWidthsAndHeights(widths: widgetWidths!, heights: widgetHeights!) + : null; @override Widget build(BuildContext context) { diff --git a/packages/devtools_app/lib/src/screens/logging/_log_details.dart b/packages/devtools_app/lib/src/screens/logging/_log_details.dart index b691797d8aa..e32a9015829 100644 --- a/packages/devtools_app/lib/src/screens/logging/_log_details.dart +++ b/packages/devtools_app/lib/src/screens/logging/_log_details.dart @@ -88,16 +88,16 @@ class _LogDetailsState extends State controller: scrollController, child: preferences.logging.detailsFormat.value == - LoggingDetailsFormat.text || - (log?.encodedDetails ?? '').isEmpty - ? Padding( - padding: const EdgeInsets.all(denseSpacing), - child: SelectableText( - log?.prettyPrinted() ?? '', - textAlign: TextAlign.left, - ), - ) - : JsonViewer(encodedJson: log!.encodedDetails), + LoggingDetailsFormat.text || + (log?.encodedDetails ?? '').isEmpty + ? Padding( + padding: const EdgeInsets.all(denseSpacing), + child: SelectableText( + log?.prettyPrinted() ?? '', + textAlign: TextAlign.left, + ), + ) + : JsonViewer(encodedJson: log!.encodedDetails), ), ), ); @@ -144,26 +144,27 @@ class LogDetailsFormatButton extends StatelessWidget { @override Widget build(BuildContext context) { final currentlyUsingTextFormat = format == LoggingDetailsFormat.text; - final tooltip = - currentlyUsingTextFormat ? viewAsJsonTooltip : viewAsRawTextTooltip; + final tooltip = currentlyUsingTextFormat + ? viewAsJsonTooltip + : viewAsRawTextTooltip; void togglePreference() => preferences.logging.detailsFormat.value = format.opposite(); return currentlyUsingTextFormat ? Padding( - // This padding aligns this button with the copy button. - padding: const EdgeInsets.only(bottom: borderPadding), - child: SmallAction( + // This padding aligns this button with the copy button. + padding: const EdgeInsets.only(bottom: borderPadding), + child: SmallAction( + tooltip: tooltip, + onPressed: togglePreference, + child: Text(' { } ', style: Theme.of(context).regularTextStyle), + ), + ) + : ToolbarAction( + icon: Icons.text_fields, tooltip: tooltip, onPressed: togglePreference, - child: Text(' { } ', style: Theme.of(context).regularTextStyle), - ), - ) - : ToolbarAction( - icon: Icons.text_fields, - tooltip: tooltip, - onPressed: togglePreference, - size: defaultIconSize, - ); + size: defaultIconSize, + ); } } diff --git a/packages/devtools_app/lib/src/screens/logging/_when_column.dart b/packages/devtools_app/lib/src/screens/logging/_when_column.dart index 5563c297e90..53eaf670944 100644 --- a/packages/devtools_app/lib/src/screens/logging/_when_column.dart +++ b/packages/devtools_app/lib/src/screens/logging/_when_column.dart @@ -20,18 +20,16 @@ class WhenColumn extends ColumnData { int getValue(LogData dataObject) => dataObject.timestamp ?? -1; @override - String getDisplayValue(LogData dataObject) => - dataObject.timestamp == null - ? '' - : timeFormat.format( - DateTime.fromMillisecondsSinceEpoch(dataObject.timestamp!), - ); + String getDisplayValue(LogData dataObject) => dataObject.timestamp == null + ? '' + : timeFormat.format( + DateTime.fromMillisecondsSinceEpoch(dataObject.timestamp!), + ); @override - String getTooltip(LogData dataObject) => - dataObject.timestamp == null - ? '' - : dateTimeFormat.format( - DateTime.fromMillisecondsSinceEpoch(dataObject.timestamp!), - ); + String getTooltip(LogData dataObject) => dataObject.timestamp == null + ? '' + : dateTimeFormat.format( + DateTime.fromMillisecondsSinceEpoch(dataObject.timestamp!), + ); } diff --git a/packages/devtools_app/lib/src/screens/logging/logging_controller.dart b/packages/devtools_app/lib/src/screens/logging/logging_controller.dart index f8cbe73e49b..eb8daafa106 100644 --- a/packages/devtools_app/lib/src/screens/logging/logging_controller.dart +++ b/packages/devtools_app/lib/src/screens/logging/logging_controller.dart @@ -153,9 +153,8 @@ class LoggingController extends DevToolsScreenController SettingFilter( id: _minLogLevelFilterId, name: 'Hide logs below the minimum log level', - includeCallback: - (LogData element, int currentFilterValue) => - element.level >= currentFilterValue, + includeCallback: (LogData element, int currentFilterValue) => + element.level >= currentFilterValue, enabledCallback: (int filterValue) => filterValue > Level.ALL.value, possibleValues: _possibleLogLevels.map((l) => l.value).toList(), possibleValueDisplays: _possibleLogLevels.map((l) => l.name).toList(), @@ -168,11 +167,9 @@ class LoggingController extends DevToolsScreenController name: 'Hide verbose Flutter framework logs (initialization, frame ' 'times, image sizes)', - includeCallback: - (log) => - !_verboseFlutterFrameworkLogKinds.any( - (kind) => kind.caseInsensitiveEquals(log.kind), - ), + includeCallback: (log) => !_verboseFlutterFrameworkLogKinds.any( + (kind) => kind.caseInsensitiveEquals(log.kind), + ), defaultValue: true, ), ToggleFilter( @@ -180,11 +177,9 @@ class LoggingController extends DevToolsScreenController name: 'Hide verbose Flutter service logs (service extension state ' 'changes)', - includeCallback: - (log) => - !_verboseFlutterServiceLogKinds.any( - (kind) => kind.caseInsensitiveEquals(log.kind), - ), + includeCallback: (log) => !_verboseFlutterServiceLogKinds.any( + (kind) => kind.caseInsensitiveEquals(log.kind), + ), defaultValue: true, ), ], @@ -197,8 +192,8 @@ class LoggingController extends DevToolsScreenController ]; static final _possibleLogLevels = Level.LEVELS - // Omit Level.OFF from the possible minimum levels. - .where((level) => level != Level.OFF); + // Omit Level.OFF from the possible minimum levels. + .where((level) => level != Level.OFF); static const _kindFilterId = 'logging-kind-filter'; static const _isolateFilterId = 'logging-isolate-filter'; @@ -271,11 +266,10 @@ class LoggingController extends DevToolsScreenController String label; - label = - totalCount == showingCount - ? nf.format(totalCount) - : 'showing ${nf.format(showingCount)} of ' - '${nf.format(totalCount)}'; + label = totalCount == showingCount + ? nf.format(totalCount) + : 'showing ${nf.format(showingCount)} of ' + '${nf.format(totalCount)}'; label = '$label ${pluralize('event', totalCount)}'; diff --git a/packages/devtools_app/lib/src/screens/logging/logging_controls.dart b/packages/devtools_app/lib/src/screens/logging/logging_controls.dart index 824cdb715be..45808d1eb4c 100644 --- a/packages/devtools_app/lib/src/screens/logging/logging_controls.dart +++ b/packages/devtools_app/lib/src/screens/logging/logging_controls.dart @@ -37,15 +37,14 @@ class LoggingControls extends StatelessWidget { // TODO(kenz): fix focus issue when state is refreshed child: ValueListenableBuilder( valueListenable: controller.filteredData, - builder: - (context, _, _) => SearchField( - searchFieldWidth: - isScreenWiderThan(context, _loggingMinVerboseWidth) - ? wideSearchFieldWidth - : defaultSearchFieldWidth, - searchController: controller, - searchFieldEnabled: controller.filteredData.value.isNotEmpty, - ), + builder: (context, _, _) => SearchField( + searchFieldWidth: + isScreenWiderThan(context, _loggingMinVerboseWidth) + ? wideSearchFieldWidth + : defaultSearchFieldWidth, + searchController: controller, + searchFieldEnabled: controller.filteredData.value.isNotEmpty, + ), ), ), const SizedBox(width: denseSpacing), @@ -57,10 +56,9 @@ class LoggingControls extends StatelessWidget { ), const SizedBox(width: denseSpacing), CopyToClipboardControl( - dataProvider: - () => controller.filteredData.value - .map((e) => '${e.timestamp} [${e.kind}] ${e.prettyPrinted()}') - .joinWithTrailing('\n'), + dataProvider: () => controller.filteredData.value + .map((e) => '${e.timestamp} [${e.kind}] ${e.prettyPrinted()}') + .joinWithTrailing('\n'), tooltip: 'Copy filtered logs', ), const SizedBox(width: denseSpacing), diff --git a/packages/devtools_app/lib/src/screens/logging/logging_screen.dart b/packages/devtools_app/lib/src/screens/logging/logging_screen.dart index 7344d031a84..2b68a9dc1fe 100644 --- a/packages/devtools_app/lib/src/screens/logging/logging_screen.dart +++ b/packages/devtools_app/lib/src/screens/logging/logging_screen.dart @@ -70,10 +70,9 @@ class _LoggingScreenState extends State Expanded( child: SplitPane( axis: splitAxis, - initialFractions: - splitAxis == Axis.vertical - ? const [0.8, 0.2] - : const [0.7, 0.3], + initialFractions: splitAxis == Axis.vertical + ? const [0.8, 0.2] + : const [0.7, 0.3], children: [ RoundedOutlinedBorder( clip: true, diff --git a/packages/devtools_app/lib/src/screens/logging/metadata.dart b/packages/devtools_app/lib/src/screens/logging/metadata.dart index 40a8d851560..8babf3b1a74 100644 --- a/packages/devtools_app/lib/src/screens/logging/metadata.dart +++ b/packages/devtools_app/lib/src/screens/logging/metadata.dart @@ -145,15 +145,13 @@ abstract class MetadataChip extends StatelessWidget { decoration: BoxDecoration( color: backgroundColor, borderRadius: BorderRadius.circular(_borderRadius), - border: - outlined - ? Border.all(color: theme.colorScheme.subtleTextColor) - : null, + border: outlined + ? Border.all(color: theme.colorScheme.subtleTextColor) + : null, ), - margin: - includeLeadingMargin - ? const EdgeInsets.only(left: denseSpacing) - : null, + margin: includeLeadingMargin + ? const EdgeInsets.only(left: denseSpacing) + : null, padding: const EdgeInsets.symmetric( horizontal: horizontalPadding, vertical: verticalPadding, @@ -305,9 +303,8 @@ class ZoneChip extends MetadataChip { super.outlined = false, }) : super( text: name, - tooltip: - identityHashCode != null - ? 'Zone identityHashCode: $identityHashCode' - : null, + tooltip: identityHashCode != null + ? 'Zone identityHashCode: $identityHashCode' + : null, ); } diff --git a/packages/devtools_app/lib/src/screens/memory/framework/memory_controller.dart b/packages/devtools_app/lib/src/screens/memory/framework/memory_controller.dart index 7843ae0a61a..9a54884e24d 100644 --- a/packages/devtools_app/lib/src/screens/memory/framework/memory_controller.dart +++ b/packages/devtools_app/lib/src/screens/memory/framework/memory_controller.dart @@ -129,17 +129,17 @@ class MemoryController extends DevToolsScreenController chart = MemoryChartPaneController(data: offlineData?.chart ?? ChartData()); - final rootPackage = - isConnected - ? serviceConnection.serviceManager.rootInfoNow().package! - : null; + final rootPackage = isConnected + ? serviceConnection.serviceManager.rootInfoNow().package! + : null; diff = diffPaneController ?? offlineData?.diff ?? DiffPaneController( - loader: - isConnected ? HeapGraphLoaderRuntime(chart.data.timeline) : null, + loader: isConnected + ? HeapGraphLoaderRuntime(chart.data.timeline) + : null, rootPackage: rootPackage, ); diff --git a/packages/devtools_app/lib/src/screens/memory/panes/chart/controller/chart_pane_controller.dart b/packages/devtools_app/lib/src/screens/memory/panes/chart/controller/chart_pane_controller.dart index 035962bc77c..9c3d6562c98 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/chart/controller/chart_pane_controller.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/chart/controller/chart_pane_controller.dart @@ -89,11 +89,10 @@ class MemoryChartPaneController extends DisposableController if (!isChartVisible.value) return; if (!offlineDataController.showingOfflineData.value) { if (_chartConnection == null) { - _chartConnection ??= - _chartConnection = ChartVmConnection( - data.timeline, - isAndroidChartVisible: isAndroidChartVisible, - ); + _chartConnection ??= _chartConnection = ChartVmConnection( + data.timeline, + isAndroidChartVisible: isAndroidChartVisible, + ); if (serviceConnection.serviceManager.connectedState.value.connected) { _chartConnection!.init(); resume(); diff --git a/packages/devtools_app/lib/src/screens/memory/panes/chart/controller/memory_tracker.dart b/packages/devtools_app/lib/src/screens/memory/panes/chart/controller/memory_tracker.dart index 3550961d450..7690029922a 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/chart/controller/memory_tracker.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/chart/controller/memory_tracker.dart @@ -107,11 +107,10 @@ class MemoryTracker extends Disposable { // > adb shell dumpsys meminfo -d _adbMemoryInfo = serviceConnection.serviceManager.connectedState.value.connected && - serviceConnection.serviceManager.vm!.operatingSystem == - 'android' && - isAndroidChartVisible.value - ? await _fetchAdbInfo() - : AdbMemoryInfo.empty(); + serviceConnection.serviceManager.vm!.operatingSystem == 'android' && + isAndroidChartVisible.value + ? await _fetchAdbInfo() + : AdbMemoryInfo.empty(); // Query the engine's rasterCache estimate. rasterCache = await _fetchRasterCacheInfo(); diff --git a/packages/devtools_app/lib/src/screens/memory/panes/chart/data/charts.dart b/packages/devtools_app/lib/src/screens/memory/panes/chart/data/charts.dart index e9199815531..35d74718e76 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/chart/data/charts.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/chart/data/charts.dart @@ -284,8 +284,9 @@ class ChartsValues { } else if (hasMonitorStart) { eventsDisplayed['Monitor Start'] = monitorLegend; } else if (hasMonitorReset) { - eventsDisplayed['Monitor Reset'] = - isLight ? resetLightLegend : resetDarkLegend; + eventsDisplayed['Monitor Reset'] = isLight + ? resetLightLegend + : resetDarkLegend; } if (hasGc) { diff --git a/packages/devtools_app/lib/src/screens/memory/panes/chart/widgets/chart_control_pane.dart b/packages/devtools_app/lib/src/screens/memory/panes/chart/widgets/chart_control_pane.dart index 0314c4636c0..8f3bfb524bf 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/chart/widgets/chart_control_pane.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/chart/widgets/chart_control_pane.dart @@ -106,19 +106,17 @@ class _LegendButton extends StatelessWidget { Widget build(BuildContext context) { return ValueListenableBuilder( valueListenable: chartController.data.isLegendVisible, - builder: - (_, legendVisible, _) => GaDevToolsButton( - onPressed: chartController.data.toggleLegendVisibility, - gaScreen: gac.memory, - gaSelection: - legendVisible - ? gac.MemoryEvents.hideChartLegend.name - : gac.MemoryEvents.showChartLegend.name, - icon: legendVisible ? Icons.close : Icons.storage, - label: 'Legend', - tooltip: 'Toggle visibility of the chart legend', - minScreenWidthForTextBeforeScaling: memoryControlsMinVerboseWidth, - ), + builder: (_, legendVisible, _) => GaDevToolsButton( + onPressed: chartController.data.toggleLegendVisibility, + gaScreen: gac.memory, + gaSelection: legendVisible + ? gac.MemoryEvents.hideChartLegend.name + : gac.MemoryEvents.showChartLegend.name, + icon: legendVisible ? Icons.close : Icons.storage, + label: 'Legend', + tooltip: 'Toggle visibility of the chart legend', + minScreenWidthForTextBeforeScaling: memoryControlsMinVerboseWidth, + ), ); } } diff --git a/packages/devtools_app/lib/src/screens/memory/panes/chart/widgets/chart_pane.dart b/packages/devtools_app/lib/src/screens/memory/panes/chart/widgets/chart_pane.dart index a5f6b48ec89..42ef94b260e 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/chart/widgets/chart_pane.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/chart/widgets/chart_pane.dart @@ -67,8 +67,8 @@ class _MemoryChartPaneState extends State (tracesCount * hoverItemHeight) + (extensionEventsCount > 0 ? (extensionEventsCount == 1 - ? _hoverOneEventsHeight - : _hoverEventsHeight) + ? _hoverOneEventsHeight + : _hoverEventsHeight) : 0); static int get _timestamp => DateTime.now().millisecondsSinceEpoch; @@ -272,12 +272,11 @@ class _MemoryChartPaneState extends State double totalHoverHeight; int totalTraces; - totalTraces = - widget.chart.isAndroidChartVisible.value - ? chartsValues.vmData.entries.length - - 1 + - chartsValues.androidData.entries.length - : chartsValues.vmData.entries.length - 1; + totalTraces = widget.chart.isAndroidChartVisible.value + ? chartsValues.vmData.entries.length - + 1 + + chartsValues.androidData.entries.length + : chartsValues.vmData.entries.length - 1; totalHoverHeight = _computeHoverHeight( chartsValues.eventCount, @@ -289,41 +288,37 @@ class _MemoryChartPaneState extends State final overlayState = Overlay.of(context); _hoverOverlayEntry ??= OverlayEntry( - builder: - (context) => Positioned( - top: position.dy + _hoverYOffset, - left: xPosition, - height: totalHoverHeight, - child: Container( - padding: const EdgeInsets.only(top: 5, bottom: 8), - decoration: BoxDecoration( - color: colorScheme.surface, - border: Border.all( - color: focusColor, - width: _hoverCardBorderWidth, + builder: (context) => Positioned( + top: position.dy + _hoverYOffset, + left: xPosition, + height: totalHoverHeight, + child: Container( + padding: const EdgeInsets.only(top: 5, bottom: 8), + decoration: BoxDecoration( + color: colorScheme.surface, + border: Border.all(color: focusColor, width: _hoverCardBorderWidth), + borderRadius: defaultBorderRadius, + ), + width: _hoverWidth, + child: ListView( + children: [ + Container( + width: _hoverWidth, + padding: const EdgeInsets.only(bottom: 4), + child: Text( + 'Time $displayTimestamp', + style: theme.legendTextStyle, + textAlign: TextAlign.center, ), - borderRadius: defaultBorderRadius, - ), - width: _hoverWidth, - child: ListView( - children: [ - Container( - width: _hoverWidth, - padding: const EdgeInsets.only(bottom: 4), - child: Text( - 'Time $displayTimestamp', - style: theme.legendTextStyle, - textAlign: TextAlign.center, - ), - ), - ..._displayEventsInHover(chartsValues), - ..._displayVmDataInHover(chartsValues), - ..._displayAndroidDataInHover(chartsValues), - ..._displayExtensionEventsInHover(chartsValues), - ], ), - ), + ..._displayEventsInHover(chartsValues), + ..._displayVmDataInHover(chartsValues), + ..._displayAndroidDataInHover(chartsValues), + ..._displayExtensionEventsInHover(chartsValues), + ], ), + ), + ), ); overlayState.insert(_hoverOverlayEntry!); @@ -339,14 +334,15 @@ class _MemoryChartPaneState extends State for (final entry in dataToDisplay.entries) { final keys = entry.value.keys; - final image = - keys.contains(renderImage) - ? entry.value[renderImage] as String? - : null; - final color = - keys.contains(renderLine) ? entry.value[renderLine] as Color? : null; - final dashedLine = - keys.contains(renderDashed) ? entry.value[renderDashed] : false; + final image = keys.contains(renderImage) + ? entry.value[renderImage] as String? + : null; + final color = keys.contains(renderLine) + ? entry.value[renderLine] as Color? + : null; + final dashedLine = keys.contains(renderDashed) + ? entry.value[renderDashed] + : false; results.add( _hoverRow( @@ -398,15 +394,15 @@ class _MemoryChartPaneState extends State // Logic would be hard to read as a conditional expression. // ignore: prefer-conditional-expression if (colorPatch != null) { - traceColor = - dashed ? createDashWidget(colorPatch) : createSolidLine(colorPatch); + traceColor = dashed + ? createDashWidget(colorPatch) + : createSolidLine(colorPatch); } else { - traceColor = - image == null - ? const SizedBox() - : scaleImage - ? Image(image: AssetImage(image), width: 20, height: 10) - : Image(image: AssetImage(image)); + traceColor = image == null + ? const SizedBox() + : scaleImage + ? Image(image: AssetImage(image), width: 20, height: 10) + : Image(image: AssetImage(image)); } return [ diff --git a/packages/devtools_app/lib/src/screens/memory/panes/chart/widgets/interval_dropdown.dart b/packages/devtools_app/lib/src/screens/memory/panes/chart/widgets/interval_dropdown.dart index 3fba961b019..a02b56be643 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/chart/widgets/interval_dropdown.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/chart/widgets/interval_dropdown.dart @@ -22,15 +22,14 @@ class IntervalDropdown extends StatefulWidget { class _IntervalDropdownState extends State { @override Widget build(BuildContext context) { - final displayTypes = - ChartInterval.values.map>(( - ChartInterval value, - ) { + final displayTypes = ChartInterval.values + .map>((ChartInterval value) { return DropdownMenuItem( value: value, child: Text(value.displayName), ); - }).toList(); + }) + .toList(); return RoundedDropDownButton( isDense: true, diff --git a/packages/devtools_app/lib/src/screens/memory/panes/chart/widgets/legend.dart b/packages/devtools_app/lib/src/screens/memory/panes/chart/widgets/legend.dart index fa94584ae01..c709deef93c 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/chart/widgets/legend.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/chart/widgets/legend.dart @@ -129,18 +129,15 @@ class _LegendRow extends StatelessWidget { } Widget legendSymbol(Map dataToDisplay) { - final image = - dataToDisplay.containsKey(renderImage) - ? dataToDisplay[renderImage] as String? - : null; - final color = - dataToDisplay.containsKey(renderLine) - ? dataToDisplay[renderLine] as Color? - : null; - final dashedLine = - dataToDisplay.containsKey(renderDashed) - ? dataToDisplay[renderDashed] - : false; + final image = dataToDisplay.containsKey(renderImage) + ? dataToDisplay[renderImage] as String? + : null; + final color = dataToDisplay.containsKey(renderLine) + ? dataToDisplay[renderLine] as Color? + : null; + final dashedLine = dataToDisplay.containsKey(renderDashed) + ? dataToDisplay[renderDashed] + : false; Widget traceColor; if (color != null) { @@ -150,8 +147,9 @@ class _LegendRow extends StatelessWidget { traceColor = createSolidLine(color); } } else { - traceColor = - image == null ? const SizedBox() : Image(image: AssetImage(image)); + traceColor = image == null + ? const SizedBox() + : Image(image: AssetImage(image)); } return traceColor; diff --git a/packages/devtools_app/lib/src/screens/memory/panes/control/widgets/control_pane.dart b/packages/devtools_app/lib/src/screens/memory/panes/control/widgets/control_pane.dart index 3aee542cb95..334d9c3dbcd 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/control/widgets/control_pane.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/control/widgets/control_pane.dart @@ -26,15 +26,14 @@ class MemoryControlPane extends StatelessWidget { Widget build(BuildContext context) { // OfflineAwareControls are here to enable button to exit offline mode. return OfflineAwareControls( - controlsBuilder: - (_) => Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - const PrimaryControls(), - const Spacer(), - SecondaryControls(isGcing: isGcing, onGc: onGc, onSave: onSave), - ], - ), + controlsBuilder: (_) => Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const PrimaryControls(), + const Spacer(), + SecondaryControls(isGcing: isGcing, onGc: onGc, onSave: onSave), + ], + ), gaScreen: ScreenMetaData.memory.id, ); } diff --git a/packages/devtools_app/lib/src/screens/memory/panes/diff/controller/diff_pane_controller.dart b/packages/devtools_app/lib/src/screens/memory/panes/diff/controller/diff_pane_controller.dart index a46a1948cbb..9425b6c0ca7 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/diff/controller/diff_pane_controller.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/diff/controller/diff_pane_controller.dart @@ -44,16 +44,13 @@ class DiffPaneController extends DisposableController with Serializable { } factory DiffPaneController.fromJson(Map json) { - final snapshots = - (json[Json.snapshots.name] as List) - .map( - (e) => - deserialize(e, SnapshotDataItem.fromJson), - ) - .toList(); + final snapshots = (json[Json.snapshots.name] as List) + .map((e) => deserialize(e, SnapshotDataItem.fromJson)) + .toList(); - final diffWith = - (json[Json.diffWith.name] as List).map((e) => e as int?).toList(); + final diffWith = (json[Json.diffWith.name] as List) + .map((e) => e as int?) + .toList(); assert(snapshots.length == diffWith.length); @@ -73,21 +70,19 @@ class DiffPaneController extends DisposableController with Serializable { @override Map toJson() { - final snapshots = - core.snapshots.value - .whereType() - .where((s) => s.heap != null) - .toList(); + final snapshots = core.snapshots.value + .whereType() + .where((s) => s.heap != null) + .toList(); final snapshotToIndex = snapshots.asMap().map( (index, item) => MapEntry(item, index), ); - final diffWithIndices = - snapshots.map((item) { - final diffWith = item.diffWith.value; - return diffWith == null ? null : snapshotToIndex[diffWith]; - }).toList(); + final diffWithIndices = snapshots.map((item) { + final diffWith = item.diffWith.value; + return diffWith == null ? null : snapshotToIndex[diffWith]; + }).toList(); return { Json.snapshots.name: snapshots, @@ -265,10 +260,9 @@ class CoreData extends Disposable { SnapshotItem get selectedItem => _snapshots.value[_selectedSnapshotIndex.value]; - SnapshotDataItem? get selectedDataItem => - selectedItem is SnapshotDataItem - ? selectedItem as SnapshotDataItem - : null; + SnapshotDataItem? get selectedDataItem => selectedItem is SnapshotDataItem + ? selectedItem as SnapshotDataItem + : null; /// Full name for the selected class. /// diff --git a/packages/devtools_app/lib/src/screens/memory/panes/diff/data/classes_diff.dart b/packages/devtools_app/lib/src/screens/memory/panes/diff/data/classes_diff.dart index c554744ba22..931023fdbc2 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/diff/data/classes_diff.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/diff/data/classes_diff.dart @@ -132,18 +132,18 @@ class DiffClassData extends ClassData { dataAfter: dataAfter, ), // PathFromRoot, ObjectSetStats - byPath: subtractMaps< - PathFromRoot, - ObjectSetStats, - ObjectSetStats, - ObjectSetStats - >( - from: after?.byPath, - subtract: before?.byPath, - subtractor: - ({subtract, from}) => + byPath: + subtractMaps< + PathFromRoot, + ObjectSetStats, + ObjectSetStats, + ObjectSetStats + >( + from: after?.byPath, + subtract: before?.byPath, + subtractor: ({subtract, from}) => ObjectSetStats.subtract(subtract: subtract, from: from), - ), + ), ); if (result.isZero()) return null; diff --git a/packages/devtools_app/lib/src/screens/memory/panes/diff/data/heap_diff_data.dart b/packages/devtools_app/lib/src/screens/memory/panes/diff/data/heap_diff_data.dart index b6b9c144364..91c3b950f31 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/diff/data/heap_diff_data.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/diff/data/heap_diff_data.dart @@ -28,22 +28,22 @@ HeapDiffData calculateHeapDiffData({ required HeapData before, required HeapData after, }) { - final classesByName = subtractMaps< - HeapClassName, - SingleClassData, - SingleClassData, - DiffClassData - >( - from: after.classes!.asMap(), - subtract: before.classes!.asMap(), - subtractor: - ({subtract, from}) => DiffClassData.compare( + final classesByName = + subtractMaps< + HeapClassName, + SingleClassData, + SingleClassData, + DiffClassData + >( + from: after.classes!.asMap(), + subtract: before.classes!.asMap(), + subtractor: ({subtract, from}) => DiffClassData.compare( before: subtract, after: from, dataBefore: before, dataAfter: after, ), - ); + ); return HeapDiffData._( ClassDataList(classesByName.values.toList(growable: false)), diff --git a/packages/devtools_app/lib/src/screens/memory/panes/diff/data/heap_diff_store.dart b/packages/devtools_app/lib/src/screens/memory/panes/diff/data/heap_diff_store.dart index 067b7034ef8..6b7614614be 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/diff/data/heap_diff_store.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/diff/data/heap_diff_store.dart @@ -28,17 +28,14 @@ HeapDiffData _calculateDiffGaWrapper(_HeapCouple couple) { ga.timeSync( gac.memory, gac.MemoryTime.calculateDiff.name, - syncOperation: - () => - result = calculateHeapDiffData( - before: couple.before, - after: couple.after, - ), - screenMetricsProvider: - () => MemoryScreenMetrics( - heapDiffObjectsBefore: couple.before.graph.objects.length, - heapDiffObjectsAfter: couple.after.graph.objects.length, - ), + syncOperation: () => result = calculateHeapDiffData( + before: couple.before, + after: couple.after, + ), + screenMetricsProvider: () => MemoryScreenMetrics( + heapDiffObjectsBefore: couple.before.graph.objects.length, + heapDiffObjectsAfter: couple.after.graph.objects.length, + ), ); return result; } diff --git a/packages/devtools_app/lib/src/screens/memory/panes/diff/diff_pane.dart b/packages/devtools_app/lib/src/screens/memory/panes/diff/diff_pane.dart index 38ec4a46fa5..2342b95fc20 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/diff/diff_pane.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/diff/diff_pane.dart @@ -72,9 +72,8 @@ class _SnapshotItemContent extends StatelessWidget { styleSheet: MarkdownStyleSheet( p: Theme.of(context).regularTextStyle, ), - onTapLink: - (text, url, title) => - unawaited(launchUrlWithErrorHandling(url!)), + onTapLink: (text, url, title) => + unawaited(launchUrlWithErrorHandling(url!)), ), ), const SizedBox(width: densePadding), diff --git a/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/class_details/path.dart b/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/class_details/path.dart index 1b1246db3e3..7821f0c3bbb 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/class_details/path.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/class_details/path.dart @@ -81,36 +81,33 @@ class _PathControlPane extends StatelessWidget { const SizedBox(width: denseSpacing), ValueListenableBuilder( valueListenable: controller.hideStandard, - builder: - (_, hideStandard, _) => DevToolsFilterButton( - onPressed: () { - ga.select( - gac.memory, - '${gac.MemoryEvents.diffPathFilter.name}-$hideStandard', - ); - controller.hideStandard.value = - !controller.hideStandard.value; - }, - isFilterActive: hideStandard, - message: 'Hide standard libraries', - ), + builder: (_, hideStandard, _) => DevToolsFilterButton( + onPressed: () { + ga.select( + gac.memory, + '${gac.MemoryEvents.diffPathFilter.name}-$hideStandard', + ); + controller.hideStandard.value = !controller.hideStandard.value; + }, + isFilterActive: hideStandard, + message: 'Hide standard libraries', + ), ), const SizedBox(width: denseSpacing), ValueListenableBuilder( valueListenable: controller.invert, - builder: - (_, invert, _) => DevToolsToggleButton( - onPressed: () { - ga.select( - gac.memory, - '${gac.MemoryEvents.diffPathInvert.name}-$invert', - ); - controller.invert.value = !controller.invert.value; - }, - isSelected: invert, - message: 'Invert the path', - icon: Icons.swap_horiz, - ), + builder: (_, invert, _) => DevToolsToggleButton( + onPressed: () { + ga.select( + gac.memory, + '${gac.MemoryEvents.diffPathInvert.name}-$invert', + ); + controller.invert.value = !controller.invert.value; + }, + isSelected: invert, + message: 'Invert the path', + icon: Icons.swap_horiz, + ), ), ], ); diff --git a/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/class_details/paths.dart b/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/class_details/paths.dart index 9cf7f988a4a..603b1c640fe 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/class_details/paths.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/class_details/paths.dart @@ -147,11 +147,10 @@ class RetainingPathTable extends StatelessWidget { data: _data, keyFactory: (e) => ValueKey(e.path), selectionNotifier: selection, - onItemSelected: - (_) => ga.select( - gac.memory, - '${gac.MemoryEvents.diffPathSelect.name}-${isDiff ? "diff" : "single"}', - ), + onItemSelected: (_) => ga.select( + gac.memory, + '${gac.MemoryEvents.diffPathSelect.name}-${isDiff ? "diff" : "single"}', + ), defaultSortColumn: columns.retainedSizeColumn, defaultSortDirection: SortDirection.descending, tallHeaders: true, diff --git a/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/classes_table_diff.dart b/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/classes_table_diff.dart index 7f9baed7567..0b940796351 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/classes_table_diff.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/classes_table_diff.dart @@ -141,10 +141,9 @@ class _InstanceColumn extends ColumnData return null; } - final heapCallback = - dataPart == _DataPart.deleted - ? diffData.heapBefore - : diffData.heapAfter; + final heapCallback = dataPart == _DataPart.deleted + ? diffData.heapBefore + : diffData.heapAfter; if (objects is! ObjectSet) { throw StateError( @@ -266,17 +265,16 @@ class _SizeGroupTitle extends StatelessWidget { RoundedDropDownButton( isDense: true, value: sizeType, - onChanged: - (SizeType? value) => diffData.selectedSizeType.value = value!, - items: - SizeType.values - .map( - (sizeType) => DropdownMenuItem( - value: sizeType, - child: Text(sizeType.displayName), - ), - ) - .toList(), + onChanged: (SizeType? value) => + diffData.selectedSizeType.value = value!, + items: SizeType.values + .map( + (sizeType) => DropdownMenuItem( + value: sizeType, + child: Text(sizeType.displayName), + ), + ) + .toList(), ), const SizedBox(width: denseSpacing), const Text('Size'), @@ -331,11 +329,8 @@ class ClassesTableDiff extends StatelessWidget { dataKey: dataKey, keyFactory: (e) => Key(e.className.fullName), selectionNotifier: diffData.selection, - onItemSelected: - (_) => ga.select( - gac.memory, - gac.MemoryEvents.diffClassDiffSelect.name, - ), + onItemSelected: (_) => + ga.select(gac.memory, gac.MemoryEvents.diffClassDiffSelect.name), defaultSortColumn: columns.sizeDeltaColumn, defaultSortDirection: SortDirection.descending, ); diff --git a/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/classes_table_single.dart b/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/classes_table_single.dart index 3f51fa80804..0c6afb6be22 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/classes_table_single.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/classes_table_single.dart @@ -198,11 +198,8 @@ class ClassesTableSingle extends StatelessWidget { dataKey: dataKey, keyFactory: (e) => Key(e.className.fullName), selectionNotifier: classesData.selection, - onItemSelected: - (_) => ga.select( - gac.memory, - gac.MemoryEvents.diffClassSingleSelect.name, - ), + onItemSelected: (_) => + ga.select(gac.memory, gac.MemoryEvents.diffClassSingleSelect.name), defaultSortColumn: _columns.retainedSizeColumn, defaultSortDirection: SortDirection.descending, ); diff --git a/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/instances.dart b/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/instances.dart index 76fb8e3c14e..38a1af79c46 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/instances.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/instances.dart @@ -25,10 +25,9 @@ class HeapInstanceTableCell extends StatelessWidget { super.key, required bool isSelected, this.liveItemsEnabled = true, - }) : _sampleObtainer = - _shouldShowMenu(isSelected, objects) - ? SnapshotClassSampler(heapClass, objects, heap()) - : null, + }) : _sampleObtainer = _shouldShowMenu(isSelected, objects) + ? SnapshotClassSampler(heapClass, objects, heap()) + : null, _count = objects.instanceCount; static bool _shouldShowMenu(bool isSelected, ObjectSet objects) => @@ -43,11 +42,10 @@ class HeapInstanceTableCell extends StatelessWidget { Widget build(BuildContext context) { return InstanceViewWithContextMenu( count: _count, - menuBuilder: - () => _buildHeapInstancesMenu( - sampler: _sampleObtainer, - liveItemsEnabled: liveItemsEnabled, - ), + menuBuilder: () => _buildHeapInstancesMenu( + sampler: _sampleObtainer, + liveItemsEnabled: liveItemsEnabled, + ), ); } } @@ -86,11 +84,10 @@ class _StoreAllAsVariableMenu extends StatelessWidget { required bool subclasses, required bool implementers, }) => MenuItemButton( - onPressed: - () async => await sampler.allLiveToConsole( - includeImplementers: implementers, - includeSubclasses: subclasses, - ), + onPressed: () async => await sampler.allLiveToConsole( + includeImplementers: implementers, + includeSubclasses: subclasses, + ), child: Text(title), ); @@ -128,23 +125,21 @@ class _StoreAsOneVariableMenu extends StatelessWidget { return SubmenuButton( menuChildren: [ MenuItemButton( - onPressed: - () => unawaited( - sampler.oneStaticToConsole( - sourceFeature: MemoryAreas.snapshotDiff.name, - ), - ), + onPressed: () => unawaited( + sampler.oneStaticToConsole( + sourceFeature: MemoryAreas.snapshotDiff.name, + ), + ), child: const Text('Any'), ), MenuItemButton( - onPressed: - liveItemsEnabled - ? () => unawaited( - sampler.oneLiveStaticToConsole( - sourceFeature: MemoryAreas.snapshotDiff.name, - ), - ) - : null, + onPressed: liveItemsEnabled + ? () => unawaited( + sampler.oneLiveStaticToConsole( + sourceFeature: MemoryAreas.snapshotDiff.name, + ), + ) + : null, child: const Text('Any, not garbage collected'), ), ], diff --git a/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/snapshot_control_pane.dart b/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/snapshot_control_pane.dart index d9a82630705..856d9bb1099 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/snapshot_control_pane.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/snapshot_control_pane.dart @@ -66,51 +66,52 @@ class _DiffDropdown extends StatelessWidget { final SnapshotDataItem current; final DiffPaneController controller; - List> items() => - controller.core.snapshots.value - .whereType() - .where((item) => item.isProcessed) - .map((item) { - return DropdownMenuItem( - value: item, - child: Text(item == current ? '-' : item.name), - ); - }) - .toList(); + List> items() => controller + .core + .snapshots + .value + .whereType() + .where((item) => item.isProcessed) + .map((item) { + return DropdownMenuItem( + value: item, + child: Text(item == current ? '-' : item.name), + ); + }) + .toList(); @override Widget build(BuildContext context) { return ValueListenableBuilder( valueListenable: current.diffWith, - builder: - (_, diffWith, _) => Row( - children: [ - const Text('Diff with:'), - const SizedBox(width: defaultSpacing), - RoundedDropDownButton( - isDense: true, - value: current.diffWith.value ?? current, - onChanged: (SnapshotDataItem? value) { - late SnapshotDataItem? newDiffWith; - if ((value ?? current) == current) { - ga.select( - gac.memory, - gac.MemoryEvents.diffSnapshotDiffSelectOff.name, - ); - newDiffWith = null; - } else { - ga.select( - gac.memory, - gac.MemoryEvents.diffSnapshotDiffSelect.name, - ); - newDiffWith = value; - } - controller.setDiffing(current, newDiffWith); - }, - items: items(), - ), - ], + builder: (_, diffWith, _) => Row( + children: [ + const Text('Diff with:'), + const SizedBox(width: defaultSpacing), + RoundedDropDownButton( + isDense: true, + value: current.diffWith.value ?? current, + onChanged: (SnapshotDataItem? value) { + late SnapshotDataItem? newDiffWith; + if ((value ?? current) == current) { + ga.select( + gac.memory, + gac.MemoryEvents.diffSnapshotDiffSelectOff.name, + ); + newDiffWith = null; + } else { + ga.select( + gac.memory, + gac.MemoryEvents.diffSnapshotDiffSelect.name, + ); + newDiffWith = value; + } + controller.setDiffing(current, newDiffWith); + }, + items: items(), ), + ], + ), ); } } diff --git a/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/snapshot_list.dart b/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/snapshot_list.dart index 2f576ef0f31..63e2b04fec9 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/snapshot_list.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/snapshot_list.dart @@ -61,11 +61,10 @@ class _ListControlPane extends StatelessWidget { if (!context.mounted) return; await showDialog( context: context, - builder: - (context) => UnexpectedErrorDialog( - additionalInfo: - 'Encountered an error while taking a heap snapshot:\n${e.runtimeType}\n$e\n$trace', - ), + builder: (context) => UnexpectedErrorDialog( + additionalInfo: + 'Encountered an error while taking a heap snapshot:\n${e.runtimeType}\n$e\n$trace', + ), ); } } @@ -93,16 +92,15 @@ class _ListControlPane extends StatelessWidget { icon: Icons.delete, size: defaultIconSize, tooltip: 'Delete all snapshots', - onPressed: - controller.hasSnapshots - ? () { - ga.select( - gac.memory, - gac.MemoryEvents.diffClearSnapshots.name, - ); - controller.clearSnapshots(); - } - : null, + onPressed: controller.hasSnapshots + ? () { + ga.select( + gac.memory, + gac.MemoryEvents.diffClearSnapshots.name, + ); + controller.clearSnapshots(); + } + : null, ); }, ), @@ -186,25 +184,24 @@ class SnapshotListTitle extends StatelessWidget { Text(prettyPrintBytes(theItem.totalSize, includeUnit: true)!), Padding( padding: const EdgeInsets.only(left: ContextMenuButton.densePadding), - child: - selected - ? ContextMenuButton( - menuChildren: [ - MenuItemButton( - onPressed: onEdit, - child: const Text('Rename'), - ), - MenuItemButton( - onPressed: onDelete, - child: const Text('Delete'), - ), - MenuItemButton( - onPressed: onExport, - child: const Text('Export'), - ), - ], - ) - : const SizedBox(width: menuButtonWidth), + child: selected + ? ContextMenuButton( + menuChildren: [ + MenuItemButton( + onPressed: onEdit, + child: const Text('Rename'), + ), + MenuItemButton( + onPressed: onDelete, + child: const Text('Delete'), + ), + MenuItemButton( + onPressed: onExport, + child: const Text('Export'), + ), + ], + ) + : const SizedBox(width: menuButtonWidth), ), ]); } else { @@ -214,8 +211,9 @@ class SnapshotListTitle extends StatelessWidget { return FutureBuilder( future: theItem is SnapshotDataItem ? theItem.process : null, builder: (_, _) { - final isProcessing = - theItem is SnapshotDataItem ? !theItem.isProcessed : false; + final isProcessing = theItem is SnapshotDataItem + ? !theItem.isProcessed + : false; return Padding( padding: const EdgeInsets.symmetric(horizontal: denseRowSpacing), @@ -396,10 +394,9 @@ class _SnapshotListItemsState extends State<_SnapshotListItems> final selected = selectedIndex == index; return Container( height: _headerHeight, - color: - selected - ? Theme.of(context).colorScheme.selectedRowBackgroundColor - : null, + color: selected + ? Theme.of(context).colorScheme.selectedRowBackgroundColor + : null, child: InkWell( canRequestFocus: false, onTap: () { diff --git a/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/snapshot_view.dart b/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/snapshot_view.dart index 217a19c672f..090d1006c23 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/snapshot_view.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/snapshot_view.dart @@ -58,13 +58,12 @@ class SnapshotView extends StatelessWidget { final pathTable = ValueListenableBuilder( valueListenable: controller.derived.classData, - builder: - (_, classData, _) => HeapClassDetails( - classData: classData, - pathSelection: controller.derived.selectedPath, - isDiff: classes is ClassDataList, - pathController: controller.retainingPathController, - ), + builder: (_, classData, _) => HeapClassDetails( + classData: classData, + pathSelection: controller.derived.selectedPath, + isDiff: classes is ClassDataList, + pathController: controller.retainingPathController, + ), ); return SplitPane( diff --git a/packages/devtools_app/lib/src/screens/memory/panes/profile/instances.dart b/packages/devtools_app/lib/src/screens/memory/panes/profile/instances.dart index 077737edbf2..4c11d85e80b 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/profile/instances.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/profile/instances.dart @@ -63,11 +63,10 @@ class _StoreAllAsVariableMenu extends StatelessWidget { required bool subclasses, required bool implementers, }) => MenuItemButton( - onPressed: - () async => await sampler.allLiveToConsole( - includeImplementers: implementers, - includeSubclasses: subclasses, - ), + onPressed: () async => await sampler.allLiveToConsole( + includeImplementers: implementers, + includeSubclasses: subclasses, + ), child: Text(title), ); @@ -95,10 +94,9 @@ class _StoreAsOneVariableMenu extends StatelessWidget { @override Widget build(BuildContext context) { return MenuItemButton( - onPressed: - () => unawaited( - sampler.oneLiveToConsole(sourceFeature: MemoryAreas.profile.name), - ), + onPressed: () => unawaited( + sampler.oneLiveToConsole(sourceFeature: MemoryAreas.profile.name), + ), child: const Text('Store one instance as a console variable'), ); } diff --git a/packages/devtools_app/lib/src/screens/memory/panes/profile/model.dart b/packages/devtools_app/lib/src/screens/memory/panes/profile/model.dart index 8ad3e9bc6f8..b1c412b5724 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/profile/model.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/profile/model.dart @@ -38,11 +38,10 @@ class AdaptedProfile with Serializable { ) { final adaptedProfile = AdaptedProfile._( total: ProfileRecord.total(profile), - items: - (profile.members ?? []) - .where((e) => (e.instancesCurrent ?? 0) > 0) - .map((e) => ProfileRecord.fromClassHeapStats(e)) - .toList(), + items: (profile.members ?? []) + .where((e) => (e.instancesCurrent ?? 0) > 0) + .map((e) => ProfileRecord.fromClassHeapStats(e)) + .toList(), newSpaceGCStats: profile.newSpaceGCStats, oldSpaceGCStats: profile.oldSpaceGCStats, totalGCStats: profile.totalGCStats, @@ -74,10 +73,9 @@ class AdaptedProfile with Serializable { factory AdaptedProfile.fromJson(Map json) { return AdaptedProfile._( total: ProfileRecord.fromJson(json[_ProfileJson.total]), - items: - (json[_ProfileJson.items] as List) - .map((e) => ProfileRecord.fromJson(e)) - .toList(), + items: (json[_ProfileJson.items] as List) + .map((e) => ProfileRecord.fromJson(e)) + .toList(), newSpaceGCStats: GCStats.fromJson(json[_ProfileJson.newGC]), oldSpaceGCStats: GCStats.fromJson(json[_ProfileJson.oldGC]), totalGCStats: GCStats.fromJson(json[_ProfileJson.totalGC]), diff --git a/packages/devtools_app/lib/src/screens/memory/panes/profile/profile_view.dart b/packages/devtools_app/lib/src/screens/memory/panes/profile/profile_view.dart index ed9c758aace..9b48cee6c45 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/profile/profile_view.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/profile/profile_view.dart @@ -549,10 +549,9 @@ class _AllocationProfileTable extends StatelessWidget { keyFactory: (element) => Key(element.heapClass.fullName), data: profile.records, dataKey: 'allocation-profile', - columnGroups: - vmDeveloperModeEnabled - ? _AllocationProfileTable._vmModeColumnGroups - : null, + columnGroups: vmDeveloperModeEnabled + ? _AllocationProfileTable._vmModeColumnGroups + : null, columns: [ ..._columns, if (vmDeveloperModeEnabled) ..._vmDeveloperModeColumns, @@ -615,12 +614,11 @@ class _ExportAllocationProfileButton extends StatelessWidget { minScreenWidthForTextBeforeScaling: memoryControlsMinVerboseWidth, tooltip: 'Download allocation profile data in CSV format', label: 'CSV', - onPressed: - currentAllocationProfile == null - ? null - : () => allocationProfileController.downloadMemoryTableCsv( - currentAllocationProfile, - ), + onPressed: currentAllocationProfile == null + ? null + : () => allocationProfileController.downloadMemoryTableCsv( + currentAllocationProfile, + ), ); }, ); diff --git a/packages/devtools_app/lib/src/screens/memory/panes/tracing/tracing_data.dart b/packages/devtools_app/lib/src/screens/memory/panes/tracing/tracing_data.dart index 3c777d7a6b4..10c6937e12d 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/tracing/tracing_data.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/tracing/tracing_data.dart @@ -122,10 +122,9 @@ class TracingIsolateState with Serializable { deserialize(value, CpuProfileData.fromJson), ), ), - classes: - (json[TracingIsolateStateJson.classes.name] as List) - .map((e) => deserialize(e, TracedClass.fromJson)) - .toList(), + classes: (json[TracingIsolateStateJson.classes.name] as List) + .map((e) => deserialize(e, TracedClass.fromJson)) + .toList(), ); } @@ -273,13 +272,12 @@ class TracingIsolateState with Serializable { ); } final service = serviceConnection.serviceManager.service!; - final isolateId = - serviceConnection - .serviceManager - .isolateManager - .selectedIsolate - .value! - .id!; + final isolateId = serviceConnection + .serviceManager + .isolateManager + .selectedIsolate + .value! + .id!; final clazz = tracedClass.clazz; // Note: we need to provide `timeExtentMicros` to `getAllocationTraces`, diff --git a/packages/devtools_app/lib/src/screens/memory/panes/tracing/tracing_tree.dart b/packages/devtools_app/lib/src/screens/memory/panes/tracing/tracing_tree.dart index d9ffc4ecc4f..45440359f80 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/tracing/tracing_tree.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/tracing/tracing_tree.dart @@ -196,23 +196,21 @@ class _TracingTreeHeader extends StatelessWidget { ExpandAllButton( gaScreen: gac.memory, gaSelection: gac.MemoryEvents.tracingTreeExpandAll.name, - onPressed: - () => updateTreeStateCallback(() { - for (final root in _currentDataRoots) { - root.expandCascading(); - } - }), + onPressed: () => updateTreeStateCallback(() { + for (final root in _currentDataRoots) { + root.expandCascading(); + } + }), ), const SizedBox(width: denseSpacing), CollapseAllButton( gaScreen: gac.memory, gaSelection: gac.MemoryEvents.tracingTreeCollapseAll.name, - onPressed: - () => updateTreeStateCallback(() { - for (final root in _currentDataRoots) { - root.collapseCascading(); - } - }), + onPressed: () => updateTreeStateCallback(() { + for (final root in _currentDataRoots) { + root.collapseCascading(); + } + }), ), ], ); diff --git a/packages/devtools_app/lib/src/screens/memory/shared/heap/class_filter.dart b/packages/devtools_app/lib/src/screens/memory/shared/heap/class_filter.dart index f5590688cff..62bc541a695 100644 --- a/packages/devtools_app/lib/src/screens/memory/shared/heap/class_filter.dart +++ b/packages/devtools_app/lib/src/screens/memory/shared/heap/class_filter.dart @@ -128,14 +128,13 @@ class ClassFilter with Serializable { int get hashCode => Object.hash(filterType, except, only); Set _filtersAsSet() { - Set stringToSet(String? s) => - s == null - ? {} - : s - .split(RegExp(',|\n')) - .map((e) => e.trim()) - .where((e) => e.isNotEmpty) - .toSet(); + Set stringToSet(String? s) => s == null + ? {} + : s + .split(RegExp(',|\n')) + .map((e) => e.trim()) + .where((e) => e.isNotEmpty) + .toSet(); switch (filterType) { case ClassFilterType.showAll: @@ -237,10 +236,9 @@ class ClassFilter with Serializable { throw StateError('Unexpected task: $task.'); } - final result = - dataToFilter - .where((e) => newFilter.apply(extractClass(e), rootPackage)) - .toList(); + final result = dataToFilter + .where((e) => newFilter.apply(extractClass(e), rootPackage)) + .toList(); return result; } diff --git a/packages/devtools_app/lib/src/screens/memory/shared/heap/sampler.dart b/packages/devtools_app/lib/src/screens/memory/shared/heap/sampler.dart index 9fe6ff3e76a..36b72c1c638 100644 --- a/packages/devtools_app/lib/src/screens/memory/shared/heap/sampler.dart +++ b/packages/devtools_app/lib/src/screens/memory/shared/heap/sampler.dart @@ -137,8 +137,9 @@ class LiveClassSampler { await serviceConnection.consoleService.appendBrowsableInstance( instanceRef: list, isolateRef: _mainIsolateRef, - heapSelection: - selection == null ? null : HeapObject(selection.heap, index: null), + heapSelection: selection == null + ? null + : HeapObject(selection.heap, index: null), ); } diff --git a/packages/devtools_app/lib/src/screens/memory/shared/primitives/memory_timeline.dart b/packages/devtools_app/lib/src/screens/memory/shared/primitives/memory_timeline.dart index b8ba47dba14..8300073fd8f 100644 --- a/packages/devtools_app/lib/src/screens/memory/shared/primitives/memory_timeline.dart +++ b/packages/devtools_app/lib/src/screens/memory/shared/primitives/memory_timeline.dart @@ -17,10 +17,9 @@ class MemoryTimeline extends Disposable with Serializable { factory MemoryTimeline.fromJson(Map json) { return MemoryTimeline( - data: - (json[_jsonData] as List) - .map((e) => HeapSample.fromJson(e as Map)) - .toList(), + data: (json[_jsonData] as List) + .map((e) => HeapSample.fromJson(e as Map)) + .toList(), ); } @@ -93,15 +92,9 @@ class MemoryTimeline extends Disposable with Serializable { Map json, { String? customEventName, }) { - final extensionEvent = - customEventName == null - ? ExtensionEvent(timestamp, eventKind, json) - : ExtensionEvent.custom( - timestamp, - eventKind, - customEventName, - json, - ); + final extensionEvent = customEventName == null + ? ExtensionEvent(timestamp, eventKind, json) + : ExtensionEvent.custom(timestamp, eventKind, customEventName, json); _extensionEvents.add(extensionEvent); } diff --git a/packages/devtools_app/lib/src/screens/memory/shared/primitives/painting.dart b/packages/devtools_app/lib/src/screens/memory/shared/primitives/painting.dart index 17fa2951ae3..91b9c2b5782 100644 --- a/packages/devtools_app/lib/src/screens/memory/shared/primitives/painting.dart +++ b/packages/devtools_app/lib/src/screens/memory/shared/primitives/painting.dart @@ -50,10 +50,9 @@ class DashedLine extends CustomPainter { @override void paint(Canvas canvas, Size size) { double startX = 0; - final paint = - Paint() - ..color = _color - ..strokeWidth = _dashHeight; + final paint = Paint() + ..color = _color + ..strokeWidth = _dashHeight; while (_totalWidth >= 0) { canvas.drawLine(Offset(startX, 0), Offset(startX + _dashWidth, 0), paint); diff --git a/packages/devtools_app/lib/src/screens/memory/shared/widgets/class_filter.dart b/packages/devtools_app/lib/src/screens/memory/shared/widgets/class_filter.dart index 300372b21ee..b9b3a15bb1f 100644 --- a/packages/devtools_app/lib/src/screens/memory/shared/widgets/class_filter.dart +++ b/packages/devtools_app/lib/src/screens/memory/shared/widgets/class_filter.dart @@ -37,12 +37,11 @@ class ClassFilterButton extends StatelessWidget { unawaited( showDialog( context: context, - builder: - (context) => ClassFilterDialog( - filter, - onChanged: data.onChanged, - rootPackage: _rootPackage, - ), + builder: (context) => ClassFilterDialog( + filter, + onChanged: data.onChanged, + rootPackage: _rootPackage, + ), ), ); }, diff --git a/packages/devtools_app/lib/src/screens/network/har_data_entry.dart b/packages/devtools_app/lib/src/screens/network/har_data_entry.dart index 2a2ba7d4d69..fe50b818403 100644 --- a/packages/devtools_app/lib/src/screens/network/har_data_entry.dart +++ b/packages/devtools_app/lib/src/screens/network/har_data_entry.dart @@ -62,69 +62,67 @@ class HarDataEntry { /// serialization. static Map toJson(DartIOHttpRequestData e) { // Implement the logic to convert DartIOHttpRequestData to HAR entry format - final requestCookies = - e.requestCookies.map((cookie) { - return { - NetworkEventKeys.name.name: cookie.name, - NetworkEventKeys.value.name: cookie.value, - NetworkEventKeys.path.name: cookie.path, - NetworkEventKeys.domain.name: cookie.domain, - NetworkEventKeys.expires.name: - cookie.expires?.toUtc().toIso8601String(), - NetworkEventKeys.httpOnly.name: cookie.httpOnly, - NetworkEventKeys.secure.name: cookie.secure, - }; - }).toList(); + final requestCookies = e.requestCookies.map((cookie) { + return { + NetworkEventKeys.name.name: cookie.name, + NetworkEventKeys.value.name: cookie.value, + NetworkEventKeys.path.name: cookie.path, + NetworkEventKeys.domain.name: cookie.domain, + NetworkEventKeys.expires.name: cookie.expires + ?.toUtc() + .toIso8601String(), + NetworkEventKeys.httpOnly.name: cookie.httpOnly, + NetworkEventKeys.secure.name: cookie.secure, + }; + }).toList(); - final requestHeaders = - e.requestHeaders?.entries.map((header) { - var value = header.value; - if (value is List) { - value = value.first; - } - return { - NetworkEventKeys.name.name: header.key, - NetworkEventKeys.value.name: value, - }; - }).toList(); + final requestHeaders = e.requestHeaders?.entries.map((header) { + var value = header.value; + if (value is List) { + value = value.first; + } + return { + NetworkEventKeys.name.name: header.key, + NetworkEventKeys.value.name: value, + }; + }).toList(); - final queryString = - Uri.parse(e.uri).queryParameters.entries.map((param) { - return { - NetworkEventKeys.name.name: param.key, - NetworkEventKeys.value.name: param.value, - }; - }).toList(); + final queryString = Uri.parse(e.uri).queryParameters.entries.map((param) { + return { + NetworkEventKeys.name.name: param.key, + NetworkEventKeys.value.name: param.value, + }; + }).toList(); - final responseCookies = - e.responseCookies.map((cookie) { - return { - NetworkEventKeys.name.name: cookie.name, - NetworkEventKeys.value.name: cookie.value, - NetworkEventKeys.path.name: cookie.path, - NetworkEventKeys.domain.name: cookie.domain, - NetworkEventKeys.expires.name: - cookie.expires?.toUtc().toIso8601String(), - NetworkEventKeys.httpOnly.name: cookie.httpOnly, - NetworkEventKeys.secure.name: cookie.secure, - }; - }).toList(); + final responseCookies = e.responseCookies.map((cookie) { + return { + NetworkEventKeys.name.name: cookie.name, + NetworkEventKeys.value.name: cookie.value, + NetworkEventKeys.path.name: cookie.path, + NetworkEventKeys.domain.name: cookie.domain, + NetworkEventKeys.expires.name: cookie.expires + ?.toUtc() + .toIso8601String(), + NetworkEventKeys.httpOnly.name: cookie.httpOnly, + NetworkEventKeys.secure.name: cookie.secure, + }; + }).toList(); - final responseHeaders = - e.responseHeaders?.entries.map((header) { - var value = header.value; - if (value is List) { - value = value.first; - } - return { - NetworkEventKeys.name.name: header.key, - NetworkEventKeys.value.name: value, - }; - }).toList(); + final responseHeaders = e.responseHeaders?.entries.map((header) { + var value = header.value; + if (value is List) { + value = value.first; + } + return { + NetworkEventKeys.name.name: header.key, + NetworkEventKeys.value.name: value, + }; + }).toList(); return { - NetworkEventKeys.startedDateTime.name: - e.startTimestamp.toUtc().toIso8601String(), + NetworkEventKeys.startedDateTime.name: e.startTimestamp + .toUtc() + .toIso8601String(), NetworkEventKeys.time.name: e.duration?.inMilliseconds, // Request NetworkEventKeys.request.name: { diff --git a/packages/devtools_app/lib/src/screens/network/har_network_data.dart b/packages/devtools_app/lib/src/screens/network/har_network_data.dart index 11fd93c0e1d..7895e008e04 100644 --- a/packages/devtools_app/lib/src/screens/network/har_network_data.dart +++ b/packages/devtools_app/lib/src/screens/network/har_network_data.dart @@ -34,10 +34,9 @@ class HarNetworkData with Serializable { as Map)[NetworkEventKeys.entries.name] as List) .map( - (entryJson) => - HarDataEntry.fromJson( - entryJson as Map, - ).toDartIOHttpRequest(), + (entryJson) => HarDataEntry.fromJson( + entryJson as Map, + ).toDartIOHttpRequest(), ) .toList(); diff --git a/packages/devtools_app/lib/src/screens/network/network_controller.dart b/packages/devtools_app/lib/src/screens/network/network_controller.dart index 0145ba75b67..309b62e8503 100644 --- a/packages/devtools_app/lib/src/screens/network/network_controller.dart +++ b/packages/devtools_app/lib/src/screens/network/network_controller.dart @@ -70,8 +70,9 @@ class NetworkController extends DevToolsScreenController Future exportAsHarFile() async { await fetchFullDataBeforeExport(); - _httpRequests = - filteredData.value.whereType().toList(); + _httpRequests = filteredData.value + .whereType() + .toList(); if (_httpRequests.isNullOrEmpty) { debugPrint('No valid request data to export'); @@ -507,11 +508,10 @@ class NetworkController extends DevToolsScreenController ); } - Future fetchFullDataBeforeExport() => - filteredData.value - .whereType() - .map((item) => item.getFullRequestData()) - .wait; + Future fetchFullDataBeforeExport() => filteredData.value + .whereType() + .map((item) => item.getFullRequestData()) + .wait; @override FutureOr releaseMemory({bool partial = false}) async { diff --git a/packages/devtools_app/lib/src/screens/network/network_model.dart b/packages/devtools_app/lib/src/screens/network/network_model.dart index d967a4588c2..8a6697fbe65 100644 --- a/packages/devtools_app/lib/src/screens/network/network_model.dart +++ b/packages/devtools_app/lib/src/screens/network/network_model.dart @@ -38,10 +38,9 @@ abstract class NetworkRequest String get durationDisplay { final duration = this.duration; - final text = - duration != null - ? durationText(duration, unit: DurationDisplayUnit.milliseconds) - : 'Pending'; + final text = duration != null + ? durationText(duration, unit: DurationDisplayUnit.milliseconds) + : 'Pending'; return 'Duration: $text'; } @@ -65,9 +64,9 @@ abstract class NetworkRequest port == other.port && (inProgress == other.inProgress ? (endTimestamp == other.endTimestamp && - duration == other.duration && - status == other.status && - didFail == other.didFail) + duration == other.duration && + status == other.status && + didFail == other.didFail) : true); } @@ -124,8 +123,8 @@ class Socket extends NetworkRequest { final endTime = _socket.endTime; return endTime != null ? DateTime.fromMicrosecondsSinceEpoch( - timelineMicrosecondsSinceEpoch(endTime), - ) + timelineMicrosecondsSinceEpoch(endTime), + ) : null; } @@ -133,8 +132,8 @@ class Socket extends NetworkRequest { final lastReadTime = _socket.lastReadTime; return lastReadTime != null ? DateTime.fromMicrosecondsSinceEpoch( - timelineMicrosecondsSinceEpoch(lastReadTime), - ) + timelineMicrosecondsSinceEpoch(lastReadTime), + ) : null; } @@ -142,8 +141,8 @@ class Socket extends NetworkRequest { final lastWriteTime = _socket.lastWriteTime; return lastWriteTime != null ? DateTime.fromMicrosecondsSinceEpoch( - timelineMicrosecondsSinceEpoch(lastWriteTime), - ) + timelineMicrosecondsSinceEpoch(lastWriteTime), + ) : null; } diff --git a/packages/devtools_app/lib/src/screens/network/network_request_inspector.dart b/packages/devtools_app/lib/src/screens/network/network_request_inspector.dart index 0e174a226a4..a2f476487a8 100644 --- a/packages/devtools_app/lib/src/screens/network/network_request_inspector.dart +++ b/packages/devtools_app/lib/src/screens/network/network_request_inspector.dart @@ -41,23 +41,23 @@ class NetworkRequestInspector extends StatelessWidget { builder: (context, data, _) { return data == null ? RoundedOutlinedBorder( - child: Center( - child: Text( - 'No request selected', - style: Theme.of(context).regularTextStyle, + child: Center( + child: Text( + 'No request selected', + style: Theme.of(context).regularTextStyle, + ), ), - ), - ) + ) : ListenableBuilder( - listenable: data, - builder: (context, _) { - return AnalyticsTabbedView( - analyticsSessionIdentifier: data.id, - tabs: _generateTabs(data), - gaScreen: gac.network, - ); - }, - ); + listenable: data, + builder: (context, _) { + return AnalyticsTabbedView( + analyticsSessionIdentifier: data.id, + tabs: _generateTabs(data), + gaScreen: gac.network, + ); + }, + ); }, ); } @@ -93,8 +93,8 @@ class NetworkRequestInspector extends StatelessWidget { HttpResponseTrailingDropDown( data, currentResponseViewType: controller.currentResponseViewType, - onChanged: - (value) => controller.setResponseViewType = value, + onChanged: (value) => + controller.setResponseViewType = value, ), HttpViewTrailingCopyButton(data, (data) => data.responseBody), ], diff --git a/packages/devtools_app/lib/src/screens/network/network_request_inspector_views.dart b/packages/devtools_app/lib/src/screens/network/network_request_inspector_views.dart index 20bc201e231..080cdc245e6 100644 --- a/packages/devtools_app/lib/src/screens/network/network_request_inspector_views.dart +++ b/packages/devtools_app/lib/src/screens/network/network_request_inspector_views.dart @@ -145,21 +145,16 @@ class HttpRequestView extends StatelessWidget { (e) => (e as String).contains('json'), ), String() => requestContentType.contains('json'), - _ => - throw StateError( - "Expected 'content-type' to be a List or String, but got: " - '$requestContentType', - ), + _ => throw StateError( + "Expected 'content-type' to be a List or String, but got: " + '$requestContentType', + ), }; Widget child; - child = - isJson - ? JsonViewer(encodedJson: data.requestBody!) - : TextViewer( - text: data.requestBody!, - style: theme.fixedFontStyle, - ); + child = isJson + ? JsonViewer(encodedJson: data.requestBody!) + : TextViewer(text: data.requestBody!, style: theme.fixedFontStyle); return Padding( padding: const EdgeInsets.all(denseSpacing), child: SingleChildScrollView(child: child), @@ -239,15 +234,12 @@ class HttpResponseTrailingDropDown extends StatelessWidget { builder: (_, currentType, _) { return RoundedDropDownButton( value: currentType, - items: - availableResponseTypes - .map( - (e) => DropdownMenuItem( - value: e, - child: Text(e.toString()), - ), - ) - .toList(), + items: availableResponseTypes + .map( + (e) => + DropdownMenuItem(value: e, child: Text(e.toString())), + ) + .toList(), onChanged: (value) { if (value == null) { return; @@ -345,9 +337,9 @@ class HttpTextResponseViewer extends StatelessWidget { _isJsonDecodable(responseBody) ? JsonViewer(encodedJson: responseBody) : TextViewer( - // We could also include the decoding exception. Or push a notification. - text: responseBody, - ), + // We could also include the decoding exception. Or push a notification. + text: responseBody, + ), NetworkResponseViewType.text => TextViewer( text: responseBody, style: textStyle, @@ -485,10 +477,9 @@ class HttpRequestCookiesView extends StatelessWidget { child: SingleChildScrollView( scrollDirection: Axis.horizontal, child: ConstrainedBox( - constraints: - requestCookies - ? const BoxConstraints() - : BoxConstraints(minWidth: constraints.minWidth), + constraints: requestCookies + ? const BoxConstraints() + : BoxConstraints(minWidth: constraints.minWidth), child: DataTable( key: key, dataRowMinHeight: defaultRowHeight, @@ -633,10 +624,9 @@ class NetworkRequestOverviewView extends StatelessWidget { _buildRow( context: context, title: 'Timing', - child: - data is Socket - ? _buildSocketTimeGraph(context) - : _buildHttpTimeGraph(), + child: data is Socket + ? _buildSocketTimeGraph(context) + : _buildHttpTimeGraph(), ), const SizedBox(height: denseSpacing), _buildRow( @@ -668,8 +658,8 @@ class NetworkRequestOverviewView extends StatelessWidget { } Widget _buildTimingRow(Color color, String label, Duration duration) { - final flex = - (duration.inMicroseconds / data.duration!.inMicroseconds * 100).round(); + final flex = (duration.inMicroseconds / data.duration!.inMicroseconds * 100) + .round(); return Flexible( flex: flex, child: DevToolsTooltip( @@ -795,19 +785,17 @@ class NetworkRequestOverviewView extends StatelessWidget { _buildRow( context: context, title: 'Last read time', - child: - lastReadTimestamp != null - ? _valueText(formatDateTime(lastReadTimestamp)) - : _valueText('--'), + child: lastReadTimestamp != null + ? _valueText(formatDateTime(lastReadTimestamp)) + : _valueText('--'), ), const SizedBox(height: defaultSpacing), _buildRow( context: context, title: 'Last write time', - child: - lastWriteTimestamp != null - ? _valueText(formatDateTime(lastWriteTimestamp)) - : _valueText('--'), + child: lastWriteTimestamp != null + ? _valueText(formatDateTime(lastWriteTimestamp)) + : _valueText('--'), ), ]; } diff --git a/packages/devtools_app/lib/src/screens/network/network_screen.dart b/packages/devtools_app/lib/src/screens/network/network_screen.dart index f9b38850e9a..97bd753c811 100644 --- a/packages/devtools_app/lib/src/screens/network/network_screen.dart +++ b/packages/devtools_app/lib/src/screens/network/network_screen.dart @@ -86,12 +86,11 @@ class NetworkScreen extends Screen { return SizedBox( width: smallProgressSize, height: smallProgressSize, - child: - recording - ? SmallCircularProgressIndicator( - valueColor: AlwaysStoppedAnimation(color), - ) - : const SizedBox(), + child: recording + ? SmallCircularProgressIndicator( + valueColor: AlwaysStoppedAnimation(color), + ) + : const SizedBox(), ); }, ), @@ -154,8 +153,8 @@ class _NetworkScreenBodyState extends State return Column( children: [ OfflineAwareControls( - controlsBuilder: - (offline) => _NetworkProfilerControls(offline: offline), + controlsBuilder: (offline) => + _NetworkProfilerControls(offline: offline), gaScreen: gac.network, ), const SizedBox(height: intermediateSpacing), @@ -212,10 +211,9 @@ class _NetworkProfilerControlsState extends State<_NetworkProfilerControls> StartStopRecordingButton( recording: _recording, onPressed: () async => await controller.togglePolling(!_recording), - tooltipOverride: - _recording - ? 'Stop recording network traffic' - : 'Resume recording network traffic', + tooltipOverride: _recording + ? 'Stop recording network traffic' + : 'Resume recording network traffic', minScreenWidthForTextBeforeScaling: double.infinity, gaScreen: gac.network, gaSelection: _recording ? gac.pause : gac.resume, @@ -234,10 +232,9 @@ class _NetworkProfilerControlsState extends State<_NetworkProfilerControls> child: SearchField( searchController: controller, searchFieldEnabled: hasRequests, - searchFieldWidth: - screenWidth <= MediaSize.xs - ? defaultSearchFieldWidth - : wideSearchFieldWidth, + searchFieldWidth: screenWidth <= MediaSize.xs + ? defaultSearchFieldWidth + : wideSearchFieldWidth, ), ), const SizedBox(width: denseSpacing), @@ -252,8 +249,8 @@ class _NetworkProfilerControlsState extends State<_NetworkProfilerControls> OpenSaveButtonGroup( screenId: ScreenMetaData.network.id, saveFormats: const [SaveFormat.devtools, SaveFormat.har], - gaItemForSaveFormatSelection: - (SaveFormat format) => switch (format) { + gaItemForSaveFormatSelection: (SaveFormat format) => + switch (format) { SaveFormat.devtools => gac.saveFile, SaveFormat.har => gac.NetworkEvent.downloadAsHar.name, }, @@ -503,10 +500,9 @@ class StatusColumn extends ColumnData final theme = Theme.of(context); return Text( getDisplayValue(data), - style: - data.didFail - ? TextStyle(color: theme.colorScheme.error) - : theme.regularTextStyle, + style: data.didFail + ? TextStyle(color: theme.colorScheme.error) + : theme.regularTextStyle, ); } } diff --git a/packages/devtools_app/lib/src/screens/network/network_service.dart b/packages/devtools_app/lib/src/screens/network/network_service.dart index 4368d11faaf..0d75ff8c8d8 100644 --- a/packages/devtools_app/lib/src/screens/network/network_service.dart +++ b/packages/devtools_app/lib/src/screens/network/network_service.dart @@ -29,8 +29,8 @@ class NetworkService { bool alreadyRecordingSocketData = false, }) async { // Set the current timeline time as the time of the last refresh. - final timestampObj = - await serviceConnection.serviceManager.service!.getVMTimelineMicros(); + final timestampObj = await serviceConnection.serviceManager.service! + .getVMTimelineMicros(); final timestamp = timestampObj.timestamp!; if (!alreadyRecordingSocketData) { @@ -68,8 +68,8 @@ class NetworkService { DebounceCancelledCallback? cancelledCallback, }) async { if (serviceConnection.serviceManager.service == null) return; - final timestampObj = - await serviceConnection.serviceManager.service!.getVMTimelineMicros(); + final timestampObj = await serviceConnection.serviceManager.service! + .getVMTimelineMicros(); if (cancelledCallback?.call() ?? false) return; final timestamp = timestampObj.timestamp!; diff --git a/packages/devtools_app/lib/src/screens/network/offline_network_data.dart b/packages/devtools_app/lib/src/screens/network/offline_network_data.dart index 63c34bb3a94..ce6855ac382 100644 --- a/packages/devtools_app/lib/src/screens/network/offline_network_data.dart +++ b/packages/devtools_app/lib/src/screens/network/offline_network_data.dart @@ -83,11 +83,13 @@ class OfflineNetworkData with Serializable { @override Map toJson() { return { - _OfflineDataKeys.httpRequestData.name: - httpRequestData.map((e) => e.toJson()).toList(), + _OfflineDataKeys.httpRequestData.name: httpRequestData + .map((e) => e.toJson()) + .toList(), _OfflineDataKeys.selectedRequestId.name: selectedRequestId, - _OfflineDataKeys.socketData.name: - socketData.map((e) => e.toJson()).toList(), + _OfflineDataKeys.socketData.name: socketData + .map((e) => e.toJson()) + .toList(), _OfflineDataKeys.timelineMicrosOffset.name: timelineMicrosOffset, }; } diff --git a/packages/devtools_app/lib/src/screens/network/utils/http_utils.dart b/packages/devtools_app/lib/src/screens/network/utils/http_utils.dart index 4225665af94..9efd5482a73 100644 --- a/packages/devtools_app/lib/src/screens/network/utils/http_utils.dart +++ b/packages/devtools_app/lib/src/screens/network/utils/http_utils.dart @@ -13,16 +13,15 @@ int calculateHeadersSize(Map? headers) { if (headers == null) return -1; // Combine headers into a single string with CRLF endings - String headersString = - headers.entries.map((entry) { - final key = entry.key; - var value = entry.value; - // If the value is a List, join it with a comma - if (value is List) { - value = value.join(', '); - } - return '$key: $value\r\n'; - }).join(); + String headersString = headers.entries.map((entry) { + final key = entry.key; + var value = entry.value; + // If the value is a List, join it with a comma + if (value is List) { + value = value.join(', '); + } + return '$key: $value\r\n'; + }).join(); // Add final CRLF to indicate end of headers headersString += '\r\n'; diff --git a/packages/devtools_app/lib/src/screens/performance/panes/controls/enhance_tracing/enhance_tracing.dart b/packages/devtools_app/lib/src/screens/performance/panes/controls/enhance_tracing/enhance_tracing.dart index 68776c60de0..7b858a52107 100644 --- a/packages/devtools_app/lib/src/screens/performance/panes/controls/enhance_tracing/enhance_tracing.dart +++ b/packages/devtools_app/lib/src/screens/performance/panes/controls/enhance_tracing/enhance_tracing.dart @@ -181,17 +181,16 @@ class _TraceWidgetBuildsSettingState extends State ServiceExtensionState newState, TraceWidgetBuildsScope type, ) async { - final otherState = - serviceConnection.serviceManager.serviceExtensionManager - .getServiceExtensionState(type.opposite.extensionForScope.extension) - .value - .enabled; - final traceAllWidgets = - type == TraceWidgetBuildsScope.all ? newState.enabled : otherState; - final traceUserWidgets = - type == TraceWidgetBuildsScope.userCreated - ? newState.enabled - : otherState; + final otherState = serviceConnection.serviceManager.serviceExtensionManager + .getServiceExtensionState(type.opposite.extensionForScope.extension) + .value + .enabled; + final traceAllWidgets = type == TraceWidgetBuildsScope.all + ? newState.enabled + : otherState; + final traceUserWidgets = type == TraceWidgetBuildsScope.userCreated + ? newState.enabled + : otherState; await _updateTracing( traceAllWidgets: traceAllWidgets, traceUserWidgets: traceUserWidgets, @@ -220,10 +219,9 @@ class _TraceWidgetBuildsSettingState extends State // Double nested conditinoal expressions are hard to read. // ignore: prefer-conditional-expression if (_tracingEnabled.value) { - _selectedScope.value = - traceUserWidgets - ? TraceWidgetBuildsScope.userCreated - : TraceWidgetBuildsScope.all; + _selectedScope.value = traceUserWidgets + ? TraceWidgetBuildsScope.userCreated + : TraceWidgetBuildsScope.all; } else { _selectedScope.value = null; } diff --git a/packages/devtools_app/lib/src/screens/performance/panes/controls/enhance_tracing/enhance_tracing_controller.dart b/packages/devtools_app/lib/src/screens/performance/panes/controls/enhance_tracing/enhance_tracing_controller.dart index 91bcfe168da..458a43ea9f4 100644 --- a/packages/devtools_app/lib/src/screens/performance/panes/controls/enhance_tracing/enhance_tracing_controller.dart +++ b/packages/devtools_app/lib/src/screens/performance/panes/controls/enhance_tracing/enhance_tracing_controller.dart @@ -60,8 +60,9 @@ class EnhanceTracingController extends DisposableController .listen((event) { if (event.extensionKind == 'Flutter.Frame' && _firstLiveFrameId == null) { - _firstLiveFrameId = - FlutterFrame.fromJson(event.extensionData!.data).id; + _firstLiveFrameId = FlutterFrame.fromJson( + event.extensionData!.data, + ).id; unawaited(_firstFrameEventSubscription!.cancel()); _firstFrameEventSubscription = null; } diff --git a/packages/devtools_app/lib/src/screens/performance/panes/flutter_frames/flutter_frame_model.dart b/packages/devtools_app/lib/src/screens/performance/panes/flutter_frames/flutter_frame_model.dart index 7ba1605930c..ee3e547b5a8 100644 --- a/packages/devtools_app/lib/src/screens/performance/panes/flutter_frames/flutter_frame_model.dart +++ b/packages/devtools_app/lib/src/screens/performance/panes/flutter_frames/flutter_frame_model.dart @@ -27,10 +27,9 @@ class FlutterFrame { final timeStart = Duration(microseconds: json[startTimeKey]! as int); final timeEnd = timeStart + Duration(microseconds: json[elapsedKey]! as int); - final frameTime = - TimeRange() - ..start = timeStart - ..end = timeEnd; + final frameTime = TimeRange() + ..start = timeStart + ..end = timeEnd; return FlutterFrame._( id: json[numberKey]! as int, timeFromFrameTiming: frameTime, diff --git a/packages/devtools_app/lib/src/screens/performance/panes/flutter_frames/flutter_frames_chart.dart b/packages/devtools_app/lib/src/screens/performance/panes/flutter_frames/flutter_frames_chart.dart index 1a42f8bcf2d..4ef2fa82fc3 100644 --- a/packages/devtools_app/lib/src/screens/performance/panes/flutter_frames/flutter_frames_chart.dart +++ b/packages/devtools_app/lib/src/screens/performance/panes/flutter_frames/flutter_frames_chart.dart @@ -113,10 +113,9 @@ class _FlutterFramesChartState extends State<_FlutterFramesChart> { } void _maybeShowShaderJankMessage() { - final shaderJankFrames = - widget.frames - .where((frame) => frame.hasShaderJank(widget.displayRefreshRate)) - .toList(); + final shaderJankFrames = widget.frames + .where((frame) => frame.hasShaderJank(widget.displayRefreshRate)) + .toList(); if (shaderJankFrames.isNotEmpty) { final Duration shaderJankDuration = shaderJankFrames.fold( Duration.zero, @@ -124,10 +123,9 @@ class _FlutterFramesChartState extends State<_FlutterFramesChart> { ); bannerMessages.addMessage( ShaderJankMessage( - screenId: - offlineDataController.showingOfflineData.value - ? ScreenMetaData.simple.id - : ScreenMetaData.performance.id, + screenId: offlineDataController.showingOfflineData.value + ? ScreenMetaData.simple.id + : ScreenMetaData.performance.id, jankyFramesCount: shaderJankFrames.length, jankDuration: shaderJankDuration, ), @@ -302,18 +300,17 @@ class _FramesChartState extends State with AutoDisposeMixin { scrollDirection: Axis.horizontal, itemCount: widget.frames.length, itemExtent: _defaultFrameWidthWithPadding, - itemBuilder: - (context, index) => FlutterFramesChartItem( - framesController: widget.framesController, - index: index, - frame: widget.frames[index], - selected: widget.frames[index] == _selectedFrame, - msPerPx: _msPerPx, - availableChartHeight: - defaultChartHeight - 2 * _outlineBorderWidth, - displayRefreshRate: widget.displayRefreshRate, - onSelected: (index) => _selectedFrameIndex = index, - ), + itemBuilder: (context, index) => FlutterFramesChartItem( + framesController: widget.framesController, + index: index, + frame: widget.frames[index], + selected: widget.frames[index] == _selectedFrame, + msPerPx: _msPerPx, + availableChartHeight: + defaultChartHeight - 2 * _outlineBorderWidth, + displayRefreshRate: widget.displayRefreshRate, + onSelected: (index) => _selectedFrameIndex = index, + ), ), ), ), @@ -345,7 +342,10 @@ class _FramesChartState extends State with AutoDisposeMixin { return Stack( children: [ chartAxisPainter, - Padding(padding: EdgeInsets.only(left: _yAxisUnitsSpace), child: chart), + Padding( + padding: EdgeInsets.only(left: _yAxisUnitsSpace), + child: chart, + ), fpsLinePainter, ValueListenableBuilder( valueListenable: widget.impellerEnabled, @@ -567,8 +567,9 @@ class FlutterFramesChartItem extends StatelessWidget { hasShaderJank: hasShaderJank, child: Container( padding: const EdgeInsets.symmetric(horizontal: densePadding), - color: - selected ? colorScheme.selectedFrameBackgroundColor : null, + color: selected + ? colorScheme.selectedFrameBackgroundColor + : null, child: Column( children: [ // Dummy child so that the InkWell does not take up the entire column. @@ -600,16 +601,19 @@ class FlutterFramesChartItem extends StatelessWidget { ); return index % 2 == 0 ? Stack( - children: [ - content, - Container( - margin: EdgeInsets.only(top: defaultChartHeight), - height: _FlutterFramesChart.frameNumberSectionHeight, - alignment: AlignmentDirectional.center, - child: Text('${frame.id}', style: themeData.subtleChartTextStyle), - ), - ], - ) + children: [ + content, + Container( + margin: EdgeInsets.only(top: defaultChartHeight), + height: _FlutterFramesChart.frameNumberSectionHeight, + alignment: AlignmentDirectional.center, + child: Text( + '${frame.id}', + style: themeData.subtleChartTextStyle, + ), + ), + ], + ) : content; } @@ -622,12 +626,11 @@ class FlutterFramesChartItem extends StatelessWidget { ga.select( gac.performance, gac.PerformanceEvents.selectFlutterFrame.name, - screenMetricsProvider: - () => PerformanceScreenMetrics( - uiDuration: frame.buildTime, - rasterDuration: frame.rasterTime, - shaderCompilationDuration: frame.shaderDuration, - ), + screenMetricsProvider: () => PerformanceScreenMetrics( + uiDuration: frame.buildTime, + rasterDuration: frame.rasterTime, + shaderCompilationDuration: frame.shaderDuration, + ), ); } framesController.handleSelectedFrame(frame); @@ -668,10 +671,9 @@ class FlutterFrameTooltip extends StatelessWidget { 'UI: ${durationText(frame.buildTime, unit: DurationDisplayUnit.milliseconds, allowRoundingToZero: false)}'; final rasterText = 'Raster: ${durationText(frame.rasterTime, unit: DurationDisplayUnit.milliseconds, allowRoundingToZero: false)}'; - final shaderText = - hasShaderJank - ? 'Shader Compilation: ${durationText(frame.shaderDuration, unit: DurationDisplayUnit.milliseconds, allowRoundingToZero: false)} -' - : ''; + final shaderText = hasShaderJank + ? 'Shader Compilation: ${durationText(frame.shaderDuration, unit: DurationDisplayUnit.milliseconds, allowRoundingToZero: false)} -' + : ''; return HoverCardData( position: HoverCardPosition.element, width: _calculateTooltipWidth([ @@ -700,11 +702,10 @@ class FlutterFrameTooltip extends StatelessWidget { MoreInfoLink( url: preCompileShadersDocsUrl, gaScreenName: gac.performance, - gaSelectedItemDescription: - gac - .PerformanceDocs - .shaderCompilationDocsTooltipLink - .name, + gaSelectedItemDescription: gac + .PerformanceDocs + .shaderCompilationDocsTooltipLink + .name, ), ], ), diff --git a/packages/devtools_app/lib/src/screens/performance/panes/flutter_frames/flutter_frames_controller.dart b/packages/devtools_app/lib/src/screens/performance/panes/flutter_frames/flutter_frames_controller.dart index e4dda55a1a0..0c83414cf28 100644 --- a/packages/devtools_app/lib/src/screens/performance/panes/flutter_frames/flutter_frames_controller.dart +++ b/packages/devtools_app/lib/src/screens/performance/panes/flutter_frames/flutter_frames_controller.dart @@ -75,10 +75,9 @@ class FlutterFramesController extends PerformanceFeatureController { // Default to true for profile builds only. _badgeTabForJankyFrames.value = await connectedApp.isProfileBuild; - final refreshRate = - connectedApp.isFlutterAppNow! - ? await serviceConnection.queryDisplayRefreshRate - : defaultRefreshRate; + final refreshRate = connectedApp.isFlutterAppNow! + ? await serviceConnection.queryDisplayRefreshRate + : defaultRefreshRate; _displayRefreshRate.value = refreshRate ?? defaultRefreshRate; } diff --git a/packages/devtools_app/lib/src/screens/performance/panes/frame_analysis/frame_analysis_model.dart b/packages/devtools_app/lib/src/screens/performance/panes/frame_analysis/frame_analysis_model.dart index 5658c339ee0..eaa84ac5c1c 100644 --- a/packages/devtools_app/lib/src/screens/performance/panes/frame_analysis/frame_analysis_model.dart +++ b/packages/devtools_app/lib/src/screens/performance/panes/frame_analysis/frame_analysis_model.dart @@ -109,13 +109,11 @@ class FrameAnalysis { late FramePhase longestUiPhase = _calculateLongestFramePhase(); - bool get hasUiData => - _hasUiData ??= - [ - ...buildPhase.events, - ...layoutPhase.events, - ...paintPhase.events, - ].isNotEmpty; + bool get hasUiData => _hasUiData ??= [ + ...buildPhase.events, + ...layoutPhase.events, + ...paintPhase.events, + ].isNotEmpty; bool? _hasUiData; diff --git a/packages/devtools_app/lib/src/screens/performance/panes/frame_analysis/frame_hints.dart b/packages/devtools_app/lib/src/screens/performance/panes/frame_analysis/frame_hints.dart index 58edaccb87f..46e7f7f85a1 100644 --- a/packages/devtools_app/lib/src/screens/performance/panes/frame_analysis/frame_hints.dart +++ b/packages/devtools_app/lib/src/screens/performance/panes/frame_analysis/frame_hints.dart @@ -47,34 +47,32 @@ class FrameHints extends StatelessWidget { final theme = Theme.of(context); final saveLayerCount = frameAnalysis.saveLayerCount; final intrinsicOperationsCount = frameAnalysis.intrinsicOperationsCount; - final uiHints = - showUiJankHints - ? [ - Text('UI Jank Detected', style: theme.errorTextStyle), - const SizedBox(height: denseSpacing), - EnhanceTracingHint( - longestPhase: frameAnalysis.longestUiPhase, - enhanceTracingState: frameAnalysis.frame.enhanceTracingState, - enhanceTracingController: enhanceTracingController, - ), - const SizedBox(height: densePadding), - if (intrinsicOperationsCount > 0) - IntrinsicOperationsHint(intrinsicOperationsCount), - ] - : []; - final rasterHints = - showRasterJankHints - ? [ - Text('Raster Jank Detected', style: theme.errorTextStyle), - const SizedBox(height: denseSpacing), - if (saveLayerCount > 0) CanvasSaveLayerHint(saveLayerCount), - const SizedBox(height: denseSpacing), - if (frame.hasShaderTime) - ShaderCompilationHint(shaderTime: frame.shaderDuration), - const SizedBox(height: denseSpacing), - const GeneralRasterJankHint(), - ] - : []; + final uiHints = showUiJankHints + ? [ + Text('UI Jank Detected', style: theme.errorTextStyle), + const SizedBox(height: denseSpacing), + EnhanceTracingHint( + longestPhase: frameAnalysis.longestUiPhase, + enhanceTracingState: frameAnalysis.frame.enhanceTracingState, + enhanceTracingController: enhanceTracingController, + ), + const SizedBox(height: densePadding), + if (intrinsicOperationsCount > 0) + IntrinsicOperationsHint(intrinsicOperationsCount), + ] + : []; + final rasterHints = showRasterJankHints + ? [ + Text('Raster Jank Detected', style: theme.errorTextStyle), + const SizedBox(height: denseSpacing), + if (saveLayerCount > 0) CanvasSaveLayerHint(saveLayerCount), + const SizedBox(height: denseSpacing), + if (frame.hasShaderTime) + ShaderCompilationHint(shaderTime: frame.shaderDuration), + const SizedBox(height: denseSpacing), + const GeneralRasterJankHint(), + ] + : []; return Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -340,28 +338,27 @@ class ShaderCompilationHint extends StatelessWidget { ), ], ), - childrenSpans: - serviceConnection.serviceManager.connectedApp!.isIosApp - ? [ - TextSpan( - text: - ' Note: pre-compiling shaders is a legacy solution with many ' - 'pitfalls. Try ', - style: theme.regularTextStyle, - ), - GaLinkTextSpan( - link: GaLink( - display: 'Impeller', - url: impellerDocsUrl, - gaScreenName: gac.performance, - gaSelectedItemDescription: - gac.PerformanceDocs.impellerDocsLink.name, - ), - context: context, + childrenSpans: serviceConnection.serviceManager.connectedApp!.isIosApp + ? [ + TextSpan( + text: + ' Note: pre-compiling shaders is a legacy solution with many ' + 'pitfalls. Try ', + style: theme.regularTextStyle, + ), + GaLinkTextSpan( + link: GaLink( + display: 'Impeller', + url: impellerDocsUrl, + gaScreenName: gac.performance, + gaSelectedItemDescription: + gac.PerformanceDocs.impellerDocsLink.name, ), - TextSpan(text: ' instead!', style: theme.regularTextStyle), - ] - : [], + context: context, + ), + TextSpan(text: ' instead!', style: theme.regularTextStyle), + ] + : [], ), ); } diff --git a/packages/devtools_app/lib/src/screens/performance/panes/frame_analysis/frame_time_visualizer.dart b/packages/devtools_app/lib/src/screens/performance/panes/frame_analysis/frame_time_visualizer.dart index d3c5a38c58f..44584c2464e 100644 --- a/packages/devtools_app/lib/src/screens/performance/panes/frame_analysis/frame_time_visualizer.dart +++ b/packages/devtools_app/lib/src/screens/performance/panes/frame_analysis/frame_time_visualizer.dart @@ -178,7 +178,11 @@ class _FrameBlockGroup extends StatelessWidget { return Column( crossAxisAlignment: CrossAxisAlignment.start, - children: [Text(title), const SizedBox(height: denseSpacing), content], + children: [ + Text(title), + const SizedBox(height: denseSpacing), + content, + ], ); } @@ -191,12 +195,9 @@ class _FrameBlockGroup extends StatelessWidget { BoxConstraints constraints, int totalFlex, ) { - final unadjustedBlockWidths = - data - .map( - (blockData) => constraints.maxWidth * blockData.flex / totalFlex, - ) - .toList(); + final unadjustedBlockWidths = data + .map((blockData) => constraints.maxWidth * blockData.flex / totalFlex) + .toList(); var adjustment = 0.0; var widestBlockIndex = 0; @@ -211,13 +212,11 @@ class _FrameBlockGroup extends StatelessWidget { } } - final adjustedBlockWidths = - unadjustedBlockWidths - .map( - (blockWidth) => - math.max(blockWidth, _FramePhaseBlock.minBlockWidth), - ) - .toList(); + final adjustedBlockWidths = unadjustedBlockWidths + .map( + (blockWidth) => math.max(blockWidth, _FramePhaseBlock.minBlockWidth), + ) + .toList(); final widest = adjustedBlockWidths[widestBlockIndex]; adjustedBlockWidths[widestBlockIndex] = math.max( widest - adjustment, @@ -303,14 +302,13 @@ class _FramePhaseBlockData { final IconData icon; String get display { - final text = - duration != Duration.zero - ? durationText( - duration, - unit: DurationDisplayUnit.milliseconds, - allowRoundingToZero: false, - ) - : '--'; + final text = duration != Duration.zero + ? durationText( + duration, + unit: DurationDisplayUnit.milliseconds, + allowRoundingToZero: false, + ) + : '--'; return '$title - $text'; } } diff --git a/packages/devtools_app/lib/src/screens/performance/panes/rebuild_stats/rebuild_stats.dart b/packages/devtools_app/lib/src/screens/performance/panes/rebuild_stats/rebuild_stats.dart index 254c19e2974..4a2521d921c 100644 --- a/packages/devtools_app/lib/src/screens/performance/panes/rebuild_stats/rebuild_stats.dart +++ b/packages/devtools_app/lib/src/screens/performance/panes/rebuild_stats/rebuild_stats.dart @@ -208,9 +208,8 @@ class _RebuildTableState extends State { dataKey: 'RebuildMetricsTable', columns: _columns, data: widget.metrics, - keyFactory: - (RebuildLocationStats location) => - ValueKey('${location.location.id}'), + keyFactory: (RebuildLocationStats location) => + ValueKey('${location.location.id}'), defaultSortColumn: _metricsColumns.first, defaultSortDirection: sortDirection, onItemSelected: (item) async { diff --git a/packages/devtools_app/lib/src/screens/performance/panes/rebuild_stats/rebuild_stats_model.dart b/packages/devtools_app/lib/src/screens/performance/panes/rebuild_stats/rebuild_stats_model.dart index e6a5c1eb7fd..153778fa520 100644 --- a/packages/devtools_app/lib/src/screens/performance/panes/rebuild_stats/rebuild_stats_model.dart +++ b/packages/devtools_app/lib/src/screens/performance/panes/rebuild_stats/rebuild_stats_model.dart @@ -186,8 +186,8 @@ class RebuildCountModel { RebuildCountModel.fromJson(Map json) { if (json.isEmpty) return; locationMap.processLocationMap(json[_locationsKey] as Map); - final frames = - (json[_framesKey] as List).cast>(); + final frames = (json[_framesKey] as List) + .cast>(); frames.forEach(processRebuildsForFrame); } diff --git a/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/perfetto/_perfetto_controller_web.dart b/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/perfetto/_perfetto_controller_web.dart index 937149ed605..ed9bc3a6f3e 100644 --- a/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/perfetto/_perfetto_controller_web.dart +++ b/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/perfetto/_perfetto_controller_web.dart @@ -169,12 +169,11 @@ class PerfettoControllerImpl extends PerfettoController { ); _initialized = true; - _perfettoIFrame = - HTMLIFrameElement() - // This url is safe because we built it ourselves and it does not include - // any user input. - ..src = perfettoUrl - ..allow = 'usb'; + _perfettoIFrame = HTMLIFrameElement() + // This url is safe because we built it ourselves and it does not include + // any user input. + ..src = perfettoUrl + ..allow = 'usb'; _perfettoIFrame.style ..border = 'none' ..height = '100%' diff --git a/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/perfetto/tracing/model.dart b/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/perfetto/tracing/model.dart index de836a1614b..c2ec2f4d12b 100644 --- a/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/perfetto/tracing/model.dart +++ b/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/perfetto/tracing/model.dart @@ -39,10 +39,9 @@ class PerfettoTrackDescriptorEvent extends _PerfettoTracePacket { final TrackDescriptor trackDescriptor; - String get name => - trackDescriptor.name.isNotEmpty - ? trackDescriptor.name - : trackDescriptor.thread.threadName; + String get name => trackDescriptor.name.isNotEmpty + ? trackDescriptor.name + : trackDescriptor.thread.threadName; Int64 get id => trackDescriptor.uuid; diff --git a/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/timeline_event_processor.dart b/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/timeline_event_processor.dart index ae1071e26e0..a6b4e4ce1a4 100644 --- a/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/timeline_event_processor.dart +++ b/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/timeline_event_processor.dart @@ -34,8 +34,8 @@ class FlutterTimelineEventProcessor { /// The Flutter frame range that we have processed track events for. Range? get frameRangeFromTimelineEvents => _startFrameId == null || _endFrameId == null - ? null - : Range(_startFrameId!, _endFrameId!); + ? null + : Range(_startFrameId!, _endFrameId!); int? _startFrameId; int? _endFrameId; diff --git a/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/timeline_events_controller.dart b/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/timeline_events_controller.dart index b1a88145451..f016506bde3 100644 --- a/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/timeline_events_controller.dart +++ b/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/timeline_events_controller.dart @@ -52,8 +52,9 @@ class TimelineEventsController extends PerformanceFeatureController static const gpuThreadSuffix = '.gpu'; static const platformThreadSuffix = '.platform'; static const flutterTestThreadSuffix = '.flutter.test..ui'; - static final _refreshWorkTrackerDelay = - const Duration(milliseconds: 500).inMicroseconds; + static final _refreshWorkTrackerDelay = const Duration( + milliseconds: 500, + ).inMicroseconds; /// Controller that contains business logic for the Perfetto trace viewer. late final PerfettoController perfettoController; @@ -83,8 +84,11 @@ class TimelineEventsController extends PerformanceFeatureController /// Size limit in GB for [traceRingBuffer] that determines when traces should /// be removed from the queue. - final _traceRingBufferSize = - convertBytes(1, from: ByteUnit.gb, to: ByteUnit.byte).round(); + final _traceRingBufferSize = convertBytes( + 1, + from: ByteUnit.gb, + to: ByteUnit.byte, + ).round(); /// Track events that we have received from the VM, but have not yet /// processed. @@ -357,12 +361,11 @@ class TimelineEventsController extends PerformanceFeatureController ga.timeSync( gac.performance, gac.PerformanceEvents.perfettoModeTraceEventProcessingTime.nameOverride!, - syncOperation: - () => perfettoController.processor.processTrackEvents( - _unprocessedTrackEvents, - ), - screenMetricsProvider: - () => PerformanceScreenMetrics(traceEventCount: eventCount), + syncOperation: () => perfettoController.processor.processTrackEvents( + _unprocessedTrackEvents, + ), + screenMetricsProvider: () => + PerformanceScreenMetrics(traceEventCount: eventCount), ); _unprocessedTrackEvents.clear(); } @@ -488,7 +491,7 @@ class TimelineEventsController extends PerformanceFeatureController return offlineDataController.showingOfflineData.value ? offlineData != null && offlineData.frames.isNotEmpty : serviceConnection.serviceManager.connectedApp?.isFlutterAppNow ?? - false; + false; } void _maybePushNoTimelineEventsWarning() { diff --git a/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/timeline_events_view.dart b/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/timeline_events_view.dart index 1a44da58283..682b3702817 100644 --- a/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/timeline_events_view.dart +++ b/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/timeline_events_view.dart @@ -181,10 +181,9 @@ class RefreshTimelineEventsButton extends StatelessWidget { return RefreshButton( iconOnly: true, outlined: false, - onPressed: - status == EventsControllerStatus.refreshing - ? null - : controller.forceRefresh, + onPressed: status == EventsControllerStatus.refreshing + ? null + : controller.forceRefresh, tooltip: 'Refresh timeline events', gaScreen: gac.performance, gaSelection: gac.PerformanceEvents.refreshTimelineEvents.name, @@ -249,7 +248,9 @@ class _TimelineSettingsDialogState extends State List _defaultRecordedStreams(ThemeData theme) { return [ ...dialogSubHeader(theme, 'Trace categories'), - RichText(text: TextSpan(text: 'Default', style: theme.subtleTextStyle)), + RichText( + text: TextSpan(text: 'Default', style: theme.subtleTextStyle), + ), ..._timelineStreams(advanced: false), // Special case "Network Traffic" because it is not implemented as a // Timeline recorded stream in the VM. The user does not need to be aware of @@ -258,41 +259,40 @@ class _TimelineSettingsDialogState extends State title: 'Network', description: 'Http traffic', notifier: _httpLogging, - onChanged: - (value) => unawaited( - http_service.toggleHttpRequestLogging(value ?? false), - ), + onChanged: (value) => + unawaited(http_service.toggleHttpRequestLogging(value ?? false)), ), ]; } List _advancedStreams(ThemeData theme) { return [ - RichText(text: TextSpan(text: 'Advanced', style: theme.subtleTextStyle)), + RichText( + text: TextSpan(text: 'Advanced', style: theme.subtleTextStyle), + ), ..._timelineStreams(advanced: true), ]; } List _timelineStreams({required bool advanced}) { - final streams = - advanced - ? serviceConnection.timelineStreamManager.advancedStreams - : serviceConnection.timelineStreamManager.basicStreams; - final settings = - streams - .map( - (stream) => CheckboxSetting( - title: stream.name, - description: stream.description, - notifier: stream.recorded as ValueNotifier, - onChanged: - (newValue) => unawaited( - serviceConnection.timelineStreamManager - .updateTimelineStream(stream, newValue ?? false), - ), + final streams = advanced + ? serviceConnection.timelineStreamManager.advancedStreams + : serviceConnection.timelineStreamManager.basicStreams; + final settings = streams + .map( + (stream) => CheckboxSetting( + title: stream.name, + description: stream.description, + notifier: stream.recorded as ValueNotifier, + onChanged: (newValue) => unawaited( + serviceConnection.timelineStreamManager.updateTimelineStream( + stream, + newValue ?? false, ), - ) - .toList(); + ), + ), + ) + .toList(); return settings; } } diff --git a/packages/devtools_app/lib/src/screens/performance/performance_controller.dart b/packages/devtools_app/lib/src/screens/performance/performance_controller.dart index c15d9311494..cfb4469afca 100644 --- a/packages/devtools_app/lib/src/screens/performance/performance_controller.dart +++ b/packages/devtools_app/lib/src/screens/performance/performance_controller.dart @@ -280,14 +280,13 @@ class PerformanceController extends DevToolsScreenController @override OfflineScreenData prepareOfflineScreenData() => OfflineScreenData( screenId: PerformanceScreen.id, - data: - OfflinePerformanceData( - perfettoTraceBinary: timelineEventsController.fullPerfettoTrace, - frames: flutterFramesController.flutterFrames.value, - selectedFrame: flutterFramesController.selectedFrame.value, - rebuildCountModel: rebuildCountModel, - displayRefreshRate: flutterFramesController.displayRefreshRate.value, - ).toJson(), + data: OfflinePerformanceData( + perfettoTraceBinary: timelineEventsController.fullPerfettoTrace, + frames: flutterFramesController.flutterFrames.value, + selectedFrame: flutterFramesController.selectedFrame.value, + rebuildCountModel: rebuildCountModel, + displayRefreshRate: flutterFramesController.displayRefreshRate.value, + ).toJson(), ); @override diff --git a/packages/devtools_app/lib/src/screens/performance/performance_model.dart b/packages/devtools_app/lib/src/screens/performance/performance_model.dart index b7b51cd814d..fbd4b4eaee8 100644 --- a/packages/devtools_app/lib/src/screens/performance/performance_model.dart +++ b/packages/devtools_app/lib/src/screens/performance/performance_model.dart @@ -69,8 +69,8 @@ class OfflinePerformanceData { extension type _PerformanceDataJson(Map json) { Uint8List? get traceBinary { - final value = - (json[OfflinePerformanceData.traceBinaryKey] as List?)?.cast(); + final value = (json[OfflinePerformanceData.traceBinaryKey] as List?) + ?.cast(); return value == null ? null : Uint8List.fromList(value); } @@ -138,10 +138,9 @@ class FlutterTimelineEvent extends TreeNode { } copy ..type = type - ..time = - (TimeRange() - ..start = time.start - ..end = time.end); + ..time = (TimeRange() + ..start = time.start + ..end = time.end); return copy; } diff --git a/packages/devtools_app/lib/src/screens/performance/performance_screen.dart b/packages/devtools_app/lib/src/screens/performance/performance_screen.dart index acf70f17942..ac10baf610d 100644 --- a/packages/devtools_app/lib/src/screens/performance/performance_screen.dart +++ b/packages/devtools_app/lib/src/screens/performance/performance_screen.dart @@ -180,7 +180,8 @@ const profileModeLink = 'https://flutter.dev/to/profile-mode'; const performancePanelLink = 'https://developer.chrome.com/docs/devtools/performance'; -const flutterWebInstructionsMd = ''' +const flutterWebInstructionsMd = + ''' ## How to use Chrome DevTools for performance profiling The Flutter framework emits timeline events as it works to build frames, draw @@ -206,7 +207,8 @@ performance analysis. your application, and start recording to capture timeline events. '''; -const dartWebInstructionsMd = ''' +const dartWebInstructionsMd = + ''' ## How to use Chrome DevTools for performance profiling Any events emitted using the `dart:developer` [Timeline]($timelineLink) and diff --git a/packages/devtools_app/lib/src/screens/performance/tabbed_performance_view.dart b/packages/devtools_app/lib/src/screens/performance/tabbed_performance_view.dart index f9f15a924f8..05eef54cd1c 100644 --- a/packages/devtools_app/lib/src/screens/performance/tabbed_performance_view.dart +++ b/packages/devtools_app/lib/src/screens/performance/tabbed_performance_view.dart @@ -73,12 +73,12 @@ class _TabbedPerformanceViewState extends State showFrameAnalysis: showFrameAnalysis, showRebuildStats: showRebuildStats, ); - final tabs = - tabsAndControllers - .map((t) => (tab: t.tab, tabView: t.tabView)) - .toList(); - final featureControllers = - tabsAndControllers.map((t) => t.featureController).toList(); + final tabs = tabsAndControllers + .map((t) => (tab: t.tab, tabView: t.tabView)) + .toList(); + final featureControllers = tabsAndControllers + .map((t) => t.featureController) + .toList(); // If there is not an active feature, activate the first. if (featureControllers.firstWhereOrNull( @@ -125,19 +125,18 @@ class _TabbedPerformanceViewState extends State ( tab: _buildTab(tabName: 'Frame Analysis'), tabView: KeepAliveWrapper( - child: - _selectedFlutterFrame != null - ? FlutterFrameAnalysisView( - frame: _selectedFlutterFrame!, - enhanceTracingController: - controller.enhanceTracingController, - rebuildCountModel: controller.rebuildCountModel, - displayRefreshRateNotifier: - controller.flutterFramesController.displayRefreshRate, - ) - : const CenteredMessage( - message: 'Select a frame above to view analysis data.', - ), + child: _selectedFlutterFrame != null + ? FlutterFrameAnalysisView( + frame: _selectedFlutterFrame!, + enhanceTracingController: + controller.enhanceTracingController, + rebuildCountModel: controller.rebuildCountModel, + displayRefreshRateNotifier: + controller.flutterFramesController.displayRefreshRate, + ) + : const CenteredMessage( + message: 'Select a frame above to view analysis data.', + ), ), featureController: null, ), diff --git a/packages/devtools_app/lib/src/screens/profiler/cpu_profile_model.dart b/packages/devtools_app/lib/src/screens/profiler/cpu_profile_model.dart index b05bc7fa821..060c2c79b90 100644 --- a/packages/devtools_app/lib/src/screens/profiler/cpu_profile_model.dart +++ b/packages/devtools_app/lib/src/screens/profiler/cpu_profile_model.dart @@ -190,14 +190,13 @@ class CpuProfileData with Serializable { sampleCount: json.sampleCount ?? 0, samplePeriod: samplePeriod, stackDepth: json.stackDepth ?? 0, - time: - (json.timeOriginMicros != null && json.timeExtentMicros != null) - ? (TimeRange() - ..start = Duration(microseconds: json.timeOriginMicros!) - ..end = Duration( - microseconds: json.timeOriginMicros! + json.timeExtentMicros!, - )) - : null, + time: (json.timeOriginMicros != null && json.timeExtentMicros != null) + ? (TimeRange() + ..start = Duration(microseconds: json.timeOriginMicros!) + ..end = Duration( + microseconds: json.timeOriginMicros! + json.timeExtentMicros!, + )) + : null, ); // Initialize all stack frames. @@ -241,14 +240,13 @@ class CpuProfileData with Serializable { ) { // Each sample in [subSamples] will have the leaf stack // frame id for a cpu sample within [subTimeRange]. - final subSamples = - superProfile.cpuSamples - .where( - (sample) => subTimeRange.contains( - Duration(microseconds: sample.timestampMicros!), - ), - ) - .toList(); + final subSamples = superProfile.cpuSamples + .where( + (sample) => subTimeRange.contains( + Duration(microseconds: sample.timestampMicros!), + ), + ) + .toList(); final subStackFrames = {}; for (final sample in subSamples) { @@ -348,10 +346,9 @@ class CpuProfileData with Serializable { profileMetaData: metaData, parentId: parentId, ); - final parentStackFrameJson = - parentId != null - ? originalData.stackFrames[currentStackFrame.parentId] - : null; + final parentStackFrameJson = parentId != null + ? originalData.stackFrames[currentStackFrame.parentId] + : null; updatedId = parentId; currentStackFrame = parentStackFrameJson; } @@ -384,12 +381,9 @@ class CpuProfileData with Serializable { return CpuProfileData.empty(); } - final samplesWithTag = - originalData.cpuSamples - .where( - (sample) => (useUserTag ? sample.userTag : sample.vmTag) == tag, - ) - .toList(); + final samplesWithTag = originalData.cpuSamples + .where((sample) => (useUserTag ? sample.userTag : sample.vmTag) == tag) + .toList(); assert(samplesWithTag.isNotEmpty); final microsPerSample = originalData.profileMetaData.samplePeriod; @@ -400,15 +394,13 @@ class CpuProfileData with Serializable { // for this profile data, and the samples included in this data could be // sparse over the original profile's time range, so true start and end // times wouldn't be helpful. - time: - TimeRange() - ..start = const Duration() - ..end = Duration( - microseconds: - microsPerSample.isInfinite - ? 0 - : (newSampleCount * microsPerSample).round(), - ), + time: TimeRange() + ..start = const Duration() + ..end = Duration( + microseconds: microsPerSample.isInfinite + ? 0 + : (newSampleCount * microsPerSample).round(), + ), ); final stackFramesWithTag = {}; @@ -423,8 +415,9 @@ class CpuProfileData with Serializable { profileMetaData: metaData, ); final parentId = currentStackFrame.parentId; - final parentStackFrameJson = - parentId != null ? originalData.stackFrames[parentId] : null; + final parentStackFrameJson = parentId != null + ? originalData.stackFrames[parentId] + : null; currentId = parentId; currentStackFrame = parentStackFrameJson; } @@ -506,15 +499,13 @@ class CpuProfileData with Serializable { // for this profile data, and the samples included in this data could be // sparse over the original profile's time range, so true start and end // times wouldn't be helpful. - time: - TimeRange() - ..start = const Duration() - ..end = Duration( - microseconds: - microsPerSample.isInfinite || microsPerSample.isNaN - ? 0 - : (filteredCpuSamples.length * microsPerSample).round(), - ), + time: TimeRange() + ..start = const Duration() + ..end = Duration( + microseconds: microsPerSample.isInfinite || microsPerSample.isNaN + ? 0 + : (filteredCpuSamples.length * microsPerSample).round(), + ), ); void walkAndFilter(CpuStackFrame stackFrame) { @@ -834,8 +825,8 @@ class CpuSampleEvent extends ChromeTraceEvent { factory CpuSampleEvent.fromJson(Map traceJson) { final leafId = traceJson[CpuProfileData.stackFrameIdKey]! as String; - final args = - (traceJson[ChromeTraceEvent.argsKey] as Map?)?.cast(); + final args = (traceJson[ChromeTraceEvent.argsKey] as Map?) + ?.cast(); final userTag = args?[CpuProfileData.userTagKey] as String?; final vmTag = args?[CpuProfileData.vmTagKey] as String?; return CpuSampleEvent( @@ -963,27 +954,24 @@ class CpuStackFrame extends TreeNode /// samples are being grouped by tag. final bool isTag; - bool get isNative => - _isNative ??= - id != CpuProfileData.rootId && - packageUri.isEmpty && - !name.startsWith(PackagePrefixes.flutterEngine) && - !isTag; + bool get isNative => _isNative ??= + id != CpuProfileData.rootId && + packageUri.isEmpty && + !name.startsWith(PackagePrefixes.flutterEngine) && + !isTag; bool? _isNative; - bool get isDartCore => - _isDartCore ??= - packageUri.startsWith(PackagePrefixes.dart) && - !packageUri.startsWith(PackagePrefixes.dartUi); + bool get isDartCore => _isDartCore ??= + packageUri.startsWith(PackagePrefixes.dart) && + !packageUri.startsWith(PackagePrefixes.dartUi); bool? _isDartCore; - bool get isFlutterCore => - _isFlutterCore ??= - packageUri.startsWith(PackagePrefixes.flutterPackage) || - name.startsWith(PackagePrefixes.flutterEngine) || - packageUri.startsWith(PackagePrefixes.dartUi); + bool get isFlutterCore => _isFlutterCore ??= + packageUri.startsWith(PackagePrefixes.flutterPackage) || + name.startsWith(PackagePrefixes.flutterEngine) || + packageUri.startsWith(PackagePrefixes.dartUi); bool? _isFlutterCore; @@ -1206,8 +1194,9 @@ class _CpuProfileTimelineTree { // TODO(bkonyi): handle truncated? for (final sample in cpuSamples.samples ?? []) { current = root; - final stack = - asCodeProfileTimelineTree ? sample.codeStack : sample.stack!; + final stack = asCodeProfileTimelineTree + ? sample.codeStack + : sample.stack!; // Build an inclusive trie. for (final index in stack.reversed) { current = current._getChild(index); @@ -1264,14 +1253,13 @@ class _CpuProfileTimelineTree { return null; } - String? get resolvedUrl => - isCodeTree && _function is vm_service.FuncRef? - ? - // TODO(bkonyi): not sure if this is a resolved URL or not, but it's not - // critical since this is only displayed when VM developer mode is - // enabled. - (_function as vm_service.FuncRef?)?.location?.script?.uri - : samples.functions?[index].resolvedUrl; + String? get resolvedUrl => isCodeTree && _function is vm_service.FuncRef? + ? + // TODO(bkonyi): not sure if this is a resolved URL or not, but it's not + // critical since this is only displayed when VM developer mode is + // enabled. + (_function as vm_service.FuncRef?)?.location?.script?.uri + : samples.functions?[index].resolvedUrl; int? get sourceLine { final function = _function; diff --git a/packages/devtools_app/lib/src/screens/profiler/cpu_profile_service.dart b/packages/devtools_app/lib/src/screens/profiler/cpu_profile_service.dart index f65506d4e0d..4628cee67fe 100644 --- a/packages/devtools_app/lib/src/screens/profiler/cpu_profile_service.dart +++ b/packages/devtools_app/lib/src/screens/profiler/cpu_profile_service.dart @@ -18,13 +18,12 @@ extension CpuProfilerExtension on VmService { // Grab the value of this flag before doing asynchronous work. final vmDeveloperModeEnabled = preferences.vmDeveloperModeEnabled.value; - final isolateId = - serviceConnection - .serviceManager - .isolateManager - .selectedIsolate - .value! - .id!; + final isolateId = serviceConnection + .serviceManager + .isolateManager + .selectedIsolate + .value! + .id!; final cpuSamples = await serviceConnection.serviceManager.service! .getCpuSamples(isolateId, startMicros, extentMicros); @@ -37,8 +36,8 @@ extension CpuProfilerExtension on VmService { const kSamples = 'samples'; const kCodeStack = '_codeStack'; - final rawSamples = - (cpuSamples.json![kSamples] as List).cast>(); + final rawSamples = (cpuSamples.json![kSamples] as List) + .cast>(); bool buildCodeProfile = false; if (rawSamples.isNotEmpty && rawSamples.first.containsKey(kCodeStack)) { diff --git a/packages/devtools_app/lib/src/screens/profiler/cpu_profiler.dart b/packages/devtools_app/lib/src/screens/profiler/cpu_profiler.dart index 0a2953f7845..23c9d93dad5 100644 --- a/packages/devtools_app/lib/src/screens/profiler/cpu_profiler.dart +++ b/packages/devtools_app/lib/src/screens/profiler/cpu_profiler.dart @@ -283,9 +283,8 @@ class _CpuProfilerState extends State unawaited( showDialog( context: context, - builder: - (context) => - FilterDialog(controller: widget.controller), + builder: (context) => + FilterDialog(controller: widget.controller), ), ); } @@ -324,10 +323,9 @@ class _CpuProfilerState extends State void Function(CpuStackFrame root) callback, Tab currentTab, ) { - final roots = - currentTab.key == ProfilerTab.callTree.key - ? widget.callTreeRoots - : widget.bottomUpRoots; + final roots = currentTab.key == ProfilerTab.callTree.key + ? widget.callTreeRoots + : widget.bottomUpRoots; setState(() { roots.forEach(callback); }); @@ -348,10 +346,9 @@ class CpuProfileStats extends StatelessWidget { Widget build(BuildContext context) { final theme = Theme.of(context); final samplePeriodValid = metadata.samplePeriod > 0; - final samplingPeriodDisplay = - samplePeriodValid - ? const Duration(seconds: 1).inMicroseconds ~/ metadata.samplePeriod - : '--'; + final samplingPeriodDisplay = samplePeriodValid + ? const Duration(seconds: 1).inMicroseconds ~/ metadata.samplePeriod + : '--'; return RoundedOutlinedBorder.onlyBottom( child: Container( height: _statsRowHeight, diff --git a/packages/devtools_app/lib/src/screens/profiler/cpu_profiler_controller.dart b/packages/devtools_app/lib/src/screens/profiler/cpu_profiler_controller.dart index 9b5bb32a8d5..4caea9b1072 100644 --- a/packages/devtools_app/lib/src/screens/profiler/cpu_profiler_controller.dart +++ b/packages/devtools_app/lib/src/screens/profiler/cpu_profiler_controller.dart @@ -224,10 +224,9 @@ class CpuProfilerController extends DisposableController /// Clients interested in the current value of [profilerFlagNotifier] should /// use this getter. Otherwise, clients subscribing to change notifications, /// should listen to [profilerFlagNotifier]. - bool get profilerEnabled => - offlineDataController.showingOfflineData.value - ? true - : profilerFlagNotifier?.value.valueAsString == 'true'; + bool get profilerEnabled => offlineDataController.showingOfflineData.value + ? true + : profilerFlagNotifier?.value.valueAsString == 'true'; Future enableCpuProfiler() { return serviceConnection.serviceManager.service!.enableCpuProfiler(); @@ -271,11 +270,10 @@ class CpuProfilerController extends DisposableController gac.cpuProfiler, gac.CpuProfilerEvents.cpuProfileProcessingTime.name, asyncOperation: pullAndProcessHelper, - screenMetricsProvider: - () => ProfilerScreenMetrics( - cpuSampleCount: cpuProfiles.profileMetaData.sampleCount, - cpuStackDepth: cpuProfiles.profileMetaData.stackDepth, - ), + screenMetricsProvider: () => ProfilerScreenMetrics( + cpuSampleCount: cpuProfiles.profileMetaData.sampleCount, + cpuStackDepth: cpuProfiles.profileMetaData.stackDepth, + ), ); } on ProcessCancelledException catch (_) { // Do nothing for instances of [ProcessCancelledException]. @@ -543,14 +541,12 @@ class CpuProfilerController extends DisposableController label: tag, createIfAbsent: () { final fullData = cpuProfileStore.lookupProfile(label: userTagNone)!; - final tagType = - tag == groupByUserTag - ? CpuProfilerTagType.user - : CpuProfilerTagType.vm; - final data = - tag == groupByUserTag || tag == groupByVmTag - ? CpuProfilePair.withTagRoots(fullData, tagType) - : CpuProfilePair.fromUserTag(fullData, tag); + final tagType = tag == groupByUserTag + ? CpuProfilerTagType.user + : CpuProfilerTagType.vm; + final data = tag == groupByUserTag || tag == groupByVmTag + ? CpuProfilePair.withTagRoots(fullData, tagType) + : CpuProfilePair.fromUserTag(fullData, tag); cpuProfileStore.storeProfile(data, label: tag); return data; }, diff --git a/packages/devtools_app/lib/src/screens/profiler/panes/bottom_up.dart b/packages/devtools_app/lib/src/screens/profiler/panes/bottom_up.dart index 3cf2cecf6bb..d12cfe5af77 100644 --- a/packages/devtools_app/lib/src/screens/profiler/panes/bottom_up.dart +++ b/packages/devtools_app/lib/src/screens/profiler/panes/bottom_up.dart @@ -18,15 +18,13 @@ class CpuBottomUpTable extends StatelessWidget { static final methodColumn = MethodAndSourceColumn(); static final selfTimeColumn = SelfTimeColumn( titleTooltip: selfTimeTooltip, - dataTooltipProvider: - (stackFrame, context) => - _bottomUpTimeTooltipBuilder(_TimeType.self, stackFrame, context), + dataTooltipProvider: (stackFrame, context) => + _bottomUpTimeTooltipBuilder(_TimeType.self, stackFrame, context), ); static final totalTimeColumn = TotalTimeColumn( titleTooltip: totalTimeTooltip, - dataTooltipProvider: - (stackFrame, context) => - _bottomUpTimeTooltipBuilder(_TimeType.total, stackFrame, context), + dataTooltipProvider: (stackFrame, context) => + _bottomUpTimeTooltipBuilder(_TimeType.total, stackFrame, context), ); static final columns = List>.unmodifiable([ totalTimeColumn, diff --git a/packages/devtools_app/lib/src/screens/profiler/panes/controls/cpu_profiler_controls.dart b/packages/devtools_app/lib/src/screens/profiler/panes/controls/cpu_profiler_controls.dart index 5d62d2ba543..88e818e204e 100644 --- a/packages/devtools_app/lib/src/screens/profiler/panes/controls/cpu_profiler_controls.dart +++ b/packages/devtools_app/lib/src/screens/profiler/panes/controls/cpu_profiler_controls.dart @@ -24,10 +24,9 @@ class UserTagDropdown extends StatelessWidget { valueListenable: controller.userTagFilter, builder: (context, userTag, _) { final userTags = controller.userTags; - final tooltip = - userTags.isNotEmpty - ? 'Filter the CPU profile by the given UserTag' - : 'No UserTags found for this CPU profile'; + final tooltip = userTags.isNotEmpty + ? 'Filter the CPU profile by the given UserTag' + : 'No UserTags found for this CPU profile'; return SizedBox( height: defaultButtonHeight, child: DevToolsTooltip( @@ -67,10 +66,10 @@ class UserTagDropdown extends StatelessWidget { ], onChanged: userTags.isEmpty || - (userTags.length == 1 && - userTags.first == UserTag.defaultTag.label) - ? null - : (String? tag) => _onUserTagChanged(tag!), + (userTags.length == 1 && + userTags.first == UserTag.defaultTag.label) + ? null + : (String? tag) => _onUserTagChanged(tag!), ); }, ), @@ -109,13 +108,12 @@ class ModeDropdown extends StatelessWidget { return ValueListenableBuilder( valueListenable: controller.viewType, builder: (context, viewType, _) { - final tooltip = - viewType == CpuProfilerViewType.function - ? 'Display the profile in terms of the Dart call stack ' - '(i.e., inlined frames are expanded)' - : 'Display the profile in terms of native stack frames ' - '(i.e., inlined frames are not expanded, display code objects ' - 'rather than individual functions)'; + final tooltip = viewType == CpuProfilerViewType.function + ? 'Display the profile in terms of the Dart call stack ' + '(i.e., inlined frames are expanded)' + : 'Display the profile in terms of native stack frames ' + '(i.e., inlined frames are not expanded, display code objects ' + 'rather than individual functions)'; return SizedBox( height: defaultButtonHeight, child: DevToolsTooltip( diff --git a/packages/devtools_app/lib/src/screens/profiler/panes/controls/profiler_screen_controls.dart b/packages/devtools_app/lib/src/screens/profiler/panes/controls/profiler_screen_controls.dart index 0ac0e2c8129..b3d1714c33e 100644 --- a/packages/devtools_app/lib/src/screens/profiler/panes/controls/profiler_screen_controls.dart +++ b/packages/devtools_app/lib/src/screens/profiler/panes/controls/profiler_screen_controls.dart @@ -71,8 +71,9 @@ class _PrimaryControls extends StatelessWidget { gaSelection: recording ? gac.stop : gac.record, minScreenWidthForTextBeforeScaling: _primaryControlsMinIncludeTextWidth, - onPressed: - recording ? controller.stopRecording : controller.startRecording, + onPressed: recording + ? controller.stopRecording + : controller.startRecording, ), const SizedBox(width: denseSpacing), ClearButton( @@ -119,10 +120,9 @@ class _SecondaryControls extends StatelessWidget { gaSelection: gac.CpuProfilerEvents.profileAppStartUp.name, minScreenWidthForTextBeforeScaling: _profilingControlsMinScreenWidthForText, - onPressed: - !profilerBusy - ? controller.cpuProfilerController.loadAppStartUpProfile - : null, + onPressed: !profilerBusy + ? controller.cpuProfilerController.loadAppStartUpProfile + : null, ), const SizedBox(width: denseSpacing), RefreshButton( @@ -133,10 +133,9 @@ class _SecondaryControls extends StatelessWidget { gaSelection: gac.CpuProfilerEvents.loadAllCpuSamples.name, minScreenWidthForTextBeforeScaling: _profilingControlsMinScreenWidthForText, - onPressed: - !profilerBusy - ? controller.cpuProfilerController.loadAllSamples - : null, + onPressed: !profilerBusy + ? controller.cpuProfilerController.loadAllSamples + : null, ), const SizedBox(width: denseSpacing), CpuSamplingRateDropdown( @@ -149,10 +148,10 @@ class _SecondaryControls extends StatelessWidget { screenId: ScreenMetaData.cpuProfiler.id, onSave: !profilerBusy && - controller.cpuProfileData != null && - controller.cpuProfileData?.isEmpty == false - ? (_) => _exportPerformance() - : null, + controller.cpuProfileData != null && + controller.cpuProfileData?.isEmpty == false + ? (_) => _exportPerformance() + : null, ), ], ); diff --git a/packages/devtools_app/lib/src/screens/profiler/panes/method_table/method_table.dart b/packages/devtools_app/lib/src/screens/profiler/panes/method_table/method_table.dart index aab1240699a..6c87dc8e10b 100644 --- a/packages/devtools_app/lib/src/screens/profiler/panes/method_table/method_table.dart +++ b/packages/devtools_app/lib/src/screens/profiler/panes/method_table/method_table.dart @@ -114,12 +114,12 @@ class _MethodGraphState extends State<_MethodGraph> with AutoDisposeMixin { _callers = []; _callees = []; } else { - _callers = - _selectedGraphNode!.predecessors - .cast() - .toList(); - _callees = - _selectedGraphNode!.successors.cast().toList(); + _callers = _selectedGraphNode!.predecessors + .cast() + .toList(); + _callees = _selectedGraphNode!.successors + .cast() + .toList(); } } @@ -304,8 +304,8 @@ class _CallerTimeColumn extends TimeAndPercentageColumn { : super( title: 'Caller %', percentageOnly: true, - percentAsDoubleProvider: - (node) => methodTableController.callerPercentageFor(node), + percentAsDoubleProvider: (node) => + methodTableController.callerPercentageFor(node), secondaryCompare: (node) => node.name, columnWidth: _callGraphColumnWidth, ); @@ -316,8 +316,8 @@ class _CalleeTimeColumn extends TimeAndPercentageColumn { : super( title: 'Callee %', percentageOnly: true, - percentAsDoubleProvider: - (node) => methodTableController.calleePercentageFor(node), + percentAsDoubleProvider: (node) => + methodTableController.calleePercentageFor(node), secondaryCompare: (node) => node.name, columnWidth: _callGraphColumnWidth, ); diff --git a/packages/devtools_app/lib/src/screens/profiler/panes/method_table/method_table_controller.dart b/packages/devtools_app/lib/src/screens/profiler/panes/method_table/method_table_controller.dart index 8f9409a8771..14ec9c082f5 100644 --- a/packages/devtools_app/lib/src/screens/profiler/panes/method_table/method_table_controller.dart +++ b/packages/devtools_app/lib/src/screens/profiler/panes/method_table/method_table_controller.dart @@ -75,20 +75,20 @@ class MethodTableController extends DisposableController action: (CpuStackFrame frame) { final parentNode = frame.parent != null && - frame.parentId != CpuProfileData.rootId && - !frame.parent!.isTag - // Since we are performing a DFS, the parent should always be in - // the map. - ? methodMap[frame.parent!.methodTableId]! - : null; + frame.parentId != CpuProfileData.rootId && + !frame.parent!.isTag + // Since we are performing a DFS, the parent should always be in + // the map. + ? methodMap[frame.parent!.methodTableId]! + : null; var graphNode = MethodTableGraphNode.fromStackFrame(frame); final existingNode = methodMap[frame.methodTableId]; if (existingNode != null) { // Do not merge the total time if the [existingNode] already counted // the total time for one of [frame]'s ancestors. - final shouldMergeTotalTime = - !existingNode.stackFrameIds.containsAny(frame.ancestorIds); + final shouldMergeTotalTime = !existingNode.stackFrameIds + .containsAny(frame.ancestorIds); // If the graph node already exists, merge the new one with the old // one and use the existing instance. existingNode.merge(graphNode, mergeTotalTime: shouldMergeTotalTime); diff --git a/packages/devtools_app/lib/src/screens/profiler/profiler_screen.dart b/packages/devtools_app/lib/src/screens/profiler/profiler_screen.dart index 2cfd453af77..cf473f55f24 100644 --- a/packages/devtools_app/lib/src/screens/profiler/profiler_screen.dart +++ b/packages/devtools_app/lib/src/screens/profiler/profiler_screen.dart @@ -131,12 +131,11 @@ class _ProfilerScreenBodyState extends State child: const CenteredCircularProgressIndicator(), ); } - final status = - recording || profilerBusy - ? (recording - ? const RecordingStatus() - : ProfilerBusyStatus(status: profilerBusyStatus)) - : null; + final status = recording || profilerBusy + ? (recording + ? const RecordingStatus() + : ProfilerBusyStatus(status: profilerBusyStatus)) + : null; return Column( children: [ ProfilerScreenControls( diff --git a/packages/devtools_app/lib/src/screens/profiler/profiler_screen_controller.dart b/packages/devtools_app/lib/src/screens/profiler/profiler_screen_controller.dart index 221005bace3..ed392daca19 100644 --- a/packages/devtools_app/lib/src/screens/profiler/profiler_screen_controller.dart +++ b/packages/devtools_app/lib/src/screens/profiler/profiler_screen_controller.dart @@ -67,12 +67,11 @@ class ProfilerScreenController extends DevToolsScreenController addAutoDisposeListener( serviceConnection.serviceManager.isolateManager.selectedIsolate, () { - final selectedIsolate = - serviceConnection - .serviceManager - .isolateManager - .selectedIsolate - .value; + final selectedIsolate = serviceConnection + .serviceManager + .isolateManager + .selectedIsolate + .value; if (selectedIsolate != null) { switchToIsolate(selectedIsolate); } diff --git a/packages/devtools_app/lib/src/screens/vm_developer/isolate_statistics/isolate_statistics_view.dart b/packages/devtools_app/lib/src/screens/vm_developer/isolate_statistics/isolate_statistics_view.dart index e2b3668a4d0..77bd8d42c2f 100644 --- a/packages/devtools_app/lib/src/screens/vm_developer/isolate_statistics/isolate_statistics_view.dart +++ b/packages/devtools_app/lib/src/screens/vm_developer/isolate_statistics/isolate_statistics_view.dart @@ -210,17 +210,16 @@ class TagStatisticsWidget extends StatelessWidget { title: 'Execution Time', roundedTopBorder: false, table: Flexible( - child: - controller.cpuProfilerController.profilerEnabled - ? FlatTable( - keyFactory: (VMTag tag) => ValueKey(tag.name), - data: controller.tags, - dataKey: 'tag-statistics', - columns: _columns, - defaultSortColumn: _percentage, - defaultSortDirection: SortDirection.descending, - ) - : CpuProfilerDisabled(controller.cpuProfilerController), + child: controller.cpuProfilerController.profilerEnabled + ? FlatTable( + keyFactory: (VMTag tag) => ValueKey(tag.name), + data: controller.tags, + dataKey: 'tag-statistics', + columns: _columns, + defaultSortColumn: _percentage, + defaultSortDirection: SortDirection.descending, + ) + : CpuProfilerDisabled(controller.cpuProfilerController), ), ), ); @@ -295,29 +294,25 @@ class StackTraceViewerWidget extends StatelessWidget { return ValueListenableBuilder( valueListenable: stackTrace, builder: (context, stackTrace, _) { - final lines = - stackTrace?.allocationLocation?.valueAsString - ?.split('\n') - .where((e) => e.isNotEmpty) - .toList(); + final lines = stackTrace?.allocationLocation?.valueAsString + ?.split('\n') + .where((e) => e.isNotEmpty) + .toList(); return VMInfoList( title: 'Allocation Location', roundedTopBorder: false, - table: - lines == null - ? const Expanded( - child: Center(child: Text('No port selected')), - ) - : Flexible( - child: FlatTable( - keyFactory: (String s) => ValueKey(s), - data: lines, - dataKey: 'stack-trace-viewer', - columns: [frame], - defaultSortColumn: frame, - defaultSortDirection: SortDirection.ascending, - ), + table: lines == null + ? const Expanded(child: Center(child: Text('No port selected'))) + : Flexible( + child: FlatTable( + keyFactory: (String s) => ValueKey(s), + data: lines, + dataKey: 'stack-trace-viewer', + columns: [frame], + defaultSortColumn: frame, + defaultSortDirection: SortDirection.ascending, ), + ), ); }, ); @@ -363,9 +358,8 @@ class _IsolatePortsWidgetState extends State { ), Flexible( child: FlatTable( - keyFactory: - (InstanceRef? port) => - ValueKey(port!.debugName!), + keyFactory: (InstanceRef? port) => + ValueKey(port!.debugName!), data: ports, dataKey: 'isolate-ports', columns: _columns, diff --git a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/class_hierarchy_explorer.dart b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/class_hierarchy_explorer.dart index 474126ab8fe..08cd597357e 100644 --- a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/class_hierarchy_explorer.dart +++ b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/class_hierarchy_explorer.dart @@ -32,11 +32,10 @@ class ClassHierarchyExplorer extends StatelessWidget { return TreeView( dataRootsListenable: controller.classHierarchyController.selectedIsolateClassHierarchy, - dataDisplayProvider: - (node, onPressed) => VmServiceObjectLink( - object: node.cls, - onTap: controller.findAndSelectNodeForObject, - ), + dataDisplayProvider: (node, onPressed) => VmServiceObjectLink( + object: node.cls, + onTap: controller.findAndSelectNodeForObject, + ), emptyTreeViewBuilder: () => const CenteredCircularProgressIndicator(), ); } diff --git a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/class_hierarchy_explorer_controller.dart b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/class_hierarchy_explorer_controller.dart index 11b7cad4541..04433788139 100644 --- a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/class_hierarchy_explorer_controller.dart +++ b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/class_hierarchy_explorer_controller.dart @@ -27,11 +27,10 @@ class ClassHierarchyExplorerController extends DisposableController { final isolateId = isolate.id!; final classList = await service.getClassList(isolateId); // TODO(bkonyi): we should cache the class list like we do the script list - final classes = - await [ - for (final cls in classList.classes!) - service.getObject(isolateId, cls.id!).then((e) => e as Class), - ].wait; + final classes = await [ + for (final cls in classList.classes!) + service.getObject(isolateId, cls.id!).then((e) => e as Class), + ].wait; buildHierarchy(classes); } diff --git a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/object_inspector_view.dart b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/object_inspector_view.dart index 8938136e11d..76249c3402e 100644 --- a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/object_inspector_view.dart +++ b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/object_inspector_view.dart @@ -45,8 +45,8 @@ class _ObjectInspectorViewState extends State<_ObjectInspectorView> void didChangeDependencies() { super.didChangeDependencies(); - final vmDeveloperToolsController = - screenControllers.lookup(); + final vmDeveloperToolsController = screenControllers + .lookup(); controller = vmDeveloperToolsController.objectInspectorViewController; unawaited(controller.init()); } @@ -83,8 +83,8 @@ class _ObjectInspectorSelectorState extends State { @override void didChangeDependencies() { super.didChangeDependencies(); - final vmDeveloperToolsController = - screenControllers.lookup(); + final vmDeveloperToolsController = screenControllers + .lookup(); controller = vmDeveloperToolsController.objectInspectorViewController; unawaited(controller.init()); } @@ -117,10 +117,9 @@ class _ObjectInspectorSelectorState extends State { gac.classHierarchy, ), ], - onChanged: - (newValue) => setState(() { - value = newValue!; - }), + onChanged: (newValue) => setState(() { + value = newValue!; + }), ), Expanded( child: RoundedOutlinedBorder( diff --git a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/object_viewport.dart b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/object_viewport.dart index fc23701d265..37084d17a67 100644 --- a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/object_viewport.dart +++ b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/object_viewport.dart @@ -45,10 +45,9 @@ class ObjectViewport extends StatelessWidget { child = const CenteredCircularProgressIndicator(); } else { final currentObject = controller.objectHistory.current.value; - child = - currentObject == null - ? const SizedBox.shrink() - : buildObjectDisplay(currentObject); + child = currentObject == null + ? const SizedBox.shrink() + : buildObjectDisplay(currentObject); } return Expanded(child: child); diff --git a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_field_display.dart b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_field_display.dart index 92214383070..c30182d6407 100644 --- a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_field_display.dart +++ b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_field_display.dart @@ -79,8 +79,9 @@ class VmFieldDisplay extends StatelessWidget { type = 'Observed types not found'; } - final nullable = - field.guardNullable == null ? '' : _nullMessage(field.guardNullable!); + final nullable = field.guardNullable == null + ? '' + : _nullMessage(field.guardNullable!); return '$type$nullable'; } diff --git a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_ic_data_display.dart b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_ic_data_display.dart index 99323e858ef..c718d5368d9 100644 --- a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_ic_data_display.dart +++ b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_ic_data_display.dart @@ -69,13 +69,12 @@ class _VmICDataDisplayState extends State { return; } - final isolateId = - serviceConnection - .serviceManager - .isolateManager - .selectedIsolate - .value! - .id!; + final isolateId = serviceConnection + .serviceManager + .isolateManager + .selectedIsolate + .value! + .id!; final service = serviceConnection.serviceManager.service!; final argumentsDescriptorFuture = service .getObject(isolateId, icData.argumentsDescriptor.id!) @@ -83,8 +82,10 @@ class _VmICDataDisplayState extends State { final entriesFuture = service .getObject(isolateId, icData.entries.id!) .then((e) => e as Instance); - final (argDescriptor, entryList) = - await (argumentsDescriptorFuture, entriesFuture).wait; + final (argDescriptor, entryList) = await ( + argumentsDescriptorFuture, + entriesFuture, + ).wait; populateLists(argDescriptor, entryList); _initializingCompleter.complete(); } diff --git a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_instance_display.dart b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_instance_display.dart index 3250f359190..492ad9f8139 100644 --- a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_instance_display.dart +++ b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_instance_display.dart @@ -180,12 +180,11 @@ class DisplayProvider extends StatelessWidget { SelectableText.rich( TextSpan( text: hasName ? variable.name : null, - style: - variable.artificialName - ? theme.subtleFixedFontStyle - : theme.fixedFontStyle.apply( - color: theme.colorScheme.controlFlowSyntaxColor, - ), + style: variable.artificialName + ? theme.subtleFixedFontStyle + : theme.fixedFontStyle.apply( + color: theme.colorScheme.controlFlowSyntaxColor, + ), children: [ if (hasName) TextSpan(text: ': ', style: theme.fixedFontStyle), if (variable.ref!.value is Sentinel) diff --git a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_library_display.dart b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_library_display.dart index a21ca800cf3..71529a9eb3e 100644 --- a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_library_display.dart +++ b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_library_display.dart @@ -52,8 +52,9 @@ class VmLibraryDisplay extends StatelessWidget { controller: controller, key: 'URI', preferUri: true, - object: - (library.obj.uri?.isEmpty ?? false) ? library.script! : library.obj, + object: (library.obj.uri?.isEmpty ?? false) + ? library.script! + : library.obj, ), selectableTextBuilderMapEntry('VM Name', library.vmName), ]; diff --git a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_object_model.dart b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_object_model.dart index de6408cd57c..c570ddabcf8 100644 --- a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_object_model.dart +++ b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_object_model.dart @@ -72,10 +72,9 @@ abstract class VmObject { _isolate = serviceConnection.serviceManager.isolateManager.selectedIsolate.value!; - _obj = - ref is Obj - ? ref as Obj - : await _service.getObject(_isolate!.id!, ref.id!); + _obj = ref is Obj + ? ref as Obj + : await _service.getObject(_isolate!.id!, ref.id!); if (_sourceLocation != null) { _sourceScript = @@ -198,8 +197,8 @@ class FuncObject extends VmObject { return funcKind == null ? null : FunctionKind.values.firstWhereOrNull( - (element) => element.kind() == funcKind, - ); + (element) => element.kind() == funcKind, + ); } int? get deoptimizations => obj.deoptimizations; @@ -252,8 +251,9 @@ class FieldObject extends VmObject { guardClassKind = obj.guardClassKind(); - guardClass = - guardClassKind == GuardClassKind.single ? await obj.guardClass : null; + guardClass = guardClassKind == GuardClassKind.single + ? await obj.guardClass + : null; } } @@ -327,13 +327,12 @@ class CodeObject extends VmObject { await super.initialize(); final service = serviceConnection.serviceManager.service!; - final isolateId = - serviceConnection - .serviceManager - .isolateManager - .selectedIsolate - .value! - .id!; + final isolateId = serviceConnection + .serviceManager + .isolateManager + .selectedIsolate + .value! + .id!; // Attempt to retrieve the CPU profile data for this code object. try { diff --git a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_simple_list_display.dart b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_simple_list_display.dart index 10dcd5df619..e81e1236a17 100644 --- a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_simple_list_display.dart +++ b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_simple_list_display.dart @@ -59,13 +59,12 @@ class _VmSimpleListDisplayState extends State { return; } - final isolateId = - serviceConnection - .serviceManager - .isolateManager - .selectedIsolate - .value! - .id!; + final isolateId = serviceConnection + .serviceManager + .isolateManager + .selectedIsolate + .value! + .id!; final service = serviceConnection.serviceManager.service!; _initialized = service .getObject(isolateId, elementsInstance.id!) diff --git a/packages/devtools_app/lib/src/screens/vm_developer/process_memory/process_memory_tree_columns.dart b/packages/devtools_app/lib/src/screens/vm_developer/process_memory/process_memory_tree_columns.dart index 05e9053ac24..80e02f48fb1 100644 --- a/packages/devtools_app/lib/src/screens/vm_developer/process_memory/process_memory_tree_columns.dart +++ b/packages/devtools_app/lib/src/screens/vm_developer/process_memory/process_memory_tree_columns.dart @@ -28,7 +28,7 @@ class MemoryColumn extends SizeAndPercentageColumn { : super( title: 'Memory Usage', sizeProvider: (node) => node.byteSize, - percentAsDoubleProvider: - (node) => node.byteSize / controller.treeRoot.value!.byteSize, + percentAsDoubleProvider: (node) => + node.byteSize / controller.treeRoot.value!.byteSize, ); } diff --git a/packages/devtools_app/lib/src/screens/vm_developer/process_memory/process_memory_view.dart b/packages/devtools_app/lib/src/screens/vm_developer/process_memory/process_memory_view.dart index 11d0899bfe5..2e861886251 100644 --- a/packages/devtools_app/lib/src/screens/vm_developer/process_memory/process_memory_view.dart +++ b/packages/devtools_app/lib/src/screens/vm_developer/process_memory/process_memory_view.dart @@ -193,9 +193,8 @@ class _ProcessMemoryTree extends StatelessWidget { valueListenable: controller.treeRoot, builder: (context, root, _) { return TreeTable( - keyFactory: - (e) => - PageStorageKey('${e.name}+${e.depth}+${e.byteSize}'), + keyFactory: (e) => + PageStorageKey('${e.name}+${e.depth}+${e.byteSize}'), displayTreeGuidelines: true, dataRoots: [if (root != null) root], dataKey: 'process-memory-tree', diff --git a/packages/devtools_app/lib/src/screens/vm_developer/vm_developer_common_widgets.dart b/packages/devtools_app/lib/src/screens/vm_developer/vm_developer_common_widgets.dart index 5ca094fb2f3..dfc2036466a 100644 --- a/packages/devtools_app/lib/src/screens/vm_developer/vm_developer_common_widgets.dart +++ b/packages/devtools_app/lib/src/screens/vm_developer/vm_developer_common_widgets.dart @@ -212,28 +212,28 @@ class RequestableSizeWidget extends StatelessWidget { final size = sizeProvider(); return size == null ? GaDevToolsButton( - icon: Icons.call_made, - label: 'Request', - outlined: false, - gaScreen: gac.vmTools, - gaSelection: gac.requestSize, - onPressed: requestFunction, - ) + icon: Icons.call_made, + label: 'Request', + outlined: false, + gaScreen: gac.vmTools, + gaSelection: gac.requestSize, + onPressed: requestFunction, + ) : Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Text( - size.valueAsString == null - ? '--' - : prettyPrintBytes( - int.parse(size.valueAsString!), - includeUnit: true, - maxBytes: 512, - )!, - ), - ToolbarRefresh(onPressed: requestFunction), - ], - ); + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Text( + size.valueAsString == null + ? '--' + : prettyPrintBytes( + int.parse(size.valueAsString!), + includeUnit: true, + maxBytes: 512, + )!, + ), + ToolbarRefresh(onPressed: requestFunction), + ], + ); } }, ); @@ -368,10 +368,9 @@ class RetainingPathWidget extends StatelessWidget { return ValueListenableBuilder( valueListenable: retainingPath, builder: (context, retainingPath, _) { - final retainingObjects = - retainingPath == null - ? const [] - : _retainingPathList(context, retainingPath); + final retainingObjects = retainingPath == null + ? const [] + : _retainingPathList(context, retainingPath); return VmExpansionTile( title: 'Retaining Path', onExpanded: onExpanded, @@ -379,11 +378,11 @@ class RetainingPathWidget extends StatelessWidget { retainingPath == null ? const SizedCircularProgressIndicator() : SizedBox.fromSize( - size: Size.fromHeight( - retainingObjects.length * defaultRowHeight + densePadding, + size: Size.fromHeight( + retainingObjects.length * defaultRowHeight + densePadding, + ), + child: Column(children: retainingObjects), ), - child: Column(children: retainingObjects), - ), ], ); }, @@ -405,13 +404,12 @@ class RetainingPathWidget extends StatelessWidget { final emptyList = Text('No retaining objects', style: theme.fixedFontStyle); if (retainingPath.elements == null) return [emptyList]; - final firstRetainingObject = - retainingPath.elements!.isNotEmpty - ? VmServiceObjectLink( - object: retainingPath.elements!.first.value, - onTap: onTap, - ) - : emptyList; + final firstRetainingObject = retainingPath.elements!.isNotEmpty + ? VmServiceObjectLink( + object: retainingPath.elements!.first.value, + onTap: onTap, + ) + : emptyList; final retainingObjects = [ Row(children: [firstRetainingObject]), @@ -557,11 +555,8 @@ class InboundReferencesTree extends StatelessWidget { builder: (context, references, _) { return TreeView( dataRootsListenable: object.inboundReferencesTree, - dataDisplayProvider: - (node, _) => InboundReferenceWidget( - controller: controller, - node: node, - ), + dataDisplayProvider: (node, _) => + InboundReferenceWidget(controller: controller, node: node), emptyTreeViewBuilder: () { return Padding( padding: EdgeInsets.all(defaultRowHeight / 2), @@ -704,16 +699,15 @@ class VmServiceObjectLink extends StatelessWidget { return TextSpan( text: text, style: style.apply(overflow: TextOverflow.ellipsis), - recognizer: - isServiceObject - ? (TapGestureRecognizer() - ..onTap = () async { - final obj = object; - if (obj is ObjRef) { - await onTap(obj); - } - }) - : null, + recognizer: isServiceObject + ? (TapGestureRecognizer() + ..onTap = () async { + final obj = object; + if (obj is ObjRef) { + await onTap(obj); + } + }) + : null, ); } @@ -969,8 +963,9 @@ class _ObjectInspectorCodeViewState extends State { location.endTokenPos != null) { final script = currentParsedScript.script; final startLine = location.line!; - final endLine = - script.getLineNumberFromTokenPos(location.endTokenPos!)!; + final endLine = script.getLineNumberFromTokenPos( + location.endTokenPos!, + )!; lineRange = LineRange(startLine, endLine); } } diff --git a/packages/devtools_app/lib/src/screens/vm_developer/vm_service_private_extensions.dart b/packages/devtools_app/lib/src/screens/vm_developer/vm_service_private_extensions.dart index 92239bc404e..725bae84c5d 100644 --- a/packages/devtools_app/lib/src/screens/vm_developer/vm_service_private_extensions.dart +++ b/packages/devtools_app/lib/src/screens/vm_developer/vm_service_private_extensions.dart @@ -69,8 +69,8 @@ extension InboundReferenceExtension on InboundReferences { int? parentWordOffset(int inboundReferenceIndex) { final references = (json![_referencesKey] as List?)?.cast(); - final inboundReference = - (references?[inboundReferenceIndex] as Map?)?.cast(); + final inboundReference = (references?[inboundReferenceIndex] as Map?) + ?.cast(); return inboundReference?[_parentWordOffsetKey] as int?; } } @@ -100,14 +100,12 @@ extension ClassHeapStatsPrivateViewExtension on ClassHeapStats { static const _newSpaceKey = '_new'; static const _oldSpaceKey = '_old'; - HeapStats get newSpace => - json!.containsKey(_newSpaceKey) - ? HeapStats.parse((json![_newSpaceKey] as List).cast()) - : const HeapStats.empty(); - HeapStats get oldSpace => - json!.containsKey(_oldSpaceKey) - ? HeapStats.parse((json![_oldSpaceKey] as List).cast()) - : const HeapStats.empty(); + HeapStats get newSpace => json!.containsKey(_newSpaceKey) + ? HeapStats.parse((json![_newSpaceKey] as List).cast()) + : const HeapStats.empty(); + HeapStats get oldSpace => json!.containsKey(_oldSpaceKey) + ? HeapStats.parse((json![_oldSpaceKey] as List).cast()) + : const HeapStats.empty(); } extension AllocationProfilePrivateViewExtension on AllocationProfile { @@ -251,8 +249,8 @@ class WeakArray extends WeakArrayRef implements Obj { json: json, length: json['length'], size: json['size'], - elements: - (createServiceObject(json['elements'], []) as List).cast(), + elements: (createServiceObject(json['elements'], []) as List) + .cast(), classRef: createServiceObject(json['class'], [])! as ClassRef, ); @@ -412,10 +410,9 @@ class Instruction { return; } final rawObject = data[3] as Map; - object = - (rawObject['type'] as List).contains('Instance') - ? InstanceRef.parse(rawObject) - : createServiceObject(data[3], const []) as Response?; + object = (rawObject['type'] as List).contains('Instance') + ? InstanceRef.parse(rawObject) + : createServiceObject(data[3], const []) as Response?; } /// The instruction's address in memory. @@ -479,8 +476,8 @@ extension FunctionPrivateViewExtension on Func { String? get vmName => json!['_vmName']; Future get icDataArray async { - final icDataArray = - (json![_icDataArrayKey] as Map?)?.cast(); + final icDataArray = (json![_icDataArrayKey] as Map?) + ?.cast(); final icDataArrayId = icDataArray?['id'] as String?; if (icDataArrayId != null) { final service = serviceConnection.serviceManager.service!; @@ -576,11 +573,10 @@ class InliningData { factory InliningData.fromJson(Map json) { final startAddress = int.parse(json[kStartAddressKey], radix: 16); final intervals = (json[kInlinedIntervals] as List).cast(); - final functions = - (json[kInlinedFunctions] as List) - .cast>() - .map((e) => FuncRef.parse(e)!) - .toList(); + final functions = (json[kInlinedFunctions] as List) + .cast>() + .map((e) => FuncRef.parse(e)!) + .toList(); final entries = []; @@ -654,10 +650,9 @@ class ObjectPool extends ObjectPoolRef implements Obj { return ObjectPool( json: json, id: json[ObjectPoolRef._idKey], - entries: - (json[_entriesKey] as List) - .map((e) => ObjectPoolEntry.parse(e)) - .toList(), + entries: (json[_entriesKey] as List) + .map((e) => ObjectPoolEntry.parse(e)) + .toList(), length: json[ObjectPoolRef._lengthKey], ); } @@ -925,11 +920,10 @@ extension CpuSamplesPrivateView on CpuSamples { } List get codes { - return _expando[this] ??= - (json![_kCodesKey] as List) - .cast>() - .map((e) => ProfileCode.parse(e)!) - .toList(); + return _expando[this] ??= (json![_kCodesKey] as List) + .cast>() + .map((e) => ProfileCode.parse(e)!) + .toList(); } } @@ -961,20 +955,17 @@ class ProfileReportRange { ProfileReportRange._fromJson(Script script, _ProfileReportRangeJson json) { final inclusiveTicks = json.inclusiveTicks; final exclusiveTicks = json.exclusiveTicks; - final lines = - json.positions - .map( - // It's possible to get a synthetic token position which will either - // be a negative value or a String (e.g., 'ParallelMove' or - // 'NoSource'). We'll just use -1 as a placeholder since we won't - // display anything for these tokens anyway. - (e) => - e is int - ? script.getLineNumberFromTokenPos(e) ?? - _kNoSourcePosition - : _kNoSourcePosition, - ) - .toList(); + final lines = json.positions + .map( + // It's possible to get a synthetic token position which will either + // be a negative value or a String (e.g., 'ParallelMove' or + // 'NoSource'). We'll just use -1 as a placeholder since we won't + // display anything for these tokens anyway. + (e) => e is int + ? script.getLineNumberFromTokenPos(e) ?? _kNoSourcePosition + : _kNoSourcePosition, + ) + .toList(); for (int i = 0; i < lines.length; ++i) { final line = lines[i]; entries[line] = ProfileReportEntry( @@ -1016,17 +1007,16 @@ extension type _ProfileReportRangeJson(Map json) { /// information for a given [Script]. class ProfileReport { ProfileReport._fromJson(Script script, Map json) - : _profileRanges = - (json['ranges'] as List) - .cast>() - .where((e) => e.containsKey('profile')) - .map( - (e) => ProfileReportRange._fromJson( - script, - _ProfileReportRangeJson(e), - ), - ) - .toList(); + : _profileRanges = (json['ranges'] as List) + .cast>() + .where((e) => e.containsKey('profile')) + .map( + (e) => ProfileReportRange._fromJson( + script, + _ProfileReportRangeJson(e), + ), + ) + .toList(); List get profileRanges => _profileRanges; final List _profileRanges; diff --git a/packages/devtools_app/lib/src/screens/vm_developer/vm_statistics/vm_statistics_view.dart b/packages/devtools_app/lib/src/screens/vm_developer/vm_statistics/vm_statistics_view.dart index 7861438632e..2845e469e7e 100644 --- a/packages/devtools_app/lib/src/screens/vm_developer/vm_statistics/vm_statistics_view.dart +++ b/packages/devtools_app/lib/src/screens/vm_developer/vm_statistics/vm_statistics_view.dart @@ -120,8 +120,8 @@ class GeneralVMStatisticsWidget extends StatelessWidget { vm == null ? null : formatDateTime( - DateTime.fromMillisecondsSinceEpoch(vm.startTime!), - ), + DateTime.fromMillisecondsSinceEpoch(vm.startTime!), + ), ), selectableTextBuilderMapEntry('Profiler Mode', vm?.profilerMode), selectableTextBuilderMapEntry( @@ -281,8 +281,9 @@ class IsolatesPreviewWidget extends StatelessWidget { @override Widget build(BuildContext context) { final title = systemIsolates ? 'System Isolates' : 'Isolates'; - final isolates = - systemIsolates ? controller.systemIsolates : controller.isolates; + final isolates = systemIsolates + ? controller.systemIsolates + : controller.isolates; return OutlineDecoration( showLeft: false, showTop: !systemIsolates, diff --git a/packages/devtools_app/lib/src/screens/vm_developer/vm_statistics/vm_statistics_view_controller.dart b/packages/devtools_app/lib/src/screens/vm_developer/vm_statistics/vm_statistics_view_controller.dart index b0a60db4d14..ef9fc361b8a 100644 --- a/packages/devtools_app/lib/src/screens/vm_developer/vm_statistics/vm_statistics_view_controller.dart +++ b/packages/devtools_app/lib/src/screens/vm_developer/vm_statistics/vm_statistics_view_controller.dart @@ -22,8 +22,9 @@ class VMStatisticsViewController extends DisposableController { final vm = await _service.getVM(); _vm = vm; _isolates = await vm.isolates!.map((i) => _service.getIsolate(i.id!)).wait; - _systemIsolates = - await vm.systemIsolates!.map((i) => _service.getIsolate(i.id!)).wait; + _systemIsolates = await vm.systemIsolates! + .map((i) => _service.getIsolate(i.id!)) + .wait; _refreshing.value = false; } diff --git a/packages/devtools_app/lib/src/service/json_to_service_cache.dart b/packages/devtools_app/lib/src/service/json_to_service_cache.dart index f888d2e0114..40d703f543e 100644 --- a/packages/devtools_app/lib/src/service/json_to_service_cache.dart +++ b/packages/devtools_app/lib/src/service/json_to_service_cache.dart @@ -84,8 +84,9 @@ class JsonToServiceCache { id: _nextId(), offset: offset, count: count, - associations: - obj.associations!.getRange(offset, offset + count).toList(), + associations: obj.associations! + .getRange(offset, offset + count) + .toList(), ); return map; } diff --git a/packages/devtools_app/lib/src/service/service_extension_widgets.dart b/packages/devtools_app/lib/src/service/service_extension_widgets.dart index 22823a646cb..3d3f3c95c46 100644 --- a/packages/devtools_app/lib/src/service/service_extension_widgets.dart +++ b/packages/devtools_app/lib/src/service/service_extension_widgets.dart @@ -166,10 +166,9 @@ class _ServiceExtensionButtonGroupState .setServiceExtensionState( extensionState.description.extension, enabled: !wasSelected, - value: - wasSelected - ? extensionState.description.disabledValue - : extensionState.description.enabledValue, + value: wasSelected + ? extensionState.description.disabledValue + : extensionState.description.enabledValue, ), ); }); @@ -205,8 +204,8 @@ class ServiceExtensionButton extends StatelessWidget { padding: EdgeInsets.symmetric( horizontal: isScreenWiderThan(context, minScreenWidthForTextBeforeScaling) - ? defaultSpacing - : 0.0, + ? defaultSpacing + : 0.0, ), child: ImageIconLabel( ServiceExtensionIcon(extensionState: extensionState), @@ -239,14 +238,14 @@ class HotReloadButton extends StatelessWidget { // reload directly on the VM service (e.g. for Dart CLI apps). ? _HotReloadScaffoldAction() : DevToolsTooltip( - message: _hotReloadTooltip, - child: _RegisteredServiceExtensionButton._( - serviceDescription: hotReload, - action: _callHotReload, - completedText: 'Hot reload completed.', - describeError: (error) => 'Unable to hot reload the app: $error', - ), - ); + message: _hotReloadTooltip, + child: _RegisteredServiceExtensionButton._( + serviceDescription: hotReload, + action: _callHotReload, + completedText: 'Hot reload completed.', + describeError: (error) => 'Unable to hot reload the app: $error', + ), + ); } } @@ -368,17 +367,16 @@ class _RegisteredServiceExtensionButtonState if (_hidden) return const SizedBox.shrink(); return InkWell( - onTap: - () => unawaited( - invokeAndCatchErrors(() async { - final gaScreenName = widget.serviceDescription.gaScreenName; - final gaItem = widget.serviceDescription.gaItem; - if (gaScreenName != null && gaItem != null) { - ga.select(gaScreenName, gaItem); - } - await widget.action(); - }), - ), + onTap: () => unawaited( + invokeAndCatchErrors(() async { + final gaScreenName = widget.serviceDescription.gaScreenName; + final gaItem = widget.serviceDescription.gaItem; + if (gaScreenName != null && gaItem != null) { + ga.select(gaScreenName, gaItem); + } + await widget.action(); + }), + ), child: Container( constraints: BoxConstraints.tightFor( width: actionWidgetSize, @@ -402,8 +400,8 @@ class StructuredErrorsToggle extends StatelessWidget { Widget build(BuildContext context) { return _ServiceExtensionToggle( service: structuredErrors, - describeError: - (error) => 'Failed to update structuredError settings: $error', + describeError: (error) => + 'Failed to update structuredError settings: $error', ); } } @@ -482,10 +480,9 @@ class _ServiceExtensionToggleState extends State<_ServiceExtensionToggle> .setServiceExtensionState( widget.service.extension, enabled: value, - value: - value - ? widget.service.enabledValue - : widget.service.disabledValue, + value: value + ? widget.service.enabledValue + : widget.service.disabledValue, ); }), ); @@ -502,8 +499,8 @@ class ServiceExtensionCheckbox extends ServiceExtensionWidget { this.showDescription = true, }) : super( completedText: null, - describeError: - (error) => _errorMessage(serviceExtension.extension, error), + describeError: (error) => + _errorMessage(serviceExtension.extension, error), ); static String _errorMessage(String extensionName, Object? error) { @@ -571,8 +568,9 @@ class _ServiceExtensionCheckboxState extends State void _setValueFromState(ServiceExtensionState state) { final valueFromState = state.enabled; - value.value = - widget.serviceExtension.inverted ? !valueFromState : valueFromState; + value.value = widget.serviceExtension.inverted + ? !valueFromState + : valueFromState; } @override @@ -587,10 +585,9 @@ class _ServiceExtensionCheckboxState extends State child: CheckboxSetting( notifier: value, title: widget.serviceExtension.title, - description: - widget.showDescription - ? widget.serviceExtension.description - : null, + description: widget.showDescription + ? widget.serviceExtension.description + : null, tooltip: widget.serviceExtension.tooltip, onChanged: _onChanged, enabled: available, @@ -624,10 +621,9 @@ class _ServiceExtensionCheckboxState extends State .setServiceExtensionState( widget.serviceExtension.extension, enabled: enabled, - value: - enabled - ? widget.serviceExtension.enabledValue - : widget.serviceExtension.disabledValue, + value: enabled + ? widget.serviceExtension.enabledValue + : widget.serviceExtension.disabledValue, ); }), ); @@ -1077,10 +1073,9 @@ class ServiceExtensionIcon extends StatelessWidget { @override Widget build(BuildContext context) { final theme = Theme.of(context); - final color = - extensionState.isSelected - ? theme.colorScheme.primary - : theme.colorScheme.onSurface; + final color = extensionState.isSelected + ? theme.colorScheme.primary + : theme.colorScheme.onSurface; final description = extensionState.description; if (description.iconData != null) { return Icon(description.iconData, color: color); diff --git a/packages/devtools_app/lib/src/service/service_extensions.dart b/packages/devtools_app/lib/src/service/service_extensions.dart index 70aaea9dc84..8f9332be328 100644 --- a/packages/devtools_app/lib/src/service/service_extensions.dart +++ b/packages/devtools_app/lib/src/service/service_extensions.dart @@ -57,8 +57,10 @@ class ToggleableServiceExtensionDescription this.iconAsset, this.iconData, this.shortTitle, - }) : displayValues = - [enabledValue, disabledValue].map((v) => v.toString()).toList(), + }) : displayValues = [ + enabledValue, + disabledValue, + ].map((v) => v.toString()).toList(), assert((iconAsset == null) != (iconData == null)), assert((documentationUrl == null) == (gaDocsItem == null)); @@ -295,9 +297,7 @@ final profileWidgetBuilds = ToggleableServiceExtensionDescription.from( gaDocsItem: gac.PerformanceDocs.trackWidgetBuildsDocs.name, ); -final profileUserWidgetBuilds = ToggleableServiceExtensionDescription< - bool ->.from( +final profileUserWidgetBuilds = ToggleableServiceExtensionDescription.from( extensions.profileUserWidgetBuilds, title: 'Trace user-created widget builds', iconAsset: 'icons/trackwidget-white.png', @@ -409,9 +409,7 @@ option disabled, try to reduce the use of opacity effects in your app.''', gaDocsItem: gac.PerformanceDocs.disableOpacityLayersDocs.name, ); -final disablePhysicalShapeLayers = ToggleableServiceExtensionDescription< - bool ->.from( +final disablePhysicalShapeLayers = ToggleableServiceExtensionDescription.from( extensions.disablePhysicalShapeLayers, title: 'Render Physical Shape layers', iconData: Icons.format_shapes, @@ -438,20 +436,19 @@ final httpEnableTimelineLogging = ); // Legacy extension to show the inspector and enable inspector select mode. -final toggleOnDeviceWidgetInspector = ToggleableServiceExtensionDescription< - bool ->.from( - extensions.toggleOnDeviceWidgetInspector, - // Technically this enables the on-device widget inspector but for older - // versions of package:flutter it makes sense to describe this extension as - // toggling widget select mode as it is the only way to toggle that mode. - title: 'Select Widget Mode', - shortTitle: 'Select', - iconAsset: 'icons/widget-select-white.png', - gaScreenName: gac.inspector, - gaItem: gac.showOnDeviceInspector, - tooltip: 'Toggle select widget mode', -); +final toggleOnDeviceWidgetInspector = + ToggleableServiceExtensionDescription.from( + extensions.toggleOnDeviceWidgetInspector, + // Technically this enables the on-device widget inspector but for older + // versions of package:flutter it makes sense to describe this extension as + // toggling widget select mode as it is the only way to toggle that mode. + title: 'Select Widget Mode', + shortTitle: 'Select', + iconAsset: 'icons/widget-select-white.png', + gaScreenName: gac.inspector, + gaItem: gac.showOnDeviceInspector, + tooltip: 'Toggle select widget mode', + ); // TODO(kenz): remove this if it is not needed. According to the comments, // [toggleOnDeviceWidgetInspector] should be the legacy extension, but that is @@ -509,9 +506,7 @@ summary of these counts using the Rebuild Stats tool.''', // TODO(https://github.com/flutter/website/issues/10666): link docs ); -final profilePlatformChannels = ToggleableServiceExtensionDescription< - bool ->.from( +final profilePlatformChannels = ToggleableServiceExtensionDescription.from( extensions.profilePlatformChannels, title: 'Trace platform channels', iconAsset: 'icons/trackwidget-white.png', diff --git a/packages/devtools_app/lib/src/service/service_manager.dart b/packages/devtools_app/lib/src/service/service_manager.dart index fb389ef6f52..6702d8684d2 100644 --- a/packages/devtools_app/lib/src/service/service_manager.dart +++ b/packages/devtools_app/lib/src/service/service_manager.dart @@ -36,30 +36,29 @@ const defaultRefreshRate = 60.0; class ServiceConnectionManager { ServiceConnectionManager() { - serviceManager = - ServiceManager() - ..registerLifecycleCallback( - ServiceManagerLifecycle.beforeOpenVmService, - _beforeOpenVmService, - ) - ..registerLifecycleCallback( - ServiceManagerLifecycle.afterOpenVmService, - _afterOpenVmService, - ) - ..registerLifecycleCallback( - ServiceManagerLifecycle.beforeCloseVmService, - _beforeCloseVmService, - ) - ..registerLifecycleCallback( - ServiceManagerLifecycle.afterCloseVmService, - _afterCloseVmService, - ) - ..registerOverride( - ServiceManagerOverride.initIsolates, - (service) async => await serviceManager.isolateManager.init( - serviceManager.vm?.isolatesForDevToolsMode() ?? [], - ), - ); + serviceManager = ServiceManager() + ..registerLifecycleCallback( + ServiceManagerLifecycle.beforeOpenVmService, + _beforeOpenVmService, + ) + ..registerLifecycleCallback( + ServiceManagerLifecycle.afterOpenVmService, + _afterOpenVmService, + ) + ..registerLifecycleCallback( + ServiceManagerLifecycle.beforeCloseVmService, + _beforeCloseVmService, + ) + ..registerLifecycleCallback( + ServiceManagerLifecycle.afterCloseVmService, + _afterCloseVmService, + ) + ..registerOverride( + ServiceManagerOverride.initIsolates, + (service) async => await serviceManager.isolateManager.init( + serviceManager.vm?.isolatesForDevToolsMode() ?? [], + ), + ); } late final ServiceManager serviceManager; @@ -116,8 +115,8 @@ class ServiceConnectionManager { // Set up analytics dimensions for the connected app. ga.setupUserApplicationDimensions(); - _inspectorService = - devToolsEnvironmentParameters.inspectorServiceProvider(); + _inspectorService = devToolsEnvironmentParameters + .inspectorServiceProvider(); _appState?.dispose(); _appState = AppState(serviceManager.isolateManager.selectedIsolate); @@ -138,10 +137,9 @@ class ServiceConnectionManager { // Set [offlineController.previousConnectedApp] in case we need it for // viewing data after disconnect. This must be done before resetting the // rest of the service manager state. - final previousConnectedApp = - serviceManager.connectedApp != null - ? OfflineConnectedApp.parse(serviceManager.connectedApp!.toJson()) - : null; + final previousConnectedApp = serviceManager.connectedApp != null + ? OfflineConnectedApp.parse(serviceManager.connectedApp!.toJson()) + : null; offlineDataController.previousConnectedApp = previousConnectedApp; // This must be called before we close the VM service so that @@ -193,9 +191,8 @@ class ServiceConnectionManager { Future get flutterViewId async { final flutterViewListResponse = await serviceManager .callServiceExtensionOnMainIsolate(registrations.flutterListViews); - final views = - (flutterViewListResponse.json!['views'] as List) - .cast>(); + final views = (flutterViewListResponse.json!['views'] as List) + .cast>(); // Each isolate should only have one FlutterView. final flutterView = views.firstWhereOrNull( diff --git a/packages/devtools_app/lib/src/service/timeline_streams.dart b/packages/devtools_app/lib/src/service/timeline_streams.dart index b3d743b5e7a..57e51d1d12f 100644 --- a/packages/devtools_app/lib/src/service/timeline_streams.dart +++ b/packages/devtools_app/lib/src/service/timeline_streams.dart @@ -153,10 +153,9 @@ class TimelineStreamManager with DisposerMixin { /// Sends an update to the VM service that the new recorded value for [stream] /// should match [value]. Future updateTimelineStream(TimelineStream stream, bool value) async { - final recordedStreamNames = - _streams.keys - .where((streamName) => _streams[streamName]!.recorded.value) - .toList(); + final recordedStreamNames = _streams.keys + .where((streamName) => _streams[streamName]!.recorded.value) + .toList(); final alreadyBeingRecorded = recordedStreamNames.contains(stream.name); if (alreadyBeingRecorded && !value) { recordedStreamNames.remove(stream.name); diff --git a/packages/devtools_app/lib/src/service/vm_flags.dart b/packages/devtools_app/lib/src/service/vm_flags.dart index 9881e7c3bca..3e803ca3603 100644 --- a/packages/devtools_app/lib/src/service/vm_flags.dart +++ b/packages/devtools_app/lib/src/service/vm_flags.dart @@ -43,13 +43,12 @@ class VmFlagManager with DisposerMixin { if (event.kind == EventKind.kVMFlagUpdate) { if (_flagNotifiers.containsKey(event.flag)) { final currentFlag = _flagNotifiers[event.flag]!.value; - _flagNotifiers[event.flag]!.value = - Flag.parse({ - 'name': currentFlag.name, - 'comment': currentFlag.comment, - 'modified': true, - 'valueAsString': event.newValue, - })!; + _flagNotifiers[event.flag]!.value = Flag.parse({ + 'name': currentFlag.name, + 'comment': currentFlag.comment, + 'modified': true, + 'valueAsString': event.newValue, + })!; _flags.value = await service.getFlagList(); } } diff --git a/packages/devtools_app/lib/src/service/vm_service_wrapper.dart b/packages/devtools_app/lib/src/service/vm_service_wrapper.dart index 4da7282b238..521ffcba6b1 100644 --- a/packages/devtools_app/lib/src/service/vm_service_wrapper.dart +++ b/packages/devtools_app/lib/src/service/vm_service_wrapper.dart @@ -89,12 +89,11 @@ class VmServiceWrapper extends VmService { Future get allFuturesCompleted => _allFuturesCompleter.future; - Completer _allFuturesCompleter = - Completer() - // Mark the future as completed by default so if we don't track any - // futures but someone tries to wait on [allFuturesCompleted] they don't - // hang. The first tracked future will replace this with a new completer. - ..complete(true); + Completer _allFuturesCompleter = Completer() + // Mark the future as completed by default so if we don't track any + // futures but someone tries to wait on [allFuturesCompleted] they don't + // hang. The first tracked future will replace this with a new completer. + ..complete(true); // A local cache of "fake" service objects. Used to convert JSON objects to // VM service response formats to be used with APIs that require them. diff --git a/packages/devtools_app/lib/src/shared/analytics/_analytics_web.dart b/packages/devtools_app/lib/src/shared/analytics/_analytics_web.dart index 56fe39e83b7..9a2e497826f 100644 --- a/packages/devtools_app/lib/src/shared/analytics/_analytics_web.dart +++ b/packages/devtools_app/lib/src/shared/analytics/_analytics_web.dart @@ -147,71 +147,57 @@ extension type GtagEventDevTools._(JSObject _) implements GtagEvent { ide_launched_feature: ideLaunchedFeature, is_wasm: kIsWasm.toString(), // [PerformanceScreenMetrics] - ui_duration_micros: - screenMetrics is PerformanceScreenMetrics - ? screenMetrics.uiDuration?.inMicroseconds - : null, - raster_duration_micros: - screenMetrics is PerformanceScreenMetrics - ? screenMetrics.rasterDuration?.inMicroseconds - : null, + ui_duration_micros: screenMetrics is PerformanceScreenMetrics + ? screenMetrics.uiDuration?.inMicroseconds + : null, + raster_duration_micros: screenMetrics is PerformanceScreenMetrics + ? screenMetrics.rasterDuration?.inMicroseconds + : null, shader_compilation_duration_micros: screenMetrics is PerformanceScreenMetrics - ? screenMetrics.shaderCompilationDuration?.inMicroseconds - : null, - trace_event_count: - screenMetrics is PerformanceScreenMetrics - ? screenMetrics.traceEventCount - : null, + ? screenMetrics.shaderCompilationDuration?.inMicroseconds + : null, + trace_event_count: screenMetrics is PerformanceScreenMetrics + ? screenMetrics.traceEventCount + : null, // [ProfilerScreenMetrics] - cpu_sample_count: - screenMetrics is ProfilerScreenMetrics - ? screenMetrics.cpuSampleCount - : null, - cpu_stack_depth: - screenMetrics is ProfilerScreenMetrics - ? screenMetrics.cpuStackDepth - : null, + cpu_sample_count: screenMetrics is ProfilerScreenMetrics + ? screenMetrics.cpuSampleCount + : null, + cpu_stack_depth: screenMetrics is ProfilerScreenMetrics + ? screenMetrics.cpuStackDepth + : null, // [MemoryScreenMetrics] - heap_diff_objects_before: - screenMetrics is MemoryScreenMetrics - ? screenMetrics.heapDiffObjectsBefore - : null, - heap_diff_objects_after: - screenMetrics is MemoryScreenMetrics - ? screenMetrics.heapDiffObjectsAfter - : null, - heap_objects_total: - screenMetrics is MemoryScreenMetrics - ? screenMetrics.heapObjectsTotal - : null, + heap_diff_objects_before: screenMetrics is MemoryScreenMetrics + ? screenMetrics.heapDiffObjectsBefore + : null, + heap_diff_objects_after: screenMetrics is MemoryScreenMetrics + ? screenMetrics.heapDiffObjectsAfter + : null, + heap_objects_total: screenMetrics is MemoryScreenMetrics + ? screenMetrics.heapObjectsTotal + : null, // [InspectorScreenMetrics] - root_set_count: - screenMetrics is InspectorScreenMetrics - ? screenMetrics.rootSetCount - : null, - row_count: - screenMetrics is InspectorScreenMetrics - ? screenMetrics.rowCount - : null, - inspector_tree_controller_id: - screenMetrics is InspectorScreenMetrics - ? screenMetrics.inspectorTreeControllerId - : null, + root_set_count: screenMetrics is InspectorScreenMetrics + ? screenMetrics.rootSetCount + : null, + row_count: screenMetrics is InspectorScreenMetrics + ? screenMetrics.rowCount + : null, + inspector_tree_controller_id: screenMetrics is InspectorScreenMetrics + ? screenMetrics.inspectorTreeControllerId + : null, // [DeepLinkScreenMetrics] - android_app_id: - screenMetrics is DeepLinkScreenMetrics - ? screenMetrics.androidAppId - : null, - ios_bundle_id: - screenMetrics is DeepLinkScreenMetrics - ? screenMetrics.iosBundleId - : null, + android_app_id: screenMetrics is DeepLinkScreenMetrics + ? screenMetrics.androidAppId + : null, + ios_bundle_id: screenMetrics is DeepLinkScreenMetrics + ? screenMetrics.iosBundleId + : null, // [InspectorScreenMetrics] - is_v2_inspector: - screenMetrics is InspectorScreenMetrics - ? screenMetrics.isV2.toString() - : null, + is_v2_inspector: screenMetrics is InspectorScreenMetrics + ? screenMetrics.isV2.toString() + : null, ); } @@ -329,71 +315,57 @@ extension type GtagExceptionDevTools._(JSObject _) implements GtagException { ide_launched_feature: ideLaunchedFeature, is_wasm: kIsWasm.toString(), // [PerformanceScreenMetrics] - ui_duration_micros: - screenMetrics is PerformanceScreenMetrics - ? screenMetrics.uiDuration?.inMicroseconds - : null, - raster_duration_micros: - screenMetrics is PerformanceScreenMetrics - ? screenMetrics.rasterDuration?.inMicroseconds - : null, - trace_event_count: - screenMetrics is PerformanceScreenMetrics - ? screenMetrics.traceEventCount - : null, + ui_duration_micros: screenMetrics is PerformanceScreenMetrics + ? screenMetrics.uiDuration?.inMicroseconds + : null, + raster_duration_micros: screenMetrics is PerformanceScreenMetrics + ? screenMetrics.rasterDuration?.inMicroseconds + : null, + trace_event_count: screenMetrics is PerformanceScreenMetrics + ? screenMetrics.traceEventCount + : null, shader_compilation_duration_micros: screenMetrics is PerformanceScreenMetrics - ? screenMetrics.shaderCompilationDuration?.inMicroseconds - : null, + ? screenMetrics.shaderCompilationDuration?.inMicroseconds + : null, // [ProfilerScreenMetrics] - cpu_sample_count: - screenMetrics is ProfilerScreenMetrics - ? screenMetrics.cpuSampleCount - : null, - cpu_stack_depth: - screenMetrics is ProfilerScreenMetrics - ? screenMetrics.cpuStackDepth - : null, + cpu_sample_count: screenMetrics is ProfilerScreenMetrics + ? screenMetrics.cpuSampleCount + : null, + cpu_stack_depth: screenMetrics is ProfilerScreenMetrics + ? screenMetrics.cpuStackDepth + : null, // [MemoryScreenMetrics] - heap_diff_objects_before: - screenMetrics is MemoryScreenMetrics - ? screenMetrics.heapDiffObjectsBefore - : null, - heap_diff_objects_after: - screenMetrics is MemoryScreenMetrics - ? screenMetrics.heapDiffObjectsAfter - : null, - heap_objects_total: - screenMetrics is MemoryScreenMetrics - ? screenMetrics.heapObjectsTotal - : null, + heap_diff_objects_before: screenMetrics is MemoryScreenMetrics + ? screenMetrics.heapDiffObjectsBefore + : null, + heap_diff_objects_after: screenMetrics is MemoryScreenMetrics + ? screenMetrics.heapDiffObjectsAfter + : null, + heap_objects_total: screenMetrics is MemoryScreenMetrics + ? screenMetrics.heapObjectsTotal + : null, // [InspectorScreenMetrics] - root_set_count: - screenMetrics is InspectorScreenMetrics - ? screenMetrics.rootSetCount - : null, - row_count: - screenMetrics is InspectorScreenMetrics - ? screenMetrics.rowCount - : null, - inspector_tree_controller_id: - screenMetrics is InspectorScreenMetrics - ? screenMetrics.inspectorTreeControllerId - : null, + root_set_count: screenMetrics is InspectorScreenMetrics + ? screenMetrics.rootSetCount + : null, + row_count: screenMetrics is InspectorScreenMetrics + ? screenMetrics.rowCount + : null, + inspector_tree_controller_id: screenMetrics is InspectorScreenMetrics + ? screenMetrics.inspectorTreeControllerId + : null, // [DeepLinkScreenMetrics] - android_app_id: - screenMetrics is DeepLinkScreenMetrics - ? screenMetrics.androidAppId - : null, - ios_bundle_id: - screenMetrics is DeepLinkScreenMetrics - ? screenMetrics.iosBundleId - : null, + android_app_id: screenMetrics is DeepLinkScreenMetrics + ? screenMetrics.androidAppId + : null, + ios_bundle_id: screenMetrics is DeepLinkScreenMetrics + ? screenMetrics.iosBundleId + : null, // [InspectorScreenMetrics] - is_v2_inspector: - screenMetrics is InspectorScreenMetrics - ? screenMetrics.isV2.toString() - : null, + is_v2_inspector: screenMetrics is InspectorScreenMetrics + ? screenMetrics.isV2.toString() + : null, ); } @@ -520,8 +492,9 @@ void timeEnd( screenName, timedOperation, durationMicros: durationMicros, - screenMetrics: - screenMetricsProvider != null ? screenMetricsProvider() : null, + screenMetrics: screenMetricsProvider != null + ? screenMetricsProvider() + : null, ); } @@ -560,8 +533,9 @@ void timeSync( screenName, timedOperation, durationMicros: durationMicros, - screenMetrics: - screenMetricsProvider != null ? screenMetricsProvider() : null, + screenMetrics: screenMetricsProvider != null + ? screenMetricsProvider() + : null, ); } @@ -590,8 +564,9 @@ Future timeAsync( screenName, timedOperation, durationMicros: durationMicros, - screenMetrics: - screenMetricsProvider != null ? screenMetricsProvider() : null, + screenMetrics: screenMetricsProvider != null + ? screenMetricsProvider() + : null, ); } @@ -640,8 +615,9 @@ void select( value: value, non_interaction: nonInteraction, send_to: gaDevToolsPropertyId(), - screenMetrics: - screenMetricsProvider != null ? screenMetricsProvider() : null, + screenMetrics: screenMetricsProvider != null + ? screenMetricsProvider() + : null, ); _sendEvent(gtagEvent); } @@ -665,8 +641,9 @@ void impression( event_label: item, non_interaction: true, send_to: gaDevToolsPropertyId(), - screenMetrics: - screenMetricsProvider != null ? screenMetricsProvider() : null, + screenMetrics: screenMetricsProvider != null + ? screenMetricsProvider() + : null, ); _sendEvent(gtagEvent); } @@ -799,8 +776,9 @@ void _computeUserApplicationCustomGTagData() { userAppType = appTypeDartCLI; } - userBuildType = - connectedApp.isProfileBuildNow! ? buildTypeProfile : buildTypeDebug; + userBuildType = connectedApp.isProfileBuildNow! + ? buildTypeProfile + : buildTypeDebug; _analyticsComputed = true; } @@ -1031,22 +1009,21 @@ final class _DevToolsEventMetrics extends ua.CustomMetrics { final String? iosBundleId; @override - Map toMap() => - ({ - 'uiDurationMicros': uiDurationMicros, - 'rasterDurationMicros': rasterDurationMicros, - 'shaderCompilationDurationMicros': shaderCompilationDurationMicros, - 'traceEventCount': traceEventCount, - 'cpuSampleCount': cpuSampleCount, - 'cpuStackDepth': cpuStackDepth, - 'heapDiffObjectsBefore': heapDiffObjectsBefore, - 'heapDiffObjectsAfter': heapDiffObjectsAfter, - 'heapObjectsTotal': heapObjectsTotal, - 'rootSetCount': rootSetCount, - 'rowCount': rowCount, - 'inspectorTreeControllerId': inspectorTreeControllerId, - 'isV2Inspector': isV2Inspector, - 'androidAppId': androidAppId, - 'iosBundleId': iosBundleId, - }..removeWhere((key, value) => value == null)).cast(); + Map toMap() => ({ + 'uiDurationMicros': uiDurationMicros, + 'rasterDurationMicros': rasterDurationMicros, + 'shaderCompilationDurationMicros': shaderCompilationDurationMicros, + 'traceEventCount': traceEventCount, + 'cpuSampleCount': cpuSampleCount, + 'cpuStackDepth': cpuStackDepth, + 'heapDiffObjectsBefore': heapDiffObjectsBefore, + 'heapDiffObjectsAfter': heapDiffObjectsAfter, + 'heapObjectsTotal': heapObjectsTotal, + 'rootSetCount': rootSetCount, + 'rowCount': rowCount, + 'inspectorTreeControllerId': inspectorTreeControllerId, + 'isV2Inspector': isV2Inspector, + 'androidAppId': androidAppId, + 'iosBundleId': iosBundleId, + }..removeWhere((key, value) => value == null)).cast(); } diff --git a/packages/devtools_app/lib/src/shared/analytics/analytics_common.dart b/packages/devtools_app/lib/src/shared/analytics/analytics_common.dart index ec0c4471af0..a76196f497b 100644 --- a/packages/devtools_app/lib/src/shared/analytics/analytics_common.dart +++ b/packages/devtools_app/lib/src/shared/analytics/analytics_common.dart @@ -61,10 +61,9 @@ Map createStackTraceForAnalytics( const maxCharacterLimit = stackTraceChunksLimit * ga4ParamValueCharacterLimit; // Reduce whitespace characters to optimize available space. - final trimmedStackFrames = - stackTrace.frames - .map((f) => '${_normalizePath(f.location)} | ${f.member}\n') - .toList(); + final trimmedStackFrames = stackTrace.frames + .map((f) => '${_normalizePath(f.location)} | ${f.member}\n') + .toList(); final stackTraceAsString = trimmedStackFrames.join(); var stackTraceChunksForGa = chunkForGa( diff --git a/packages/devtools_app/lib/src/shared/analytics/prompt.dart b/packages/devtools_app/lib/src/shared/analytics/prompt.dart index 73a2272e730..5cd7ce6f604 100644 --- a/packages/devtools_app/lib/src/shared/analytics/prompt.dart +++ b/packages/devtools_app/lib/src/shared/analytics/prompt.dart @@ -44,7 +44,10 @@ class _AnalyticsPromptState extends State { return Column( crossAxisAlignment: CrossAxisAlignment.start, - children: [if (showPrompt) child!, Expanded(child: widget.child)], + children: [ + if (showPrompt) child!, + Expanded(child: widget.child), + ], ); }, child: Card( @@ -86,10 +89,9 @@ class _AnalyticsPromptState extends State { } Widget _analyticsDescription(ThemeData theme) { - final consentMessageRegExpResults = - parseAnalyticsConsentMessage( - controller.consentMessage, - )?.map((e) => adjustLineBreaks(e)).toList(); + final consentMessageRegExpResults = parseAnalyticsConsentMessage( + controller.consentMessage, + )?.map((e) => adjustLineBreaks(e)).toList(); // When failing to parse the consent message, fallback to displaying the // consent message in its regular form. diff --git a/packages/devtools_app/lib/src/shared/charts/chart.dart b/packages/devtools_app/lib/src/shared/charts/chart.dart index 90497a69614..c2bdfcfc899 100644 --- a/packages/devtools_app/lib/src/shared/charts/chart.dart +++ b/packages/devtools_app/lib/src/shared/charts/chart.dart @@ -95,28 +95,25 @@ class ChartState extends State with AutoDisposeMixin { return RepaintBoundary( child: LayoutBuilder( // Inner container - builder: - (_, constraints) => GestureDetector( - onTapDown: (TapDownDetails details) { - final xLocalPosition = details.localPosition.dx; - final timestampIndex = controller.xCoordToTimestampIndex( - xLocalPosition, - ); - final timestamp = controller.xCoordToTimestamp(xLocalPosition); - controller.tapLocation.value = TapLocation( - details, - timestamp, - timestampIndex, - ); - }, - child: SizedBox( - width: constraints.widthConstraints().maxWidth, - height: constraints.widthConstraints().maxHeight, - child: CustomPaint( - painter: ChartPainter(controller, colorScheme), - ), - ), - ), + builder: (_, constraints) => GestureDetector( + onTapDown: (TapDownDetails details) { + final xLocalPosition = details.localPosition.dx; + final timestampIndex = controller.xCoordToTimestampIndex( + xLocalPosition, + ); + final timestamp = controller.xCoordToTimestamp(xLocalPosition); + controller.tapLocation.value = TapLocation( + details, + timestamp, + timestampIndex, + ); + }, + child: SizedBox( + width: constraints.widthConstraints().maxWidth, + height: constraints.widthConstraints().maxHeight, + child: CustomPaint(painter: ChartPainter(controller, colorScheme)), + ), + ), ), ); } @@ -154,10 +151,9 @@ class ChartPainter extends CustomPainter { // sampling 1 point per horizontal pixel. final startTime = DateTime.now(); - final axis = - Paint() - ..strokeWidth = axisWidth - ..color = Colors.grey; + final axis = Paint() + ..strokeWidth = axisWidth + ..color = Colors.grey; if (size != chartController.size) { chartController.size = size; @@ -241,8 +237,9 @@ class ChartPainter extends CustomPainter { drawTranslate(canvas, xTranslation, yTranslation, (canvas) { final xCoord = xCanvasCoord; final yCoord = chartController.yPositionToYCanvasCoord(yValue); - final hasMultipleExtensionEvents = - traceData is DataAggregate ? traceData.count > 1 : false; + final hasMultipleExtensionEvents = traceData is DataAggregate + ? traceData.count > 1 + : false; // Is the visible Y-axis max larger. if (yValue > visibleYMax) { @@ -442,10 +439,9 @@ class ChartPainter extends CustomPainter { } void drawSelection(Canvas canvas, double x) { - final paint = - Paint() - ..strokeWidth = 2.0 - ..color = colorScheme.hoverSelectionBarColor; + final paint = Paint() + ..strokeWidth = 2.0 + ..color = colorScheme.hoverSelectionBarColor; // Draw the vertical selection bar. canvas.drawLine( @@ -597,14 +593,12 @@ class ChartPainter extends CustomPainter { break; } - final paintFirst = - Paint() - ..style = firstStyle - ..strokeWidth = characteristics.strokeWidth - ..color = - aggregateEvents - ? characteristics.colorAggregate! - : characteristics.color; + final paintFirst = Paint() + ..style = firstStyle + ..strokeWidth = characteristics.strokeWidth + ..color = aggregateEvents + ? characteristics.colorAggregate! + : characteristics.color; switch (characteristics.symbol) { case ChartSymbol.dashedLine: @@ -625,15 +619,13 @@ class ChartPainter extends CustomPainter { canvas.drawCircle(Offset(x, y), characteristics.diameter, paintFirst); // Inner disc. - final paintSecond = - Paint() - ..style = secondStyle - ..strokeWidth = 0 - // TODO(terry): Aggregate for concentric maybe needed someday. - ..color = - aggregateEvents - ? characteristics.colorAggregate! - : characteristics.concentricCenterColor; + final paintSecond = Paint() + ..style = secondStyle + ..strokeWidth = 0 + // TODO(terry): Aggregate for concentric maybe needed someday. + ..color = aggregateEvents + ? characteristics.colorAggregate! + : characteristics.concentricCenterColor; canvas.drawCircle( Offset(x, y), characteristics.concentricCenterDiameter, @@ -675,11 +667,10 @@ class ChartPainter extends CustomPainter { double endX, double endY, ) { - final paint = - Paint() - ..style = PaintingStyle.stroke - ..strokeWidth = characteristics.strokeWidth - ..color = characteristics.color; + final paint = Paint() + ..style = PaintingStyle.stroke + ..strokeWidth = characteristics.strokeWidth + ..color = characteristics.color; canvas.drawLine(Offset(startX, startY), Offset(endX, endY), paint); } @@ -691,11 +682,10 @@ class ChartPainter extends CustomPainter { double y, double tickWidth, ) { - final paint = - Paint() - ..style = PaintingStyle.stroke - ..strokeWidth = characteristics.strokeWidth - ..color = characteristics.color; + final paint = Paint() + ..style = PaintingStyle.stroke + ..strokeWidth = characteristics.strokeWidth + ..color = characteristics.color; canvas.drawLine(Offset(x, y), Offset(x + tickWidth, y), paint); } @@ -712,18 +702,16 @@ class ChartPainter extends CustomPainter { double y1, double y1Bottom, ) { - final paint = - Paint() - ..style = PaintingStyle.fill - ..strokeWidth = characteristics.strokeWidth - ..color = characteristics.color.withAlpha(140); - - final fillArea = - Path() - ..moveTo(x0, y0) - ..lineTo(x1, y1) - ..lineTo(x1, y1Bottom) - ..lineTo(x0, y0Bottom); + final paint = Paint() + ..style = PaintingStyle.fill + ..strokeWidth = characteristics.strokeWidth + ..color = characteristics.color.withAlpha(140); + + final fillArea = Path() + ..moveTo(x0, y0) + ..lineTo(x1, y1) + ..lineTo(x1, y1Bottom) + ..lineTo(x0, y0Bottom); fillArea.close(); canvas.drawPath(fillArea, paint); diff --git a/packages/devtools_app/lib/src/shared/charts/chart_controller.dart b/packages/devtools_app/lib/src/shared/charts/chart_controller.dart index c70f41f0922..923ac1b2630 100644 --- a/packages/devtools_app/lib/src/shared/charts/chart_controller.dart +++ b/packages/devtools_app/lib/src/shared/charts/chart_controller.dart @@ -233,10 +233,9 @@ class ChartController extends DisposableController return false; }); - final ticksVisible = - startOfLastNMinutes != null - ? timestampsLength - timestamps.indexOf(startOfLastNMinutes) - : timestampsLength + 1; + final ticksVisible = startOfLastNMinutes != null + ? timestampsLength - timestamps.indexOf(startOfLastNMinutes) + : timestampsLength + 1; _tickWidth = canvasChartWidth / ticksVisible; } else { // No but lets scale x-axis based on the last two timestamps diffs we have. @@ -367,8 +366,9 @@ class ChartController extends DisposableController timestamps.last, ); - final nSeconds = - rightMostTimestampDT.difference(rightMostLabelDT).inSeconds; + final nSeconds = rightMostTimestampDT + .difference(rightMostLabelDT) + .inSeconds; if (nSeconds >= labelInterval) { late int foundTimestamp; diff --git a/packages/devtools_app/lib/src/shared/charts/chart_trace.dart b/packages/devtools_app/lib/src/shared/charts/chart_trace.dart index e4fc8db1fbf..d95f0b2e861 100644 --- a/packages/devtools_app/lib/src/shared/charts/chart_trace.dart +++ b/packages/devtools_app/lib/src/shared/charts/chart_trace.dart @@ -357,17 +357,16 @@ class AxisScale { // Fractional part of range. final fraction = range / pow(10, exponent); // Nice, rounded fraction. - final niceFraction = - round - ? fraction.roundToDouble() - : switch (fraction) { - <= 1 => 1.0, - <= 2 => 2.0, - <= 3 => 3.0, - <= 5 => 5.0, - <= 7 => 7.0, - _ => 10.0, - }; + final niceFraction = round + ? fraction.roundToDouble() + : switch (fraction) { + <= 1 => 1.0, + <= 2 => 2.0, + <= 3 => 3.0, + <= 5 => 5.0, + <= 7 => 7.0, + _ => 10.0, + }; return niceFraction * pow(10, exponent); } diff --git a/packages/devtools_app/lib/src/shared/charts/flame_chart.dart b/packages/devtools_app/lib/src/shared/charts/flame_chart.dart index 5cc26b7066e..5151208b286 100644 --- a/packages/devtools_app/lib/src/shared/charts/flame_chart.dart +++ b/packages/devtools_app/lib/src/shared/charts/flame_chart.dart @@ -159,13 +159,12 @@ abstract class FlameChartState< TimeRange get visibleTimeRange { final horizontalScrollOffset = horizontalControllerGroup.offset; - final startMicros = - horizontalScrollOffset < widget.startInset - ? startTimeOffset - : startTimeOffset + - (horizontalScrollOffset - widget.startInset) / - currentZoom / - startingPxPerMicro; + final startMicros = horizontalScrollOffset < widget.startInset + ? startTimeOffset + : startTimeOffset + + (horizontalScrollOffset - widget.startInset) / + currentZoom / + startingPxPerMicro; final endMicros = startTimeOffset + @@ -236,9 +235,8 @@ abstract class FlameChartState< )..addListener(_handleZoomControllerValueUpdate); verticalExtentDelegate = FixedExtentDelegate( - computeExtent: - (index) => - rows[index].nodes.isEmpty ? sectionSpacing : rowHeightWithPadding, + computeExtent: (index) => + rows[index].nodes.isEmpty ? sectionSpacing : rowHeightWithPadding, computeLength: () => rows.length, ); @@ -396,11 +394,10 @@ abstract class FlameChartState< return; } - final hoverNodeData = - _binarySearchForNode( - x: event.localPosition.dx + horizontalControllerGroup.offset, - nodesInRow: nodes, - )?.data; + final hoverNodeData = _binarySearchForNode( + x: event.localPosition.dx + horizontalControllerGroup.offset, + nodesInRow: nodes, + )?.data; _hoveredNodeNotifier.value = hoverNodeData; } @@ -506,13 +503,10 @@ abstract class FlameChartState< final fixedX = safeMouseHoverX + lastScrollOffset - widget.startInset; // Calculate the new horizontal scroll position. - final newScrollOffset = - fixedX >= 0 - ? fixedX * newZoom / previousZoom + - widget.startInset - - safeMouseHoverX - // We are in the fixed portion of the window - no need to transform. - : lastScrollOffset; + final newScrollOffset = fixedX >= 0 + ? fixedX * newZoom / previousZoom + widget.startInset - safeMouseHoverX + // We are in the fixed portion of the window - no need to transform. + : lastScrollOffset; setState(() { currentZoom = zoomController.value; @@ -940,12 +934,11 @@ class FlameChartUtils { // Node right with zoom and insets taken into consideration. final nodeRight = (node.rect.right - chartStartInset) * nodeZoom + chartStartInset; - final padding = - nextNode == null - ? chartWidth - nodeRight - : ((nextNode.rect.left - chartStartInset) * nextNodeZoom + - chartStartInset) - - nodeRight; + final padding = nextNode == null + ? chartWidth - nodeRight + : ((nextNode.rect.left - chartStartInset) * nextNodeZoom + + chartStartInset) - + nodeRight; // Floating point rounding error can result in slightly negative padding. return math.max(0.0, padding); } @@ -1090,22 +1083,21 @@ class FlameChartNode> { activeSearchMatch: activeSearchMatch, colorScheme: theme.colorScheme, ), - child: - zoomedWidth >= _minWidthForText - ? Text( - text, - textAlign: TextAlign.left, - overflow: TextOverflow.ellipsis, - style: theme.regularTextStyleWithColor( - _textColor( - selected: selected, - searchMatch: searchMatch, - activeSearchMatch: activeSearchMatch, - colorScheme: theme.colorScheme, - ), + child: zoomedWidth >= _minWidthForText + ? Text( + text, + textAlign: TextAlign.left, + overflow: TextOverflow.ellipsis, + style: theme.regularTextStyleWithColor( + _textColor( + selected: selected, + searchMatch: searchMatch, + activeSearchMatch: activeSearchMatch, + colorScheme: theme.colorScheme, ), - ) - : const SizedBox(), + ), + ) + : const SizedBox(), ); return (hovered || !selectable) ? DevToolsTooltip(key: key, message: data.tooltip, child: node) @@ -1346,11 +1338,9 @@ class TimelineGridPainter extends FlameChartPainter { final microsPerInterval = _microsPerInterval(intervalWidth); int timestampMicros = _startingTimestamp(intervalWidth, microsPerInterval); double lineX; - lineX = - visible.left <= chartStartInset - ? chartStartInset - visible.left - : intervalWidth - - ((visible.left - chartStartInset) % intervalWidth); + lineX = visible.left <= chartStartInset + ? chartStartInset - visible.left + : intervalWidth - ((visible.left - chartStartInset) % intervalWidth); while (lineX < constraints.maxWidth) { _paintTimestamp(canvas, timestampMicros, intervalWidth, lineX); @@ -1422,10 +1412,9 @@ class TimelineGridPainter extends FlameChartPainter { } int _startingTimestamp(double intervalWidth, int microsPerInterval) { - final startingIntervalIndex = - horizontalScrollOffset < chartStartInset - ? 0 - : (horizontalScrollOffset - chartStartInset) ~/ intervalWidth + 1; + final startingIntervalIndex = horizontalScrollOffset < chartStartInset + ? 0 + : (horizontalScrollOffset - chartStartInset) ~/ intervalWidth + 1; return startingIntervalIndex * microsPerInterval; } diff --git a/packages/devtools_app/lib/src/shared/charts/treemap.dart b/packages/devtools_app/lib/src/shared/charts/treemap.dart index 7789bac53b4..9b0db9a44ac 100644 --- a/packages/devtools_app/lib/src/shared/charts/treemap.dart +++ b/packages/devtools_app/lib/src/shared/charts/treemap.dart @@ -234,15 +234,13 @@ class _TreemapState extends State { final pivotAndList2Ratio = (pivotByteSize + list2Size) / totalByteSize; final pivotRatio = pivotByteSize / (pivotByteSize + list2Size); - final pivotWidth = - isHorizontalRectangle - ? pivotAndList2Ratio * width - : pivotRatio * width; + final pivotWidth = isHorizontalRectangle + ? pivotAndList2Ratio * width + : pivotRatio * width; - final pivotHeight = - isHorizontalRectangle - ? pivotRatio * height - : pivotAndList2Ratio * height; + final pivotHeight = isHorizontalRectangle + ? pivotRatio * height + : pivotAndList2Ratio * height; final pivotAspectRatio = pivotWidth / pivotHeight; @@ -269,14 +267,12 @@ class _TreemapState extends State { final pivotAndList2Ratio = (pivotByteSize + list2ByteSize) / totalByteSize; final pivotRatio = pivotByteSize / (pivotByteSize + list2ByteSize); - pivotBestWidth = - isHorizontalRectangle - ? pivotAndList2Ratio * width - : pivotRatio * width; - pivotBestHeight = - isHorizontalRectangle - ? pivotRatio * height - : pivotAndList2Ratio * height; + pivotBestWidth = isHorizontalRectangle + ? pivotAndList2Ratio * width + : pivotRatio * width; + pivotBestHeight = isHorizontalRectangle + ? pivotRatio * height + : pivotAndList2Ratio * height; } final positionedTreemaps = []; @@ -284,8 +280,9 @@ class _TreemapState extends State { // Construct list 1 sub-treemap. final list1SizeRatio = list1ByteSize / totalByteSize; final list1Width = isHorizontalRectangle ? width * list1SizeRatio : width; - final list1Height = - isHorizontalRectangle ? height : height * list1SizeRatio; + final list1Height = isHorizontalRectangle + ? height + : height * list1SizeRatio; if (list1.isNotEmpty) { positionedTreemaps.addAll( buildTreemaps( @@ -299,10 +296,12 @@ class _TreemapState extends State { } // Construct list 2 sub-treemap. - final list2Width = - isHorizontalRectangle ? pivotBestWidth : width - pivotBestWidth; - final list2Height = - isHorizontalRectangle ? height - pivotBestHeight : pivotBestHeight; + final list2Width = isHorizontalRectangle + ? pivotBestWidth + : width - pivotBestWidth; + final list2Height = isHorizontalRectangle + ? height - pivotBestHeight + : pivotBestHeight; final list2XCoord = isHorizontalRectangle ? list1Width : 0.0; final list2YCoord = isHorizontalRectangle ? pivotBestHeight : list1Height; if (list2.isNotEmpty) { @@ -344,10 +343,12 @@ class _TreemapState extends State { final list3Ratio = list3ByteSize / totalByteSize; final list3Width = isHorizontalRectangle ? list3Ratio * width : width; final list3Height = isHorizontalRectangle ? height : list3Ratio * height; - final list3XCoord = - isHorizontalRectangle ? list1Width + pivotBestWidth : 0.0; - final list3YCoord = - isHorizontalRectangle ? 0.0 : list1Height + pivotBestHeight; + final list3XCoord = isHorizontalRectangle + ? list1Width + pivotBestWidth + : 0.0; + final list3YCoord = isHorizontalRectangle + ? 0.0 + : list1Height + pivotBestHeight; if (list3.isNotEmpty) { positionedTreemaps.addAll( @@ -489,14 +490,13 @@ class _TreemapState extends State { onRootChangedCallback: widget.onRootChangedCallback, ), Expanded( - child: - widget.isOutermostLevel - ? child - : _SelectableTreemapNode( - node: rootNode, - onRootChangedCallback: widget.onRootChangedCallback, - child: child, - ), + child: widget.isOutermostLevel + ? child + : _SelectableTreemapNode( + node: rootNode, + onRootChangedCallback: widget.onRootChangedCallback, + child: child, + ), ), ], ); @@ -537,14 +537,13 @@ class _TreeMapCell extends StatelessWidget { border: Border.all(color: Colors.black87), ), child: Center( - child: - treeMapHeight > Treemap.minHeightToDisplayCellText - ? _NameAndSizeText( - node: node, - color: node.showDiff ? Colors.white : Colors.black, - singleLine: false, - ) - : const SizedBox(), + child: treeMapHeight > Treemap.minHeightToDisplayCellText + ? _NameAndSizeText( + node: node, + color: node.showDiff ? Colors.white : Colors.black, + singleLine: false, + ) + : const SizedBox(), ), ); } @@ -631,10 +630,9 @@ class _BreadcrumbNavigator extends StatelessWidget { builder: (context, index) { final node = pathFromRoot[index]; return Breadcrumb( - text: - index < pathFromRoot.length - 1 - ? node.name - : node.displayText(), + text: index < pathFromRoot.length - 1 + ? node.name + : node.displayText(), isRoot: index == 0, onPressed: () => onRootChangedCallback(node), ); @@ -870,10 +868,9 @@ class MultiCellPainter extends CustomPainter { rectPaint.color = node.displayColor; canvas.drawRect(bounds, rectPaint); - final borderPaint = - Paint() - ..color = Colors.black45 - ..style = PaintingStyle.stroke; + final borderPaint = Paint() + ..color = Colors.black45 + ..style = PaintingStyle.stroke; canvas.drawRect(bounds, borderPaint); if (positionedCell.width! > Treemap.minWidthToDisplayCellText && diff --git a/packages/devtools_app/lib/src/shared/config_specific/drag_and_drop/drag_and_drop.dart b/packages/devtools_app/lib/src/shared/config_specific/drag_and_drop/drag_and_drop.dart index f469c107f99..2b26dd69e65 100644 --- a/packages/devtools_app/lib/src/shared/config_specific/drag_and_drop/drag_and_drop.dart +++ b/packages/devtools_app/lib/src/shared/config_specific/drag_and_drop/drag_and_drop.dart @@ -151,19 +151,18 @@ class DragAndDropState extends State { _refreshDragAndDropManager(View.of(context).viewId); return MetaData( metaData: DragAndDropMetaData(state: this), - child: - widget.handleDrop != null - ? ValueListenableBuilder( - valueListenable: _dragging, - builder: (context, dragging, _) { - // TODO(kenz): use AnimatedOpacity instead. - return Opacity( - opacity: dragging ? 0.5 : 1.0, - child: widget.child, - ); - }, - ) - : widget.child, + child: widget.handleDrop != null + ? ValueListenableBuilder( + valueListenable: _dragging, + builder: (context, dragging, _) { + // TODO(kenz): use AnimatedOpacity instead. + return Opacity( + opacity: dragging ? 0.5 : 1.0, + child: widget.child, + ); + }, + ) + : widget.child, ); } diff --git a/packages/devtools_app/lib/src/shared/console/console.dart b/packages/devtools_app/lib/src/shared/console/console.dart index 273d4d70b74..ea3cc46bda3 100644 --- a/packages/devtools_app/lib/src/shared/console/console.dart +++ b/packages/devtools_app/lib/src/shared/console/console.dart @@ -48,7 +48,10 @@ class ConsoleFrame extends StatelessWidget { padding: const EdgeInsets.only(bottom: densePadding), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, - children: [if (title != null) title!, Expanded(child: child)], + children: [ + if (title != null) title!, + Expanded(child: child), + ], ), ); } diff --git a/packages/devtools_app/lib/src/shared/console/eval/auto_complete.dart b/packages/devtools_app/lib/src/shared/console/eval/auto_complete.dart index 5e151be0505..5cfc2aa3ab7 100644 --- a/packages/devtools_app/lib/src/shared/console/eval/auto_complete.dart +++ b/packages/devtools_app/lib/src/shared/console/eval/auto_complete.dart @@ -170,11 +170,10 @@ Future> libraryMemberAutocompletes( LibraryRef libraryRef, { required bool includePrivates, }) async { - var result = - (await _appState.cache.libraryMemberAutocomplete.putIfAbsent( - libraryRef, - () => _libraryMemberAutocompletes(evalService, libraryRef), - )).nonNulls; + var result = (await _appState.cache.libraryMemberAutocomplete.putIfAbsent( + libraryRef, + () => _libraryMemberAutocompletes(evalService, libraryRef), + )).nonNulls; if (!includePrivates) { result = result.where((name) => !isPrivateMember(name)); } diff --git a/packages/devtools_app/lib/src/shared/console/eval/eval_service.dart b/packages/devtools_app/lib/src/shared/console/eval/eval_service.dart index 90b3b38fe91..97aaf706131 100644 --- a/packages/devtools_app/lib/src/shared/console/eval/eval_service.dart +++ b/packages/devtools_app/lib/src/shared/console/eval/eval_service.dart @@ -185,10 +185,12 @@ class EvalService extends DisposableController with AutoDisposeControllerMixin { ) async { final isolateId = isolateRef.id!; - final theClass = (await serviceConnection.serviceManager.service! - .getClassList(isolateId)).classes!.firstWhereOrNull( - (ref) => object.className?.matches(ref) ?? false, - ); + final theClass = + (await serviceConnection.serviceManager.service!.getClassList( + isolateId, + )).classes!.firstWhereOrNull( + (ref) => object.className?.matches(ref) ?? false, + ); return await findInstance(isolateId, theClass?.id, object.code); } diff --git a/packages/devtools_app/lib/src/shared/console/widgets/console_pane.dart b/packages/devtools_app/lib/src/shared/console/widgets/console_pane.dart index 7c4d80fb33f..5a40db7b21f 100644 --- a/packages/devtools_app/lib/src/shared/console/widgets/console_pane.dart +++ b/packages/devtools_app/lib/src/shared/console/widgets/console_pane.dart @@ -24,8 +24,8 @@ class ConsolePaneHeader extends AreaPaneHeader { const ConsoleHelpLink(), const SizedBox(width: densePadding), CopyToClipboardControl( - dataProvider: - () => serviceConnection.consoleService.stdio.value.join('\n'), + dataProvider: () => + serviceConnection.consoleService.stdio.value.join('\n'), buttonKey: ConsolePane.copyToClipboardButtonKey, ), const SizedBox(width: densePadding), @@ -62,7 +62,11 @@ class ConsolePane extends StatelessWidget { } return Column( - children: [Expanded(child: Console(lines: stdio, footer: footer))], + children: [ + Expanded( + child: Console(lines: stdio, footer: footer), + ), + ], ); } } diff --git a/packages/devtools_app/lib/src/shared/console/widgets/description.dart b/packages/devtools_app/lib/src/shared/console/widgets/description.dart index 70b88a2dc72..ac885f86a36 100644 --- a/packages/devtools_app/lib/src/shared/console/widgets/description.dart +++ b/packages/devtools_app/lib/src/shared/console/widgets/description.dart @@ -192,59 +192,55 @@ class DiagnosticsNodeDescription extends StatelessWidget { diagnostic?.descriptionTextStyleFromBuild = textStyle; final textSpan = TextSpan( - children: - buildDescriptionTextSpans( - description: description, - textStyle: textStyle, - colorScheme: colorScheme, - diagnostic: diagnostic, - searchValue: searchValue, - nodeDescriptionHighlightStyle: nodeDescriptionHighlightStyle, - ).toList(), + children: buildDescriptionTextSpans( + description: description, + textStyle: textStyle, + colorScheme: colorScheme, + diagnostic: diagnostic, + searchValue: searchValue, + nodeDescriptionHighlightStyle: nodeDescriptionHighlightStyle, + ).toList(), ); final diagnosticLocal = diagnostic!; final inspectorService = serviceConnection.inspectorService!; return HoverCardTooltip.async( - enabled: - () => - preferences.inspector.hoverEvalModeEnabled.value && - diagnosticLocal.objectGroupApi != null && - !isPrimitiveValueOrNull(description), - asyncGenerateHoverCardData: ({ - required event, - required isHoverStale, - }) async { - final group = inspectorService.createObjectGroup('hover'); - - if (isHoverStale()) return Future.value(); - final value = await group.toObservatoryInstanceRef( - diagnosticLocal.valueRef, - ); - - final variable = DartObjectNode.fromValue( - value: value, - isolateRef: inspectorService.isolateRef, - diagnostic: diagnosticLocal, - ); - - if (isHoverStale()) return Future.value(); - await buildVariablesTree(variable); - final tasks = >[]; - for (final child in variable.children) { - tasks.add(() async { - if (!isHoverStale()) await buildVariablesTree(child); - }()); - } - await tasks.wait; - variable.expand(); - - return HoverCardData( - title: diagnosticLocal.toStringShort(), - contents: Material(child: ExpandableVariable(variable: variable)), - ); - }, + enabled: () => + preferences.inspector.hoverEvalModeEnabled.value && + diagnosticLocal.objectGroupApi != null && + !isPrimitiveValueOrNull(description), + asyncGenerateHoverCardData: + ({required event, required isHoverStale}) async { + final group = inspectorService.createObjectGroup('hover'); + + if (isHoverStale()) return Future.value(); + final value = await group.toObservatoryInstanceRef( + diagnosticLocal.valueRef, + ); + + final variable = DartObjectNode.fromValue( + value: value, + isolateRef: inspectorService.isolateRef, + diagnostic: diagnosticLocal, + ); + + if (isHoverStale()) return Future.value(); + await buildVariablesTree(variable); + final tasks = >[]; + for (final child in variable.children) { + tasks.add(() async { + if (!isHoverStale()) await buildVariablesTree(child); + }()); + } + await tasks.wait; + variable.expand(); + + return HoverCardData( + title: diagnosticLocal.toStringShort(), + contents: Material(child: ExpandableVariable(variable: variable)), + ); + }, child: DescriptionDisplay( text: textSpan, multiline: multiline, @@ -265,10 +261,9 @@ class DiagnosticsNodeDescription extends StatelessWidget { final theme = Theme.of(context); final colorScheme = theme.colorScheme; - final icon = - customIconName != null - ? RemoteDiagnosticsNode.iconMaker.fromWidgetName(customIconName) - : diagnosticLocal.icon; + final icon = customIconName != null + ? RemoteDiagnosticsNode.iconMaker.fromWidgetName(customIconName) + : diagnosticLocal.icon; final children = []; @@ -329,10 +324,9 @@ class DiagnosticsNodeDescription extends StatelessWidget { final green = JsonUtils.getIntMember(properties, 'green'); final blue = JsonUtils.getIntMember(properties, 'blue'); String radix(int chan) => chan.toRadixString(16).padLeft(2, '0'); - description = - alpha == 255 - ? '#${radix(red)}${radix(green)}${radix(blue)}' - : '#${radix(alpha)}${radix(red)}${radix(green)}${radix(blue)}'; + description = alpha == 255 + ? '#${radix(red)}${radix(green)}${radix(blue)}' + : '#${radix(alpha)}${radix(red)}${radix(green)}${radix(blue)}'; final color = Color.fromARGB(alpha, red, green, blue); children.add(_paddedIcon(_colorIconMaker.getCustomIcon(color))); @@ -479,10 +473,9 @@ class DiagnosticsNodeDescription extends StatelessWidget { text: errorText, // When the node is selected, the background will be an error // color so don't render the text the same color. - style: - isSelected - ? DiagnosticsTextStyles.regular(colorScheme) - : DiagnosticsTextStyles.error(colorScheme), + style: isSelected + ? DiagnosticsTextStyles.regular(colorScheme) + : DiagnosticsTextStyles.error(colorScheme), ), ), ); diff --git a/packages/devtools_app/lib/src/shared/console/widgets/display_provider.dart b/packages/devtools_app/lib/src/shared/console/widgets/display_provider.dart index 5eccdde4f70..2fed4f1c9b4 100644 --- a/packages/devtools_app/lib/src/shared/console/widgets/display_provider.dart +++ b/packages/devtools_app/lib/src/shared/console/widgets/display_provider.dart @@ -91,21 +91,19 @@ class _DisplayProviderState extends State { overflow: TextOverflow.ellipsis, TextSpan( text: hasName ? widget.variable.name : null, - style: - widget.variable.artificialName - ? theme.subtleFixedFontStyle - : theme.fixedFontStyle.apply( - color: theme.colorScheme.controlFlowSyntaxColor, - ), + style: widget.variable.artificialName + ? theme.subtleFixedFontStyle + : theme.fixedFontStyle.apply( + color: theme.colorScheme.controlFlowSyntaxColor, + ), children: [ if (hasName) TextSpan(text: ': ', style: theme.fixedFontStyle), TextSpan( text: displayValue, - style: - widget.variable.artificialValue - ? theme.subtleFixedFontStyle - : _variableDisplayStyle(theme, widget.variable), + style: widget.variable.artificialValue + ? theme.subtleFixedFontStyle + : _variableDisplayStyle(theme, widget.variable), ), ], ), @@ -344,8 +342,9 @@ class _InteractivityWrapperState extends State { return GestureDetector( behavior: HitTestBehavior.opaque, onTap: _onTap, - onSecondaryTapUp: - contextMenuOnSecondaryTapEnabled ? _onSecondaryTapUp : null, + onSecondaryTapUp: contextMenuOnSecondaryTapEnabled + ? _onSecondaryTapUp + : null, child: widget.child, ); } diff --git a/packages/devtools_app/lib/src/shared/console/widgets/evaluate.dart b/packages/devtools_app/lib/src/shared/console/widgets/evaluate.dart index 6bdbadf78ed..e7c07d9704a 100644 --- a/packages/devtools_app/lib/src/shared/console/widgets/evaluate.dart +++ b/packages/devtools_app/lib/src/shared/console/widgets/evaluate.dart @@ -161,8 +161,8 @@ class ExpressionEvalFieldState extends State final matches = parts.activeWord.startsWith(_activeWord) && _activeWord.isNotEmpty - ? _filterMatches(_matches, parts.activeWord) - : await widget.getAutoCompleteResults(parts, evalService); + ? _filterMatches(_matches, parts.activeWord) + : await widget.getAutoCompleteResults(parts, evalService); _matches = matches; _activeWord = parts.activeWord; @@ -174,11 +174,10 @@ class ExpressionEvalFieldState extends State ..clearSearchAutoComplete() ..clearCurrentSuggestion(); } else { - final results = - matches - .sublist(0, min(defaultTopMatchesLimit, matches.length)) - .map((match) => AutoCompleteMatch(match)) - .toList(); + final results = matches + .sublist(0, min(defaultTopMatchesLimit, matches.length)) + .map((match) => AutoCompleteMatch(match)) + .toList(); _autoCompleteController ..searchAutoComplete.value = results @@ -231,21 +230,18 @@ class ExpressionEvalFieldState extends State labelText: 'Eval. Enter "?" for help.', labelStyle: Theme.of(context).subtleTextStyle, ), - overlayXPositionBuilder: ( - String inputValue, - TextStyle? inputStyle, - ) { - // X-coordinate is equivalent to the width of the input text - // up to the last "." or the insertion point (cursor): - final indexOfDot = inputValue.lastIndexOf('.'); - final textSegment = - indexOfDot != -1 + overlayXPositionBuilder: + (String inputValue, TextStyle? inputStyle) { + // X-coordinate is equivalent to the width of the input text + // up to the last "." or the insertion point (cursor): + final indexOfDot = inputValue.lastIndexOf('.'); + final textSegment = indexOfDot != -1 ? inputValue.substring(0, indexOfDot + 1) : inputValue; - return calculateTextSpanWidth( - TextSpan(text: textSegment, style: inputStyle), - ); - }, + return calculateTextSpanWidth( + TextSpan(text: textSegment, style: inputStyle), + ); + }, // Disable ligatures, so the suggestions of the auto complete work correcly. style: Theme.of(context).fixedFontStyle.copyWith( fontFeatures: [const FontFeature.disable('liga')], @@ -444,20 +440,18 @@ class ExpressionEvalFieldState extends State return kSuccess; } - final isolateId = - serviceConnection - .serviceManager - .isolateManager - .selectedIsolate - .value - ?.id; - final isolateName = - serviceConnection - .serviceManager - .isolateManager - .selectedIsolate - .value - ?.name; + final isolateId = serviceConnection + .serviceManager + .isolateManager + .selectedIsolate + .value + ?.id; + final isolateName = serviceConnection + .serviceManager + .isolateManager + .selectedIsolate + .value + ?.name; if (isolateId == null || isolateName == null) { _emitToConsole('Selected isolate cannot be detected.'); diff --git a/packages/devtools_app/lib/src/shared/development_helpers.dart b/packages/devtools_app/lib/src/shared/development_helpers.dart index 48c54a4d20b..770016a560d 100644 --- a/packages/devtools_app/lib/src/shared/development_helpers.dart +++ b/packages/devtools_app/lib/src/shared/development_helpers.dart @@ -66,8 +66,9 @@ ExtensionEnabledState debugHandleExtensionEnabledState({ bool? enable, }) { if (enable != null) { - stubExtensionEnabledStates[extensionName] = - enable ? ExtensionEnabledState.enabled : ExtensionEnabledState.disabled; + stubExtensionEnabledStates[extensionName] = enable + ? ExtensionEnabledState.enabled + : ExtensionEnabledState.disabled; } return stubExtensionEnabledStates.putIfAbsent( extensionName, diff --git a/packages/devtools_app/lib/src/shared/diagnostics/dart_object_node.dart b/packages/devtools_app/lib/src/shared/diagnostics/dart_object_node.dart index d3bd6dbd6c6..b7279fb7b9f 100644 --- a/packages/devtools_app/lib/src/shared/diagnostics/dart_object_node.dart +++ b/packages/devtools_app/lib/src/shared/diagnostics/dart_object_node.dart @@ -313,10 +313,9 @@ class DartObjectNode extends TreeNode { // to `children.length` if it's not provide (this means we don't get // the count until the record is expanded): final count = value.length ?? children.length; - valueStr = - count == 0 - ? 'Record' - : 'Record ($count ${pluralize('field', count)})'; + valueStr = count == 0 + ? 'Record' + : 'Record ($count ${pluralize('field', count)})'; } else if (value.valueAsString == null) { valueStr = value.classRef?.name ?? ''; } else { @@ -374,8 +373,9 @@ class DartObjectNode extends TreeNode { if (text != null) return text!; final instanceRef = ref!.instanceRef; - final value = - instanceRef is InstanceRef ? instanceRef.valueAsString : instanceRef; + final value = instanceRef is InstanceRef + ? instanceRef.valueAsString + : instanceRef; return '$name - $value'; } diff --git a/packages/devtools_app/lib/src/shared/diagnostics/inspector_service.dart b/packages/devtools_app/lib/src/shared/diagnostics/inspector_service.dart index ff7c99ead9f..f84cca86db1 100644 --- a/packages/devtools_app/lib/src/shared/diagnostics/inspector_service.dart +++ b/packages/devtools_app/lib/src/shared/diagnostics/inspector_service.dart @@ -128,9 +128,9 @@ abstract class InspectorServiceBase extends DisposableController return useDaemonApi ? await invokeServiceMethodDaemonNoGroupArgs(methodName) == true : (await invokeServiceMethodObservatoryNoGroup( - methodName, - ))?.valueAsString == - 'true'; + methodName, + ))?.valueAsString == + 'true'; } Future invokeServiceMethodDaemonNoGroupArgs( @@ -338,8 +338,10 @@ class InspectorService extends InspectorServiceBase { // here. assert(!directory.startsWith('package:')); - final parts = - directory.split('/').where((element) => element.isNotEmpty).toList(); + final parts = directory + .split('/') + .where((element) => element.isNotEmpty) + .toList(); final libIndex = parts.lastIndexOf('lib'); final path = libIndex > 0 ? parts.sublist(0, libIndex) : parts; // Special case handling of bazel packages. @@ -500,13 +502,12 @@ abstract class InspectorObjectGroupBase @override Future dispose() { // No need to dispose the group if the isolate is already gone. - final disposeComplete = - inspectorService.isolateRef != null - ? invokeVoidServiceMethod( - WidgetInspectorServiceExtensions.disposeGroup.name, - groupName, - ) - : Future.value(); + final disposeComplete = inspectorService.isolateRef != null + ? invokeVoidServiceMethod( + WidgetInspectorServiceExtensions.disposeGroup.name, + groupName, + ) + : Future.value(); disposed = true; return disposeComplete; } @@ -518,11 +519,11 @@ abstract class InspectorObjectGroupBase if (disposed) return null; return useDaemonApi ? parseDiagnosticsNodeDaemon( - invokeServiceMethodDaemonInspectorRef(methodName, ref), - ) + invokeServiceMethodDaemonInspectorRef(methodName, ref), + ) : parseDiagnosticsNodeObservatory( - invokeServiceMethodObservatoryInspectorRef(methodName, ref), - ); + invokeServiceMethodObservatoryInspectorRef(methodName, ref), + ); } Future invokeServiceMethodWithArgReturningNode( @@ -532,11 +533,11 @@ abstract class InspectorObjectGroupBase if (disposed) return null; return useDaemonApi ? parseDiagnosticsNodeDaemon( - invokeServiceMethodDaemonArg(methodName, arg, groupName), - ) + invokeServiceMethodDaemonArg(methodName, arg, groupName), + ) : parseDiagnosticsNodeObservatory( - invokeServiceMethodObservatoryWithGroupName1(methodName, arg), - ); + invokeServiceMethodObservatoryWithGroupName1(methodName, arg), + ); } Future invokeServiceMethodDaemonArg( @@ -853,15 +854,15 @@ abstract class InspectorObjectGroupBase if (disposed) return const []; return useDaemonApi ? parseDiagnosticsNodesDaemon( - invokeServiceMethodDaemonInspectorRef(methodName, instanceRef), - parent, - isProperty, - ) + invokeServiceMethodDaemonInspectorRef(methodName, instanceRef), + parent, + isProperty, + ) : parseDiagnosticsNodesObservatory( - invokeServiceMethodObservatoryInspectorRef(methodName, instanceRef), - parent, - isProperty, - ); + invokeServiceMethodObservatoryInspectorRef(methodName, instanceRef), + parent, + isProperty, + ); } /// Evaluate an expression where `object` references the `inspectorRef` or @@ -1061,19 +1062,19 @@ class ObjectGroup extends InspectorObjectGroupBase { } return useDaemonApi ? handleSetSelectionDaemon( - invokeServiceMethodDaemonInspectorRef( - WidgetInspectorServiceExtensions.setSelectionById.name, - selection, - ), - uiAlreadyUpdated, - ) + invokeServiceMethodDaemonInspectorRef( + WidgetInspectorServiceExtensions.setSelectionById.name, + selection, + ), + uiAlreadyUpdated, + ) : handleSetSelectionObservatory( - invokeServiceMethodObservatoryInspectorRef( - WidgetInspectorServiceExtensions.setSelectionById.name, - selection, - ), - uiAlreadyUpdated, - ); + invokeServiceMethodObservatoryInspectorRef( + WidgetInspectorServiceExtensions.setSelectionById.name, + selection, + ), + uiAlreadyUpdated, + ); } Future setSelection(GenericInstanceRef selection) async { diff --git a/packages/devtools_app/lib/src/shared/diagnostics/references.dart b/packages/devtools_app/lib/src/shared/diagnostics/references.dart index 9305d34f4c3..a353f7c83b2 100644 --- a/packages/devtools_app/lib/src/shared/diagnostics/references.dart +++ b/packages/devtools_app/lib/src/shared/diagnostics/references.dart @@ -101,43 +101,41 @@ Future addChildReferences(DartObjectNode variable) async { return; case RefNodeType.staticInRefs: - final children = - ref.heapSelection - .references(ref.refNodeType.direction!) - .where((s) => !s.className!.isNull) - .map( - (s) => DartObjectNode.references( - s.className!.className, - ObjectReferences( - refNodeType: RefNodeType.staticInRefs, - heapSelection: s, - isolateRef: ref.isolateRef, - value: null, - ), - isRerootable: true, - ), - ) - .toList(); + final children = ref.heapSelection + .references(ref.refNodeType.direction!) + .where((s) => !s.className!.isNull) + .map( + (s) => DartObjectNode.references( + s.className!.className, + ObjectReferences( + refNodeType: RefNodeType.staticInRefs, + heapSelection: s, + isolateRef: ref.isolateRef, + value: null, + ), + isRerootable: true, + ), + ) + .toList(); variable.addAllChildren(children); return; case RefNodeType.staticOutRefs: - final children = - ref.heapSelection - .references(ref.refNodeType.direction!) - .where((s) => !s.className!.isNull) - .map( - (s) => DartObjectNode.references( - '${s.className!.className}, ${prettyPrintRetainedSize(s.retainedSize)}', - ObjectReferences( - refNodeType: RefNodeType.staticOutRefs, - heapSelection: s, - isolateRef: ref.isolateRef, - value: null, - ), - isRerootable: true, - ), - ) - .toList(); + final children = ref.heapSelection + .references(ref.refNodeType.direction!) + .where((s) => !s.className!.isNull) + .map( + (s) => DartObjectNode.references( + '${s.className!.className}, ${prettyPrintRetainedSize(s.retainedSize)}', + ObjectReferences( + refNodeType: RefNodeType.staticOutRefs, + heapSelection: s, + isolateRef: ref.isolateRef, + value: null, + ), + isRerootable: true, + ), + ) + .toList(); variable.addAllChildren(children); return; case RefNodeType.liveRefRoot: diff --git a/packages/devtools_app/lib/src/shared/diagnostics/tree_builder.dart b/packages/devtools_app/lib/src/shared/diagnostics/tree_builder.dart index c68aec96c57..d4f02f17553 100644 --- a/packages/devtools_app/lib/src/shared/diagnostics/tree_builder.dart +++ b/packages/devtools_app/lib/src/shared/diagnostics/tree_builder.dart @@ -102,10 +102,10 @@ Future _addDiagnosticChildrenIfNeeded( void _setupGrouping(DartObjectNode variable) { final numChildrenInGrouping = variable.childCount >= pow(DartObjectNode.maxChildrenInGrouping, 2) - ? (roundToNearestPow10(variable.childCount) / - DartObjectNode.maxChildrenInGrouping) - .floor() - : DartObjectNode.maxChildrenInGrouping; + ? (roundToNearestPow10(variable.childCount) / + DartObjectNode.maxChildrenInGrouping) + .floor() + : DartObjectNode.maxChildrenInGrouping; var start = variable.offset; final end = start + variable.childCount; diff --git a/packages/devtools_app/lib/src/shared/editor/api_classes.dart b/packages/devtools_app/lib/src/shared/editor/api_classes.dart index 9ed04a2190a..612fc47f0ba 100644 --- a/packages/devtools_app/lib/src/shared/editor/api_classes.dart +++ b/packages/devtools_app/lib/src/shared/editor/api_classes.dart @@ -327,11 +327,10 @@ class ActiveLocationChangedEvent extends EditorEvent { textDocument: TextDocument.fromJson( map[Field.textDocument] as Map, ), - selections: - (map[Field.selections] as List) - .cast>() - .map(EditorSelection.fromJson) - .toList(), + selections: (map[Field.selections] as List) + .cast>() + .map(EditorSelection.fromJson) + .toList(), ); final List selections; @@ -479,17 +478,13 @@ class EditableArgumentsResult with Serializable { : this( name: map[Field.name] as String?, documentation: map[Field.documentation] as String?, - range: - (map[Field.range] as Map?) == null - ? null - : EditorRange.fromJson( - map[Field.range] as Map, - ), - args: - (map[Field.arguments] as List? ?? []) - .cast>() - .map(EditableArgument.fromJson) - .toList(), + range: (map[Field.range] as Map?) == null + ? null + : EditorRange.fromJson(map[Field.range] as Map), + args: (map[Field.arguments] as List? ?? []) + .cast>() + .map(EditableArgument.fromJson) + .toList(), ); final List args; @@ -693,11 +688,10 @@ class GetDevicesResult with Serializable { GetDevicesResult.fromJson(Map map) : this( - devices: - (map[Field.devices] as List) - .cast>() - .map(EditorDevice.fromJson) - .toList(), + devices: (map[Field.devices] as List) + .cast>() + .map(EditorDevice.fromJson) + .toList(), selectedDeviceId: map[Field.selectedDeviceId] as String?, ); @@ -717,11 +711,10 @@ class GetDebugSessionsResult with Serializable { GetDebugSessionsResult.fromJson(Map map) : this( - debugSessions: - (map[Field.debugSessions] as List) - .cast>() - .map(EditorDebugSession.fromJson) - .toList(), + debugSessions: (map[Field.debugSessions] as List) + .cast>() + .map(EditorDebugSession.fromJson) + .toList(), ); final List debugSessions; diff --git a/packages/devtools_app/lib/src/shared/editor/editor_client.dart b/packages/devtools_app/lib/src/shared/editor/editor_client.dart index b3ea9632764..b8ebc72264d 100644 --- a/packages/devtools_app/lib/src/shared/editor/editor_client.dart +++ b/packages/devtools_app/lib/src/shared/editor/editor_client.dart @@ -78,14 +78,13 @@ class EditorClient extends DisposableController return; } - final info = - isRegistered - ? ServiceRegistered( - service: service, - method: method, - capabilities: capabilities, - ) - : ServiceUnregistered(service: service, method: method); + final info = isRegistered + ? ServiceRegistered( + service: service, + method: method, + capabilities: capabilities, + ) + : ServiceUnregistered(service: service, method: method); _editorServiceChangedController.add(info); }), ); @@ -274,12 +273,9 @@ class EditorClient extends DisposableController }, ); final rawResult = response.result[Field.result]; - result = - rawResult != null - ? EditableArgumentsResult.fromJson( - rawResult as Map, - ) - : null; + result = rawResult != null + ? EditableArgumentsResult.fromJson(rawResult as Map) + : null; } on RpcException catch (e, st) { // We expect content modified errors if a user edits their code before the // request completes. Therefore it is safe to ignore. diff --git a/packages/devtools_app/lib/src/shared/environment_parameters/environment_parameters_external.dart b/packages/devtools_app/lib/src/shared/environment_parameters/environment_parameters_external.dart index 8bec9e34248..30cd68fb0f5 100644 --- a/packages/devtools_app/lib/src/shared/environment_parameters/environment_parameters_external.dart +++ b/packages/devtools_app/lib/src/shared/environment_parameters/environment_parameters_external.dart @@ -22,12 +22,11 @@ class ExternalDevToolsEnvironmentParameters GaLink issueTrackerLink({String? additionalInfo, String? issueTitle}) { return GaLink( display: _newDevToolsIssueUriDisplay, - url: - newDevToolsGitHubIssueUriLengthSafe( - additionalInfo: additionalInfo, - issueTitle: issueTitle, - environment: issueLinkDetails(), - ).toString(), + url: newDevToolsGitHubIssueUriLengthSafe( + additionalInfo: additionalInfo, + issueTitle: issueTitle, + environment: issueLinkDetails(), + ).toString(), gaScreenName: gac.devToolsMain, gaSelectedItemDescription: gac.feedbackLink, ); @@ -53,8 +52,8 @@ class ExternalDevToolsEnvironmentParameters @override InspectorServiceBase? inspectorServiceProvider() => serviceConnection.serviceManager.connectedApp!.isFlutterAppNow == true - ? InspectorService() - : null; + ? InspectorService() + : null; @override String get perfettoIndexLocation => diff --git a/packages/devtools_app/lib/src/shared/framework/app_error_handling.dart b/packages/devtools_app/lib/src/shared/framework/app_error_handling.dart index 418b78f7738..68ad3953e21 100644 --- a/packages/devtools_app/lib/src/shared/framework/app_error_handling.dart +++ b/packages/devtools_app/lib/src/shared/framework/app_error_handling.dart @@ -113,8 +113,9 @@ SingleMapping? _cachedJsSourceMapping; SingleMapping? _cachedWasmSourceMapping; Future _fetchSourceMapping() async { - final cachedSourceMapping = - kIsWasm ? _cachedWasmSourceMapping : _cachedJsSourceMapping; + final cachedSourceMapping = kIsWasm + ? _cachedWasmSourceMapping + : _cachedJsSourceMapping; return cachedSourceMapping ?? (await _initializeSourceMapping()); } @@ -141,10 +142,9 @@ Future _sourceMapStackTrace(StackTrace? stack) async { final mappedStackTrace = await _maybeMapStackTrace(originalStackTrace); // If mapping fails, revert back to the original stack trace: - final stackTrace = - mappedStackTrace.toString().isEmpty - ? originalStackTrace - : mappedStackTrace; + final stackTrace = mappedStackTrace.toString().isEmpty + ? originalStackTrace + : mappedStackTrace; return stack_trace.Trace.from(stackTrace); } diff --git a/packages/devtools_app/lib/src/shared/framework/screen.dart b/packages/devtools_app/lib/src/shared/framework/screen.dart index c13102ec25c..6defab658d6 100644 --- a/packages/devtools_app/lib/src/shared/framework/screen.dart +++ b/packages/devtools_app/lib/src/shared/framework/screen.dart @@ -391,13 +391,10 @@ abstract class Screen { DevToolsIcon( icon: icon, iconAsset: iconAsset, - size: - iconAsset != null - // Add 1.0 to adjust for margins on the screen icon assets. - ? scaleByFontFactor( - defaultIconSizeBeforeScaling + 1.0, - ) - : defaultIconSize, + size: iconAsset != null + // Add 1.0 to adjust for margins on the screen icon assets. + ? scaleByFontFactor(defaultIconSizeBeforeScaling + 1.0) + : defaultIconSize, ), if (title.isNotEmpty) Padding( @@ -487,10 +484,9 @@ abstract class Screen { _log.finest('for offline mode: returning ${screen.worksWithOfflineData}'); return ( show: screen.worksWithOfflineData, - disabledReason: - screen.worksWithOfflineData - ? null - : ScreenDisabledReason.offlineDataNotSupported, + disabledReason: screen.worksWithOfflineData + ? null + : ScreenDisabledReason.offlineDataNotSupported, ); } @@ -572,10 +568,9 @@ class BadgePainter extends CustomPainter { @override void paint(Canvas canvas, Size size) { - final paint = - Paint() - ..color = colorScheme.errorContainer - ..style = PaintingStyle.fill; + final paint = Paint() + ..color = colorScheme.errorContainer + ..style = PaintingStyle.fill; final countPainter = TextPainter( text: TextSpan( diff --git a/packages/devtools_app/lib/src/shared/framework/screen_controllers.dart b/packages/devtools_app/lib/src/shared/framework/screen_controllers.dart index e182f80a30d..427254c8bd5 100644 --- a/packages/devtools_app/lib/src/shared/framework/screen_controllers.dart +++ b/packages/devtools_app/lib/src/shared/framework/screen_controllers.dart @@ -56,10 +56,9 @@ class ScreenControllers { /// When DevTools is showing offline data, the offline screen controller will /// be returned. T lookup() { - final controllers = - offlineDataController.showingOfflineData.value - ? offlineControllers - : this.controllers; + final controllers = offlineDataController.showingOfflineData.value + ? offlineControllers + : this.controllers; assert(controllers.containsKey(T)); return controllers[T]!.controller as T; } @@ -94,10 +93,9 @@ class ScreenControllers { void Function(DevToolsScreenController screenController) callback, { bool includeOfflineControllers = false, }) { - final controllers = - includeOfflineControllers - ? [...this.controllers.values, ...offlineControllers.values] - : this.controllers.values; + final controllers = includeOfflineControllers + ? [...this.controllers.values, ...offlineControllers.values] + : this.controllers.values; for (final lazyController in controllers) { if (lazyController.initialized) { callback(lazyController.controller); @@ -115,10 +113,9 @@ class ScreenControllers { callback, { bool includeOfflineControllers = false, }) async { - final controllers = - includeOfflineControllers - ? [...this.controllers.values, ...offlineControllers.values] - : this.controllers.values; + final controllers = includeOfflineControllers + ? [...this.controllers.values, ...offlineControllers.values] + : this.controllers.values; Future helper( FutureOr Function(DevToolsScreenController) futureOr, diff --git a/packages/devtools_app/lib/src/shared/http/_http_exception.dart b/packages/devtools_app/lib/src/shared/http/_http_exception.dart index 8cde8848a5f..9dcb02941f8 100644 --- a/packages/devtools_app/lib/src/shared/http/_http_exception.dart +++ b/packages/devtools_app/lib/src/shared/http/_http_exception.dart @@ -11,10 +11,9 @@ class HttpException { @override String toString() { - final b = - StringBuffer() - ..write('HttpException: ') - ..write(message); + final b = StringBuffer() + ..write('HttpException: ') + ..write(message); if (uri != null) { b.write(', uri = $uri'); } diff --git a/packages/devtools_app/lib/src/shared/http/http_request_data.dart b/packages/devtools_app/lib/src/shared/http/http_request_data.dart index b417ce0bb17..7b6c505a6a2 100644 --- a/packages/devtools_app/lib/src/shared/http/http_request_data.dart +++ b/packages/devtools_app/lib/src/shared/http/http_request_data.dart @@ -56,15 +56,14 @@ class DartIOHttpRequestData extends NetworkRequest { modifiedRequestData.containsKey(HttpRequestDataKeys.requestBody.name) && modifiedRequestData.containsKey(HttpRequestDataKeys.responseBody.name); - final parsedRequest = - isFullRequest - ? HttpProfileRequest.parse(modifiedRequestData) - : HttpProfileRequestRef.parse(modifiedRequestData); + final parsedRequest = isFullRequest + ? HttpProfileRequest.parse(modifiedRequestData) + : HttpProfileRequestRef.parse(modifiedRequestData); - final responseBody = - responseContent?[HttpRequestDataKeys.text.name]?.toString(); - final requestBody = - requestPostData?[HttpRequestDataKeys.text.name]?.toString(); + final responseBody = responseContent?[HttpRequestDataKeys.text.name] + ?.toString(); + final requestBody = requestPostData?[HttpRequestDataKeys.text.name] + ?.toString(); return DartIOHttpRequestData( parsedRequest!, @@ -77,8 +76,8 @@ class DartIOHttpRequestData extends NetworkRequest { @override Map toJson() { return { - HttpRequestDataKeys.request.name: - (_request as HttpProfileRequest).toJson(), + HttpRequestDataKeys.request.name: (_request as HttpProfileRequest) + .toJson(), }; } @@ -222,8 +221,9 @@ class DartIOHttpRequestData extends NetworkRequest { /// All instant events logged to the timeline for this HTTP request. List get instantEvents { if (_instantEvents == null) { - _instantEvents = - _request.events.map((e) => DartIOHttpInstantEvent._(e)).toList(); + _instantEvents = _request.events + .map((e) => DartIOHttpInstantEvent._(e)) + .toList(); _recalculateInstantEventTimes(); } return _instantEvents!; @@ -236,10 +236,9 @@ class DartIOHttpRequestData extends NetworkRequest { requestCookies.isNotEmpty || responseCookies.isNotEmpty; /// A list of all cookies contained within the request headers. - List get requestCookies => - _hasError - ? [] - : DartIOHttpRequestData._parseCookies(_request.request?.cookies); + List get requestCookies => _hasError + ? [] + : DartIOHttpRequestData._parseCookies(_request.request?.cookies); /// A list of all cookies contained within the response headers. List get responseCookies => @@ -340,10 +339,9 @@ class DartIOHttpRequestData extends NetworkRequest { DateTime lastTime = _request.startTime; for (final instant in instantEvents) { final instantTime = instant.timestamp; - instant._timeRange = - TimeRange() - ..start = Duration(microseconds: lastTime.microsecondsSinceEpoch) - ..end = Duration(microseconds: instantTime.microsecondsSinceEpoch); + instant._timeRange = TimeRange() + ..start = Duration(microseconds: lastTime.microsecondsSinceEpoch) + ..end = Duration(microseconds: instantTime.microsecondsSinceEpoch); lastTime = instantTime; } } diff --git a/packages/devtools_app/lib/src/shared/managers/banner_messages.dart b/packages/devtools_app/lib/src/shared/managers/banner_messages.dart index 5d468e4e6db..c3fc64a5a86 100644 --- a/packages/devtools_app/lib/src/shared/managers/banner_messages.dart +++ b/packages/devtools_app/lib/src/shared/managers/banner_messages.dart @@ -256,8 +256,8 @@ class BannerMessage extends StatelessWidget { size: actionsIconSize, color: foregroundColor, ), - onPressed: - () => bannerMessages.removeMessage(this, dismiss: true), + onPressed: () => + bannerMessages.removeMessage(this, dismiss: true), ), ], ), @@ -333,24 +333,23 @@ class DebugModePerformanceMessage extends BannerWarning { DebugModePerformanceMessage({required super.screenId}) : super( key: Key('DebugModePerformanceMessage - $screenId'), - buildTextSpans: - (context) => [ - const TextSpan( - text: - 'You are running your app in debug mode. Debug mode performance ' - 'is not indicative of release performance, but you may use debug ' - 'mode to gain visibility into the work the system performs (e.g. ' - 'building widgets, calculating layouts, rasterizing scenes,' - ' etc.). For precise measurement of performance, relaunch your ' - 'application in ', - ), - _runInProfileModeTextSpan( - context, - screenId: screenId, - style: Theme.of(context).warningMessageLinkStyle, - ), - const TextSpan(text: '.'), - ], + buildTextSpans: (context) => [ + const TextSpan( + text: + 'You are running your app in debug mode. Debug mode performance ' + 'is not indicative of release performance, but you may use debug ' + 'mode to gain visibility into the work the system performs (e.g. ' + 'building widgets, calculating layouts, rasterizing scenes,' + ' etc.). For precise measurement of performance, relaunch your ' + 'application in ', + ), + _runInProfileModeTextSpan( + context, + screenId: screenId, + style: Theme.of(context).warningMessageLinkStyle, + ), + const TextSpan(text: '.'), + ], ); } @@ -415,28 +414,26 @@ class HighCpuSamplingRateMessage extends BannerWarning { HighCpuSamplingRateMessage({required super.screenId}) : super( key: generateKey(screenId), - buildTextSpans: - (context) => [ - const TextSpan( - text: ''' + buildTextSpans: (context) => [ + const TextSpan( + text: ''' You are opting in to a high CPU sampling rate. This may affect the performance of your application. Please read our ''', - ), - GaLinkTextSpan( - link: GaLink( - display: 'documentation', - url: _cpuSamplingRateDocsUrl, - gaScreenName: screenId, - gaSelectedItemDescription: - gac.CpuProfilerDocs.profileGranularityDocs.name, - ), - context: context, - style: Theme.of(context).warningMessageLinkStyle, - ), - const TextSpan( - text: - ' to understand the trade-offs associated with this setting.', - ), - ], + ), + GaLinkTextSpan( + link: GaLink( + display: 'documentation', + url: _cpuSamplingRateDocsUrl, + gaScreenName: screenId, + gaSelectedItemDescription: + gac.CpuProfilerDocs.profileGranularityDocs.name, + ), + context: context, + style: Theme.of(context).warningMessageLinkStyle, + ), + const TextSpan( + text: ' to understand the trade-offs associated with this setting.', + ), + ], ); static Key generateKey(String screenId) => @@ -447,37 +444,31 @@ class HttpLoggingEnabledMessage extends BannerWarning { HttpLoggingEnabledMessage({required super.screenId}) : super( key: _generateKey(screenId), - buildTextSpans: - (context) => [ - const TextSpan( - text: ''' + buildTextSpans: (context) => [ + const TextSpan( + text: ''' HTTP traffic is being logged for debugging purposes. This may result in increased memory usage for your app. If this is not intentional, consider ''', - ), - TextSpan( - text: 'disabling http logging', - style: Theme.of(context).warningMessageLinkStyle, - recognizer: - TapGestureRecognizer() - ..onTap = () async { - await http_service.toggleHttpRequestLogging(false).then( - (_) { - if (!http_service.httpLoggingEnabled) { - notificationService.push( - 'Http logging disabled.', - ); - bannerMessages.removeMessageByKey( - _generateKey(screenId), - screenId, - ); - } - }, - ); - }, - ), - const TextSpan( - text: ' before profiling the memory of your application.', - ), - ], + ), + TextSpan( + text: 'disabling http logging', + style: Theme.of(context).warningMessageLinkStyle, + recognizer: TapGestureRecognizer() + ..onTap = () async { + await http_service.toggleHttpRequestLogging(false).then((_) { + if (!http_service.httpLoggingEnabled) { + notificationService.push('Http logging disabled.'); + bannerMessages.removeMessageByKey( + _generateKey(screenId), + screenId, + ); + } + }); + }, + ), + const TextSpan( + text: ' before profiling the memory of your application.', + ), + ], ); static Key _generateKey(String screenId) => @@ -488,20 +479,19 @@ class DebugModeMemoryMessage extends BannerWarning { DebugModeMemoryMessage({required super.screenId}) : super( key: Key('DebugModeMemoryMessage - $screenId'), - buildTextSpans: - (context) => [ - const TextSpan( - text: ''' + buildTextSpans: (context) => [ + const TextSpan( + text: ''' You are running your app in debug mode. Absolute memory usage may be higher in a debug build than in a release build. For the most accurate absolute memory stats, relaunch your application in ''', - ), - _runInProfileModeTextSpan( - context, - screenId: screenId, - style: Theme.of(context).warningMessageLinkStyle, - ), - const TextSpan(text: '.'), - ], + ), + _runInProfileModeTextSpan( + context, + screenId: screenId, + style: Theme.of(context).warningMessageLinkStyle, + ), + const TextSpan(text: '.'), + ], ); } @@ -535,24 +525,23 @@ class WelcomeToNewInspectorMessage extends BannerInfo { WelcomeToNewInspectorMessage({required super.screenId}) : super( key: Key('WelcomeToNewInspectorMessage - $screenId'), - buildTextSpans: - (context) => [ - const TextSpan( - text: ''' + buildTextSpans: (context) => [ + const TextSpan( + text: ''' 👋 Welcome to the new Flutter inspector! To get started, check out the ''', - ), - GaLinkTextSpan( - link: GaLink( - display: 'documentation', - url: 'https://docs.flutter.dev/tools/devtools/inspector#new', - gaScreenName: screenId, - gaSelectedItemDescription: gac.inspectorV2Docs, - ), - context: context, - style: Theme.of(context).linkTextStyle, - ), - const TextSpan(text: '.'), - ], + ), + GaLinkTextSpan( + link: GaLink( + display: 'documentation', + url: 'https://docs.flutter.dev/tools/devtools/inspector#new', + gaScreenName: screenId, + gaSelectedItemDescription: gac.inspectorV2Docs, + ), + context: context, + style: Theme.of(context).linkTextStyle, + ), + const TextSpan(text: '.'), + ], ); } diff --git a/packages/devtools_app/lib/src/shared/managers/notifications.dart b/packages/devtools_app/lib/src/shared/managers/notifications.dart index 9046a64ef40..8c15cebf570 100644 --- a/packages/devtools_app/lib/src/shared/managers/notifications.dart +++ b/packages/devtools_app/lib/src/shared/managers/notifications.dart @@ -73,10 +73,9 @@ class NotificationService { if (reportExplanation != null) 'Explanation:\n$reportExplanation', if (stackTrace != null) 'Stack trace:\n$stackTrace', ]; - final additionalInfo = - additionalInfoParts.isNotEmpty - ? additionalInfoParts.join('\n\n') - : null; + final additionalInfo = additionalInfoParts.isNotEmpty + ? additionalInfoParts.join('\n\n') + : null; unawaited( launchUrlWithErrorHandling( devToolsEnvironmentParameters @@ -96,10 +95,9 @@ class NotificationService { isDismissible: isDismissible, actions: [if (isReportable) reportErrorAction], // Double the duration so that the user has time to report the error: - duration: - isReportable - ? NotificationMessage.defaultDuration * 2 - : NotificationMessage.defaultDuration, + duration: isReportable + ? NotificationMessage.defaultDuration * 2 + : NotificationMessage.defaultDuration, ), allowDuplicates: allowDuplicates, ); @@ -163,10 +161,9 @@ class NotificationAction extends StatelessWidget { final theme = Theme.of(context); return DevToolsButton( label: label, - color: - isPrimary - ? theme.colorScheme.onPrimary - : theme.colorScheme.onSecondaryContainer, + color: isPrimary + ? theme.colorScheme.onPrimary + : theme.colorScheme.onSecondaryContainer, elevated: isPrimary, outlined: !isPrimary, onPressed: onPressed, diff --git a/packages/devtools_app/lib/src/shared/managers/survey.dart b/packages/devtools_app/lib/src/shared/managers/survey.dart index d7554937e03..b275fa688f4 100644 --- a/packages/devtools_app/lib/src/shared/managers/survey.dart +++ b/packages/devtools_app/lib/src/shared/managers/survey.dart @@ -77,11 +77,10 @@ class SurveyService { ), NotificationAction( label: _takeSurveyLabel, - onPressed: - () => _takeSurveyPressed( - surveyUrl: _generateSurveyUrl(survey.url!), - message: message, - ), + onPressed: () => _takeSurveyPressed( + surveyUrl: _generateSurveyUrl(survey.url!), + message: message, + ), isPrimary: true, ), ]; @@ -173,18 +172,20 @@ class DevToolsSurvey { final endDateAsString = json[_endDateKey] as String?; final minVersionAsString = json[_minDevToolsVersionKey] as String?; - final startDate = - startDateAsString != null ? DateTime.parse(startDateAsString) : null; - final endDate = - endDateAsString != null ? DateTime.parse(endDateAsString) : null; + final startDate = startDateAsString != null + ? DateTime.parse(startDateAsString) + : null; + final endDate = endDateAsString != null + ? DateTime.parse(endDateAsString) + : null; final title = json[_titleKey] as String?; final surveyUrl = json[_urlKey] as String?; - final minDevToolsVersion = - minVersionAsString != null - ? SemanticVersion.parse(minVersionAsString) - : null; - final devEnvironments = - (json[_devEnvironmentsKey] as List?)?.cast().toList(); + final minDevToolsVersion = minVersionAsString != null + ? SemanticVersion.parse(minVersionAsString) + : null; + final devEnvironments = (json[_devEnvironmentsKey] as List?) + ?.cast() + .toList(); return DevToolsSurvey._( id, startDate, @@ -236,13 +237,12 @@ class DevToolsSurvey { } extension ShowSurveyExtension on DevToolsSurvey { - bool get meetsDateRequirement => - (startDate == null || endDate == null) - ? false - : Range( - startDate!.millisecondsSinceEpoch, - endDate!.millisecondsSinceEpoch, - ).contains(_currentClockTime().millisecondsSinceEpoch); + bool get meetsDateRequirement => (startDate == null || endDate == null) + ? false + : Range( + startDate!.millisecondsSinceEpoch, + endDate!.millisecondsSinceEpoch, + ).contains(_currentClockTime().millisecondsSinceEpoch); bool get meetsMinVersionRequirement => minDevToolsVersion == null || diff --git a/packages/devtools_app/lib/src/shared/memory/class_name.dart b/packages/devtools_app/lib/src/shared/memory/class_name.dart index f4233037f66..c1e9f7db2ce 100644 --- a/packages/devtools_app/lib/src/shared/memory/class_name.dart +++ b/packages/devtools_app/lib/src/shared/memory/class_name.dart @@ -168,8 +168,9 @@ class HeapClassName with Serializable { return false; } - late final shortName = - className == 'Context' && library == '' ? 'Closure Context' : className; + late final shortName = className == 'Context' && library == '' + ? 'Closure Context' + : className; ClassType? _cachedClassType; diff --git a/packages/devtools_app/lib/src/shared/memory/classes.dart b/packages/devtools_app/lib/src/shared/memory/classes.dart index a5b9778ddc0..c35e2914ac9 100644 --- a/packages/devtools_app/lib/src/shared/memory/classes.dart +++ b/packages/devtools_app/lib/src/shared/memory/classes.dart @@ -19,11 +19,10 @@ class ObjectSetStats { from ??= _empty; subtract ??= _empty; - final result = - ObjectSetStats() - ..instanceCount = from.instanceCount - subtract.instanceCount - ..shallowSize = from.shallowSize - subtract.shallowSize - ..retainedSize = from.retainedSize - subtract.retainedSize; + final result = ObjectSetStats() + ..instanceCount = from.instanceCount - subtract.instanceCount + ..shallowSize = from.shallowSize - subtract.shallowSize + ..retainedSize = from.retainedSize - subtract.retainedSize; if (result.isZero) return null; return result; @@ -205,14 +204,13 @@ class SingleClassData extends ClassData { required List? retainers, required List? retainedSizes, }) { - final path = - retainers == null - ? null - : PathFromRoot.forObject( - graph, - shortestRetainers: retainers, - index: index, - ); + final path = retainers == null + ? null + : PathFromRoot.forObject( + graph, + shortestRetainers: retainers, + index: index, + ); final excludeFromRetained = path != null && diff --git a/packages/devtools_app/lib/src/shared/memory/retainers.dart b/packages/devtools_app/lib/src/shared/memory/retainers.dart index f9a9ba72a55..e4110fd6055 100644 --- a/packages/devtools_app/lib/src/shared/memory/retainers.dart +++ b/packages/devtools_app/lib/src/shared/memory/retainers.dart @@ -13,20 +13,19 @@ typedef References = List Function(int index); /// Shallow size of the given object. typedef ShallowSize = int Function(int index); -typedef ShortestRetainersResult = - ({ - /// Retainer for each object in the graph. - /// - /// When a value at index i is 0, it means the object at index i - /// has no retainers. - /// Null is not used for no-retainer to save memory footprint. - List retainers, +typedef ShortestRetainersResult = ({ + /// Retainer for each object in the graph. + /// + /// When a value at index i is 0, it means the object at index i + /// has no retainers. + /// Null is not used for no-retainer to save memory footprint. + List retainers, - /// Retained size for each object in the graph. - /// - /// If an object is unreachable, its retained size is 0. - List? retainedSizes, - }); + /// Retained size for each object in the graph. + /// + /// If an object is unreachable, its retained size is 0. + List? retainedSizes, +}); /// Index of the sentinel object. const _sentinelIndex = 0; diff --git a/packages/devtools_app/lib/src/shared/preferences/_inspector_preferences.dart b/packages/devtools_app/lib/src/shared/preferences/_inspector_preferences.dart index 261af777c7b..440c2cc3d1b 100644 --- a/packages/devtools_app/lib/src/shared/preferences/_inspector_preferences.dart +++ b/packages/devtools_app/lib/src/shared/preferences/_inspector_preferences.dart @@ -283,8 +283,9 @@ class InspectorPreferencesController extends DisposableController // Set [_checkedFlutterPubRoot] to true to avoid an infinite loop on the // next call to [removePubRootDirectories]: _checkedFlutterPubRoot = true; - final flutterPubRootDirectories = - cachedDirectories.where(_isFlutterPubRoot).toList(); + final flutterPubRootDirectories = cachedDirectories + .where(_isFlutterPubRoot) + .toList(); await removePubRootDirectories(flutterPubRootDirectories); cachedDirectories.removeWhere(_isFlutterPubRoot); } @@ -299,9 +300,8 @@ class InspectorPreferencesController extends DisposableController /// directories are for the current project so we make a best guess based on /// the root library for the main isolate. Future _inferPubRootDirectory() async { - final fileUriString = - await serviceConnection.serviceManager - .mainIsolateRootLibraryUriAsString(); + final fileUriString = await serviceConnection.serviceManager + .mainIsolateRootLibraryUriAsString(); if (fileUriString == null) { return null; } @@ -324,10 +324,9 @@ class InspectorPreferencesController extends DisposableController pubRootDirectory ??= (parts..removeLast()).join('/'); // Make sure the root directory ends with /, otherwise we will patch with // other directories that start the same. - pubRootDirectory = - pubRootDirectory.endsWith('/') - ? pubRootDirectory - : '$pubRootDirectory/'; + pubRootDirectory = pubRootDirectory.endsWith('/') + ? pubRootDirectory + : '$pubRootDirectory/'; return pubRootDirectory; } @@ -383,10 +382,9 @@ class InspectorPreferencesController extends DisposableController Future _uncachePubRootDirectories( List pubRootDirectories, ) async { - final directoriesToCache = - (await readCachedPubRootDirectories()) - .where((dir) => !pubRootDirectories.contains(dir)) - .toList(); + final directoriesToCache = (await readCachedPubRootDirectories()) + .where((dir) => !pubRootDirectories.contains(dir)) + .toList(); await storage.setValue( _customPubRootStorageId(), jsonEncode(directoriesToCache), @@ -438,8 +436,8 @@ class InspectorPreferencesController extends DisposableController final localInspectorService = _inspectorService; if (localInspectorService is! InspectorService) return; - final freshPubRootDirectories = - await localInspectorService.getPubRootDirectories(); + final freshPubRootDirectories = await localInspectorService + .getPubRootDirectories(); if (freshPubRootDirectories != null) { final newSet = Set.of(freshPubRootDirectories); final oldSet = Set.of(_pubRootDirectories.value); diff --git a/packages/devtools_app/lib/src/shared/primitives/custom_pointer_scroll_view.dart b/packages/devtools_app/lib/src/shared/primitives/custom_pointer_scroll_view.dart index 634a98ff2bf..f1199350ec8 100644 --- a/packages/devtools_app/lib/src/shared/primitives/custom_pointer_scroll_view.dart +++ b/packages/devtools_app/lib/src/shared/primitives/custom_pointer_scroll_view.dart @@ -50,8 +50,9 @@ abstract class CustomPointerScrollView extends BoxScrollView { final List slivers = buildSlivers(context); final AxisDirection axisDirection = getDirection(context); - final ScrollController? scrollController = - _primary ? PrimaryScrollController.of(context) : controller; + final ScrollController? scrollController = _primary + ? PrimaryScrollController.of(context) + : controller; assert( scrollController != null, @@ -250,8 +251,8 @@ class CustomPointerScrollable extends StatefulWidget { /// Calling this method will create a dependency on the closest [Scrollable] /// in the [context], if there is one. static CustomPointerScrollableState? of(BuildContext context) { - final _ScrollableScope? widget = - context.dependOnInheritedWidgetOfExactType<_ScrollableScope>(); + final _ScrollableScope? widget = context + .dependOnInheritedWidgetOfExactType<_ScrollableScope>(); return widget?.scrollable; } @@ -429,22 +430,23 @@ class CustomPointerScrollableState extends State switch (widget.axis) { case Axis.vertical: _gestureRecognizers = { - VerticalDragGestureRecognizer: GestureRecognizerFactoryWithHandlers< - VerticalDragGestureRecognizer - >(() => VerticalDragGestureRecognizer(), ( - VerticalDragGestureRecognizer instance, - ) { - instance - ..onDown = _handleDragDown - ..onStart = _handleDragStart - ..onUpdate = _handleDragUpdate - ..onEnd = _handleDragEnd - ..onCancel = _handleDragCancel - ..minFlingDistance = _physics?.minFlingDistance - ..minFlingVelocity = _physics?.minFlingVelocity - ..maxFlingVelocity = _physics?.maxFlingVelocity - ..dragStartBehavior = widget.dragStartBehavior; - }), + VerticalDragGestureRecognizer: + GestureRecognizerFactoryWithHandlers< + VerticalDragGestureRecognizer + >(() => VerticalDragGestureRecognizer(), ( + VerticalDragGestureRecognizer instance, + ) { + instance + ..onDown = _handleDragDown + ..onStart = _handleDragStart + ..onUpdate = _handleDragUpdate + ..onEnd = _handleDragEnd + ..onCancel = _handleDragCancel + ..minFlingDistance = _physics?.minFlingDistance + ..minFlingVelocity = _physics?.minFlingVelocity + ..maxFlingVelocity = _physics?.maxFlingVelocity + ..dragStartBehavior = widget.dragStartBehavior; + }), }; break; case Axis.horizontal: @@ -558,10 +560,9 @@ class CustomPointerScrollableState extends State // Returns the offset that should result from applying [event] to the current // position, taking min/max scroll extent into account. double _targetScrollOffsetForPointerScroll(PointerScrollEvent event) { - double delta = - widget.axis == Axis.horizontal - ? event.scrollDelta.dx - : event.scrollDelta.dy; + double delta = widget.axis == Axis.horizontal + ? event.scrollDelta.dx + : event.scrollDelta.dy; if (axisDirectionIsReversed(widget.axisDirection)) { delta *= -1; diff --git a/packages/devtools_app/lib/src/shared/primitives/diagnostics_text_styles.dart b/packages/devtools_app/lib/src/shared/primitives/diagnostics_text_styles.dart index baac2c86683..c8aafc05600 100644 --- a/packages/devtools_app/lib/src/shared/primitives/diagnostics_text_styles.dart +++ b/packages/devtools_app/lib/src/shared/primitives/diagnostics_text_styles.dart @@ -20,8 +20,9 @@ class DiagnosticsTextStyles { ); static TextStyle warning(ColorScheme colorScheme) => TextStyle( - color: - colorScheme.isLight ? Colors.orange.shade900 : Colors.orange.shade400, + color: colorScheme.isLight + ? Colors.orange.shade900 + : Colors.orange.shade400, ); static TextStyle error(ColorScheme colorScheme) => diff --git a/packages/devtools_app/lib/src/shared/primitives/encoding.dart b/packages/devtools_app/lib/src/shared/primitives/encoding.dart index 4eda5174159..a787dd9a1e1 100644 --- a/packages/devtools_app/lib/src/shared/primitives/encoding.dart +++ b/packages/devtools_app/lib/src/shared/primitives/encoding.dart @@ -37,8 +37,9 @@ class HeapSnapshotGraphEncodeDecode extends EncodeDecode { if (value is HeapSnapshotGraph) return value; if (value is String) value = jsonDecode(value); value = value as List; - final chunks = - value.map((s) => ByteDataEncodeDecode.instance.decode(s)).toList(); + final chunks = value + .map((s) => ByteDataEncodeDecode.instance.decode(s)) + .toList(); return HeapSnapshotGraph.fromChunks(chunks); } } @@ -124,8 +125,8 @@ class ClassRefEncodeDecode extends EncodeDecode { Object? toEncodable(Object? value) { return switch (value) { null => null, - final HeapSnapshotGraph value => HeapSnapshotGraphEncodeDecode.instance - .toEncodable(value), + final HeapSnapshotGraph value => + HeapSnapshotGraphEncodeDecode.instance.toEncodable(value), final ByteData value => ByteDataEncodeDecode.instance.toEncodable(value), final DateTime value => DateTimeEncodeDecode.instance.toEncodable(value), final IsolateRef value => IsolateRefEncodeDecode.instance.toEncodable( diff --git a/packages/devtools_app/lib/src/shared/primitives/extent_delegate_list.dart b/packages/devtools_app/lib/src/shared/primitives/extent_delegate_list.dart index edbb9e9d0f6..2beaaf3a100 100644 --- a/packages/devtools_app/lib/src/shared/primitives/extent_delegate_list.dart +++ b/packages/devtools_app/lib/src/shared/primitives/extent_delegate_list.dart @@ -334,12 +334,9 @@ class RenderSliverExtentDelegateBoxAdaptor extends RenderSliverMultiBoxAdaptor { final firstIndex = _extentDelegate!.minChildIndexForScrollOffset( scrollOffset, ); - final targetLastIndex = - targetEndScrollOffset.isFinite - ? _extentDelegate!.maxChildIndexForScrollOffset( - targetEndScrollOffset, - ) - : null; + final targetLastIndex = targetEndScrollOffset.isFinite + ? _extentDelegate!.maxChildIndexForScrollOffset(targetEndScrollOffset) + : null; if (firstChild != null) { final leadingGarbage = _calculateLeadingGarbage(firstIndex); @@ -464,12 +461,11 @@ class RenderSliverExtentDelegateBoxAdaptor extends RenderSliverMultiBoxAdaptor { final targetEndScrollOffsetForPaint = constraints.scrollOffset + constraints.remainingPaintExtent; - final targetLastIndexForPaint = - targetEndScrollOffsetForPaint.isFinite - ? _extentDelegate!.maxChildIndexForScrollOffset( - targetEndScrollOffsetForPaint, - ) - : null; + final targetLastIndexForPaint = targetEndScrollOffsetForPaint.isFinite + ? _extentDelegate!.maxChildIndexForScrollOffset( + targetEndScrollOffsetForPaint, + ) + : null; assert(paintExtent <= estimatedMaxScrollOffset); geometry = SliverGeometry( scrollExtent: _extentDelegate!.layoutOffset(_extentDelegate!.length), diff --git a/packages/devtools_app/lib/src/shared/primitives/flutter_widgets/linked_scroll_controller.dart b/packages/devtools_app/lib/src/shared/primitives/flutter_widgets/linked_scroll_controller.dart index f493b9559dc..ad1412178b0 100644 --- a/packages/devtools_app/lib/src/shared/primitives/flutter_widgets/linked_scroll_controller.dart +++ b/packages/devtools_app/lib/src/shared/primitives/flutter_widgets/linked_scroll_controller.dart @@ -54,10 +54,9 @@ class LinkedScrollControllerGroup { /// Creates a new controller that is linked to any existing ones. ScrollController addAndGet() { - final initialScrollOffset = - _attachedControllers.isEmpty - ? 0.0 - : _attachedControllers.first.position.pixels; + final initialScrollOffset = _attachedControllers.isEmpty + ? 0.0 + : _attachedControllers.first.position.pixels; final controller = _LinkedScrollController( this, initialScrollOffset: initialScrollOffset, diff --git a/packages/devtools_app/lib/src/shared/primitives/trees.dart b/packages/devtools_app/lib/src/shared/primitives/trees.dart index d4cf8971a81..a86d9720849 100644 --- a/packages/devtools_app/lib/src/shared/primitives/trees.dart +++ b/packages/devtools_app/lib/src/shared/primitives/trees.dart @@ -314,8 +314,9 @@ abstract class TreeNode> { final matchingNode = depthFirstTraversal( root, returnCondition: matchingNodeCondition, - exploreChildrenCondition: - includeCollapsedNodes ? null : (T node) => node.isExpanded, + exploreChildrenCondition: includeCollapsedNodes + ? null + : (T node) => node.isExpanded, action: (T _) => index++, ); if (matchingNode != null) return index; diff --git a/packages/devtools_app/lib/src/shared/primitives/utils.dart b/packages/devtools_app/lib/src/shared/primitives/utils.dart index 45558fd8a10..b25709c84e2 100644 --- a/packages/devtools_app/lib/src/shared/primitives/utils.dart +++ b/packages/devtools_app/lib/src/shared/primitives/utils.dart @@ -216,8 +216,9 @@ String longestFittingSubstring( int i = 0; while (i < runes.length) { final rune = runes[i]; - final charWidth = - rune < 128 ? asciiMeasurements[rune] : slowMeasureFallback(rune); + final charWidth = rune < 128 + ? asciiMeasurements[rune] + : slowMeasureFallback(rune); if (currentWidth + charWidth > maxWidth) { break; } @@ -825,14 +826,13 @@ List textSpansFromAnsi(String input, TextStyle defaultStyle) { final styled = entry.bold || entry.fgColor != null || entry.bgColor != null; return TextSpan( text: entry.text, - style: - styled - ? TextStyle( - color: ansiToColor(entry.fgColor), - backgroundColor: ansiToColor(entry.bgColor), - fontWeight: entry.bold ? FontWeight.bold : FontWeight.normal, - ) - : defaultStyle, + style: styled + ? TextStyle( + color: ansiToColor(entry.fgColor), + backgroundColor: ansiToColor(entry.bgColor), + fontWeight: entry.bold ? FontWeight.bold : FontWeight.normal, + ) + : defaultStyle, ); }).toList(); } @@ -867,17 +867,17 @@ extension LogicalKeySetExtension on LogicalKeySet { String describeKeys({bool isMacOS = false}) { // Put the modifiers first. If it has a synonym, then it's something like // shiftLeft, altRight, etc. - final sortedKeys = - keys.toList()..sort((a, b) { - final aIsModifier = a.synonyms.isNotEmpty || _modifiers.contains(a); - final bIsModifier = b.synonyms.isNotEmpty || _modifiers.contains(b); - if (aIsModifier && !bIsModifier) { - return -1; - } else if (bIsModifier && !aIsModifier) { - return 1; - } - return a.keyLabel.compareTo(b.keyLabel); - }); + final sortedKeys = keys.toList() + ..sort((a, b) { + final aIsModifier = a.synonyms.isNotEmpty || _modifiers.contains(a); + final bIsModifier = b.synonyms.isNotEmpty || _modifiers.contains(b); + if (aIsModifier && !bIsModifier) { + return -1; + } else if (bIsModifier && !aIsModifier) { + return 1; + } + return a.keyLabel.compareTo(b.keyLabel); + }); return sortedKeys.map((key) { if (_modifiers.contains(key)) { diff --git a/packages/devtools_app/lib/src/shared/server/server.dart b/packages/devtools_app/lib/src/shared/server/server.dart index 900018594d1..260f757468e 100644 --- a/packages/devtools_app/lib/src/shared/server/server.dart +++ b/packages/devtools_app/lib/src/shared/server/server.dart @@ -117,8 +117,9 @@ Future notifyForVmServiceConnection({ DevToolsJsonFile _devToolsJsonFileFromResponse(Response resp, String filePath) { final data = json.decode(resp.body) as Map; final lastModified = data['lastModifiedTime']; - final lastModifiedTime = - lastModified != null ? DateTime.parse(lastModified) : DateTime.now(); + final lastModifiedTime = lastModified != null + ? DateTime.parse(lastModified) + : DateTime.now(); return DevToolsJsonFile( name: filePath, lastModifiedTime: lastModifiedTime, diff --git a/packages/devtools_app/lib/src/shared/server/server_api_client.dart b/packages/devtools_app/lib/src/shared/server/server_api_client.dart index edc271c8480..8406975ee00 100644 --- a/packages/devtools_app/lib/src/shared/server/server_api_client.dart +++ b/packages/devtools_app/lib/src/shared/server/server_api_client.dart @@ -41,10 +41,9 @@ class DevToolsServerConnection { /// /// - http://foo/devtools => http://foo/devtools/api @visibleForTesting - static Uri apiUriFor(Uri baseUri) => - baseUri.path.endsWith('devtools') - ? baseUri.resolve('devtools/api/') - : baseUri.resolve('api/'); + static Uri apiUriFor(Uri baseUri) => baseUri.path.endsWith('devtools') + ? baseUri.resolve('devtools/api/') + : baseUri.resolve('api/'); /// Connects to the legacy SSE API. /// diff --git a/packages/devtools_app/lib/src/shared/table/_flat_table.dart b/packages/devtools_app/lib/src/shared/table/_flat_table.dart index d5fc89bc3b8..c6fa4a85207 100644 --- a/packages/devtools_app/lib/src/shared/table/_flat_table.dart +++ b/packages/devtools_app/lib/src/shared/table/_flat_table.dart @@ -36,12 +36,11 @@ class SearchableFlatTable extends FlatTable { }) : super( searchMatchesNotifier: searchController.searchMatches, activeSearchMatchNotifier: searchController.activeSearchMatch, - onDataSorted: - () => WidgetsBinding.instance.addPostFrameCallback((_) { - // This needs to be in a post frame callback so that the search - // matches are not updated in the middle of a table build. - searchController.refreshSearchMatches(); - }), + onDataSorted: () => WidgetsBinding.instance.addPostFrameCallback((_) { + // This needs to be in a post frame callback so that the search + // matches are not updated in the middle of a table build. + searchController.refreshSearchMatches(); + }), ); } @@ -308,12 +307,9 @@ class FlatTableState extends State> with AutoDisposeMixin { ); if (widget.sizeColumnsToFit || tableController.columnWidths == null) { return LayoutBuilder( - builder: - (context, constraints) => buildTable( - tableController.computeColumnWidthsSizeToFit( - constraints.maxWidth, - ), - ), + builder: (context, constraints) => buildTable( + tableController.computeColumnWidthsSizeToFit(constraints.maxWidth), + ), ); } return buildTable(tableController.columnWidths!); diff --git a/packages/devtools_app/lib/src/shared/table/_table_column.dart b/packages/devtools_app/lib/src/shared/table/_table_column.dart index ddf612baa75..4506902859a 100644 --- a/packages/devtools_app/lib/src/shared/table/_table_column.dart +++ b/packages/devtools_app/lib/src/shared/table/_table_column.dart @@ -81,30 +81,28 @@ class _ColumnHeader extends StatelessWidget { const SizedBox(width: densePadding), ], Expanded( - child: - column.titleTooltip != null - ? DevToolsTooltip( - message: column.titleTooltip, - padding: const EdgeInsets.all(denseSpacing), - child: title, - ) - : title, + child: column.titleTooltip != null + ? DevToolsTooltip( + message: column.titleTooltip, + padding: const EdgeInsets.all(denseSpacing), + child: title, + ) + : title, ), ], ); return column.includeHeader ? InkWell( - canRequestFocus: false, - onTap: - column.supportsSorting - ? () => _handleSortChange( + canRequestFocus: false, + onTap: column.supportsSorting + ? () => _handleSortChange( column, secondarySortColumn: secondarySortColumn, ) - : null, - child: headerContent, - ) + : null, + child: headerContent, + ) : headerContent; } diff --git a/packages/devtools_app/lib/src/shared/table/_table_row.dart b/packages/devtools_app/lib/src/shared/table/_table_row.dart index 02dbfe3e998..100a7ddc8a4 100644 --- a/packages/devtools_app/lib/src/shared/table/_table_row.dart +++ b/packages/devtools_app/lib/src/shared/table/_table_row.dart @@ -275,22 +275,20 @@ class _TableRowState extends State> final row = tableRowFor(context, onPressed: onPressed); final box = SizedBox( - height: - widget._rowType == _TableRowType.data - ? defaultRowHeight - : defaultHeaderHeight + - (widget.tall ? scaleByFontFactor(densePadding) : 0.0), + height: widget._rowType == _TableRowType.data + ? defaultRowHeight + : defaultHeaderHeight + + (widget.tall ? scaleByFontFactor(densePadding) : 0.0), child: Material( color: _searchAwareBackgroundColor(), - child: - onPressed != null - ? InkWell( - canRequestFocus: false, - key: contentKey, - onTap: onPressed, - child: row, - ) - : row, + child: onPressed != null + ? InkWell( + canRequestFocus: false, + key: contentKey, + onTap: onPressed, + child: row, + ) + : row, ), ); return box; @@ -338,15 +336,14 @@ class _TableRowState extends State> if (widget.isSelected) { return colorScheme.selectedRowBackgroundColor; } - final searchAwareBackgroundColor = - isSearchMatch - ? Color.alphaBlend( - isActiveSearchMatch - ? activeSearchMatchColorOpaque - : searchMatchColorOpaque, - backgroundColor, - ) - : backgroundColor; + final searchAwareBackgroundColor = isSearchMatch + ? Color.alphaBlend( + isActiveSearchMatch + ? activeSearchMatchColorOpaque + : searchMatchColorOpaque, + backgroundColor, + ) + : backgroundColor; return searchAwareBackgroundColor; } @@ -481,25 +478,27 @@ class _TableRowState extends State> } if (column == widget.expandableColumn) { - final expandIndicator = - widget.isExpandable - ? ValueListenableBuilder( - valueListenable: expandController, - builder: (context, _, _) { - return RotationTransition( - turns: expandArrowAnimation, - child: Icon( - Icons.expand_more, - color: theme.colorScheme.onSurface, - size: defaultIconSize, - ), - ); - }, - ) - : SizedBox(width: defaultIconSize, height: defaultIconSize); + final expandIndicator = widget.isExpandable + ? ValueListenableBuilder( + valueListenable: expandController, + builder: (context, _, _) { + return RotationTransition( + turns: expandArrowAnimation, + child: Icon( + Icons.expand_more, + color: theme.colorScheme.onSurface, + size: defaultIconSize, + ), + ); + }, + ) + : SizedBox(width: defaultIconSize, height: defaultIconSize); content = Row( mainAxisSize: MainAxisSize.min, - children: [expandIndicator, Expanded(child: content)], + children: [ + expandIndicator, + Expanded(child: content), + ], ); } content = Padding( diff --git a/packages/devtools_app/lib/src/shared/table/_tree_table.dart b/packages/devtools_app/lib/src/shared/table/_tree_table.dart index 2420e80b435..4bc64ef0880 100644 --- a/packages/devtools_app/lib/src/shared/table/_tree_table.dart +++ b/packages/devtools_app/lib/src/shared/table/_tree_table.dart @@ -408,10 +408,9 @@ class TreeTableState> extends State> newSelectedNodeIndex = max(selectedNodeIndex! - 1, 0); break; case TreeTableScrollKind.parent: - newSelectedNodeIndex = - selectionValue.node!.parent != null - ? max(_data.indexOf(selectionValue.node!.parent!), 0) - : 0; + newSelectedNodeIndex = selectionValue.node!.parent != null + ? max(_data.indexOf(selectionValue.node!.parent!), 0) + : 0; break; } diff --git a/packages/devtools_app/lib/src/shared/table/column_widths.dart b/packages/devtools_app/lib/src/shared/table/column_widths.dart index c7cb2cdaede..3d9d7fe839e 100644 --- a/packages/devtools_app/lib/src/shared/table/column_widths.dart +++ b/packages/devtools_app/lib/src/shared/table/column_widths.dart @@ -58,15 +58,15 @@ extension FlatColumnWidthExtension on FlatTableController { maxWidth = max(0, maxWidth); double available = maxWidth; // Columns sorted by increasing minWidth. - final sortedColumns = - columns.toList()..sort((a, b) { - if (a.minWidthPx != null && b.minWidthPx != null) { - return a.minWidthPx!.compareTo(b.minWidthPx!); - } - if (a.minWidthPx != null) return -1; - if (b.minWidthPx != null) return 1; - return 0; - }); + final sortedColumns = columns.toList() + ..sort((a, b) { + if (a.minWidthPx != null && b.minWidthPx != null) { + return a.minWidthPx!.compareTo(b.minWidthPx!); + } + if (a.minWidthPx != null) return -1; + if (b.minWidthPx != null) return 1; + return 0; + }); for (final col in columns) { if (col.fixedWidthPx != null) { @@ -112,8 +112,9 @@ extension FlatColumnWidthExtension on FlatTableController { } } } - final unconstrainedWidth = - unconstrainedCount > 0 ? available / unconstrainedCount : available; + final unconstrainedWidth = unconstrainedCount > 0 + ? available / unconstrainedCount + : available; int unconstrainedFound = 0; final widths = []; for (final column in columns) { diff --git a/packages/devtools_app/lib/src/shared/table/table.dart b/packages/devtools_app/lib/src/shared/table/table.dart index 676fe64e106..bcf54fc7204 100644 --- a/packages/devtools_app/lib/src/shared/table/table.dart +++ b/packages/devtools_app/lib/src/shared/table/table.dart @@ -136,10 +136,9 @@ class DevToolsTableState extends State> _linkedHorizontalScrollControllerGroup = LinkedScrollControllerGroup(); - final initialScrollOffset = - widget.preserveVerticalScrollPosition - ? widget.tableController.tableUiState.scrollOffset - : 0.0; + final initialScrollOffset = widget.preserveVerticalScrollPosition + ? widget.tableController.tableUiState.scrollOffset + : 0.0; widget.tableController.initScrollController(initialScrollOffset); scrollController = widget.tableController.verticalScrollController!; @@ -197,10 +196,9 @@ class DevToolsTableState extends State> final nodeIndex = selection.nodeIndex; if (selection.scrollIntoView && node != null) { - final selectedDisplayRow = - nodeIndexCalculator != null - ? nodeIndexCalculator(node)! - : nodeIndex!; + final selectedDisplayRow = nodeIndexCalculator != null + ? nodeIndexCalculator(node)! + : nodeIndex!; final newPos = selectedDisplayRow * defaultRowHeight; @@ -460,9 +458,8 @@ class DevToolsTableState extends State> controller: pinnedScrollController, itemCount: pinnedData.length, itemExtent: widget.rowItemExtent, - itemBuilder: - (context, index) => - _buildItem(context, index, isPinned: true), + itemBuilder: (context, index) => + _buildItem(context, index, isPinned: true), ), ), ), @@ -477,15 +474,13 @@ class DevToolsTableState extends State> onTapDown: (a) => widget.focusNode?.requestFocus(), child: Focus( autofocus: true, - onKeyEvent: - (_, event) => - widget.handleKeyEvent != null - ? widget.handleKeyEvent!( - event, - scrollController, - constraints, - ) - : KeyEventResult.ignored, + onKeyEvent: (_, event) => widget.handleKeyEvent != null + ? widget.handleKeyEvent!( + event, + scrollController, + constraints, + ) + : KeyEventResult.ignored, focusNode: widget.focusNode, child: ListView.builder( controller: scrollController, diff --git a/packages/devtools_app/lib/src/shared/table/table_data.dart b/packages/devtools_app/lib/src/shared/table/table_data.dart index d3b7d966f0d..6f138be7323 100644 --- a/packages/devtools_app/lib/src/shared/table/table_data.dart +++ b/packages/devtools_app/lib/src/shared/table/table_data.dart @@ -237,10 +237,9 @@ abstract class TimeAndPercentageColumn extends ColumnData { } @override - double getValue(T dataObject) => - percentageOnly - ? percentAsDoubleProvider(dataObject) - : timeProvider!(dataObject).inMicroseconds.toDouble(); + double getValue(T dataObject) => percentageOnly + ? percentAsDoubleProvider(dataObject) + : timeProvider!(dataObject).inMicroseconds.toDouble(); @override String getDisplayValue(T dataObject) { @@ -319,10 +318,9 @@ abstract class SizeAndPercentageColumn extends ColumnData { } @override - double getValue(T dataObject) => - percentageOnly - ? percentAsDoubleProvider(dataObject) - : sizeProvider!(dataObject).toDouble(); + double getValue(T dataObject) => percentageOnly + ? percentAsDoubleProvider(dataObject) + : sizeProvider!(dataObject).toDouble(); @override String getDisplayValue(T dataObject) { diff --git a/packages/devtools_app/lib/src/shared/title.dart b/packages/devtools_app/lib/src/shared/title.dart index cb49f13ee1c..f40af0065d9 100644 --- a/packages/devtools_app/lib/src/shared/title.dart +++ b/packages/devtools_app/lib/src/shared/title.dart @@ -13,8 +13,8 @@ void generateDevToolsTitle() { } _devToolsTitle.value = serviceConnection.serviceManager.connectedApp!.isFlutterAppNow! - ? 'Flutter DevTools' - : 'Dart DevTools'; + ? 'Flutter DevTools' + : 'Dart DevTools'; } ValueListenable get devToolsTitle => _devToolsTitle; diff --git a/packages/devtools_app/lib/src/shared/ui/common_widgets.dart b/packages/devtools_app/lib/src/shared/ui/common_widgets.dart index 6e62539a07d..f043571983f 100644 --- a/packages/devtools_app/lib/src/shared/ui/common_widgets.dart +++ b/packages/devtools_app/lib/src/shared/ui/common_widgets.dart @@ -44,10 +44,9 @@ TextStyle semibold(TextStyle style) => TextStyle primaryColor(TextStyle style, BuildContext context) { final theme = Theme.of(context); return style.copyWith( - color: - (theme.brightness == Brightness.light) - ? theme.primaryColor - : theme.colorScheme.secondary, + color: (theme.brightness == Brightness.light) + ? theme.primaryColor + : theme.colorScheme.secondary, fontWeight: FontWeight.w400, ); } @@ -80,13 +79,12 @@ class GaDevToolsButton extends DevToolsButton { super.outlined, super.tooltipPadding, }) : super( - onPressed: - onPressed != null - ? () { - ga.select(gaScreen, gaSelection); - onPressed(); - } - : null, + onPressed: onPressed != null + ? () { + ga.select(gaScreen, gaSelection); + onPressed(); + } + : null, ); factory GaDevToolsButton.iconOnly({ @@ -974,8 +972,9 @@ class Breadcrumb extends StatelessWidget { textDirection: TextDirection.ltr, )..layout(); - final caretWidth = - isRoot ? Breadcrumb.caretWidth : Breadcrumb.caretWidth * 2; + final caretWidth = isRoot + ? Breadcrumb.caretWidth + : Breadcrumb.caretWidth * 2; final breadcrumbWidth = textPainter.width + caretWidth + densePadding * 2; return InkWell( @@ -1032,8 +1031,9 @@ class _BreadcrumbPainter extends CustomPainter { canvas.drawPath(path, paint); - final textXOffset = - isRoot ? densePadding : Breadcrumb.caretWidth + densePadding; + final textXOffset = isRoot + ? densePadding + : Breadcrumb.caretWidth + densePadding; textPainter.paint( canvas, Offset(textXOffset, (Breadcrumb.height - textPainter.height) / 2), @@ -1427,20 +1427,19 @@ class CopyToClipboardControl extends StatelessWidget { @override Widget build(BuildContext context) { - final onPressed = - dataProvider == null - ? null - : () { - if (gaScreen != null && gaItem != null) { - ga.select(gaScreen!, gaItem!); - } - unawaited( - copyToClipboard( - dataProvider!() ?? '', - successMessage: successMessage, - ), - ); - }; + final onPressed = dataProvider == null + ? null + : () { + if (gaScreen != null && gaItem != null) { + ga.select(gaScreen!, gaItem!); + } + unawaited( + copyToClipboard( + dataProvider!() ?? '', + successMessage: successMessage, + ), + ); + }; final size = this.size ?? defaultIconSize; return SizedBox( height: size, @@ -1834,8 +1833,9 @@ class _BlinkingIconState extends State { duration: const Duration(seconds: 1), firstChild: _icon(), secondChild: _icon(color: widget.color), - crossFadeState: - showFirst ? CrossFadeState.showFirst : CrossFadeState.showSecond, + crossFadeState: showFirst + ? CrossFadeState.showFirst + : CrossFadeState.showSecond, ); } @@ -2144,30 +2144,27 @@ class ContextMenuButton extends StatelessWidget { Widget build(BuildContext context) { return MenuAnchor( menuChildren: menuChildren, - builder: ( - BuildContext context, - MenuController controller, - Widget? child, - ) { - return SizedBox( - width: buttonWidth, - child: ToolbarAction( - icon: icon, - size: iconSize, - color: color, - onPressed: () { - if (gaScreen != null && gaItem != null) { - ga.select(gaScreen!, gaItem!); - } - if (controller.isOpen) { - controller.close(); - } else { - controller.open(); - } - }, - ), - ); - }, + builder: + (BuildContext context, MenuController controller, Widget? child) { + return SizedBox( + width: buttonWidth, + child: ToolbarAction( + icon: icon, + size: iconSize, + color: color, + onPressed: () { + if (gaScreen != null && gaItem != null) { + ga.select(gaScreen!, gaItem!); + } + if (controller.isOpen) { + controller.close(); + } else { + controller.open(); + } + }, + ), + ); + }, ); } } @@ -2208,8 +2205,8 @@ class _PositiveIntegerSettingState extends State () => _textEditingController.text = widget.notifier.value.toString(), ); - _textEditingController = - TextEditingController()..text = widget.notifier.value.toString(); + _textEditingController = TextEditingController() + ..text = widget.notifier.value.toString(); } @override @@ -2317,11 +2314,11 @@ class DevToolsOverlay extends StatelessWidget { return fullScreen ? overlayContent : Center( - child: Padding( - padding: EdgeInsets.only(top: topOffset ?? 0.0), - child: RoundedOutlinedBorder(clip: true, child: overlayContent), - ), - ); + child: Padding( + padding: EdgeInsets.only(top: topOffset ?? 0.0), + child: RoundedOutlinedBorder(clip: true, child: overlayContent), + ), + ); } double _overlayWidth(Size parentSize) { diff --git a/packages/devtools_app/lib/src/shared/ui/dialogs.dart b/packages/devtools_app/lib/src/shared/ui/dialogs.dart index bf8aff856a2..d87c7ff18d2 100644 --- a/packages/devtools_app/lib/src/shared/ui/dialogs.dart +++ b/packages/devtools_app/lib/src/shared/ui/dialogs.dart @@ -27,24 +27,22 @@ class UnexpectedErrorDialog extends StatelessWidget { actions: [ DialogTextButton( child: const Text('Copy details'), - onPressed: - () => unawaited( - copyToClipboard( - additionalInfo, - successMessage: 'Error details copied to clipboard', - ), - ), + onPressed: () => unawaited( + copyToClipboard( + additionalInfo, + successMessage: 'Error details copied to clipboard', + ), + ), ), DialogTextButton( child: const Text('Create issue'), - onPressed: - () => unawaited( - launchUrlWithErrorHandling( - devToolsEnvironmentParameters - .issueTrackerLink(additionalInfo: additionalInfo) - .url, - ), - ), + onPressed: () => unawaited( + launchUrlWithErrorHandling( + devToolsEnvironmentParameters + .issueTrackerLink(additionalInfo: additionalInfo) + .url, + ), + ), ), const DialogCloseButton(), ], diff --git a/packages/devtools_app/lib/src/shared/ui/drop_down_button.dart b/packages/devtools_app/lib/src/shared/ui/drop_down_button.dart index a6a57e41369..1fcfd0bea65 100644 --- a/packages/devtools_app/lib/src/shared/ui/drop_down_button.dart +++ b/packages/devtools_app/lib/src/shared/ui/drop_down_button.dart @@ -74,8 +74,9 @@ class AnalyticsDropDownButton extends StatelessWidget { void _onChanged(T? newValue) { if (sendAnalytics && items != null) { - final gaId = - items?.firstWhereOrNull((element) => element.item == newValue)?.gaId; + final gaId = items + ?.firstWhereOrNull((element) => element.item == newValue) + ?.gaId; if (gaId != null) { ga.select(gaScreen, '$gaDropDownId $gaId'); } diff --git a/packages/devtools_app/lib/src/shared/ui/editable_list.dart b/packages/devtools_app/lib/src/shared/ui/editable_list.dart index aff345a1704..3608d46418a 100644 --- a/packages/devtools_app/lib/src/shared/ui/editable_list.dart +++ b/packages/devtools_app/lib/src/shared/ui/editable_list.dart @@ -179,19 +179,19 @@ class EditableListActionBar extends StatelessWidget { const SizedBox(width: densePadding), isRefreshing?.value ?? false ? SizedBox( - width: defaultTextFieldHeight, - height: defaultTextFieldHeight, - child: const Padding( - padding: EdgeInsets.all(densePadding), - child: CircularProgressIndicator(), - ), - ) + width: defaultTextFieldHeight, + height: defaultTextFieldHeight, + child: const Padding( + padding: EdgeInsets.all(densePadding), + child: CircularProgressIndicator(), + ), + ) : RefreshButton( - gaScreen: gaScreen, - gaSelection: gaRefreshSelection, - onPressed: onRefresh, - minScreenWidthForTextBeforeScaling: double.maxFinite, - ), + gaScreen: gaScreen, + gaSelection: gaRefreshSelection, + onPressed: onRefresh, + minScreenWidthForTextBeforeScaling: double.maxFinite, + ), ], ), ); diff --git a/packages/devtools_app/lib/src/shared/ui/file_import.dart b/packages/devtools_app/lib/src/shared/ui/file_import.dart index 761107aee7d..361461d6926 100644 --- a/packages/devtools_app/lib/src/shared/ui/file_import.dart +++ b/packages/devtools_app/lib/src/shared/ui/file_import.dart @@ -84,27 +84,26 @@ class OpenSaveButtonGroup extends StatelessWidget { ), child: saveFormats.length == 1 && - saveFormats.first == SaveFormat.devtools - ? _SimpleOpenSaveButton( - icon: Icons.file_download, - tooltip: 'Save this screen\'s data for offline viewing', - roundedLeftBorder: false, - roundedRightBorder: true, - onPressed: - onSave != null - ? () { - ga.select(screenId, gac.saveFile); - onSave!.call(SaveFormat.devtools); - } - : null, - ) - : _DropdownSaveButton( - screenId: screenId, - onSave: onSave, - saveFormats: saveFormats, - gaItemForSaveFormatSelection: - gaItemForSaveFormatSelection, - ), + saveFormats.first == SaveFormat.devtools + ? _SimpleOpenSaveButton( + icon: Icons.file_download, + tooltip: 'Save this screen\'s data for offline viewing', + roundedLeftBorder: false, + roundedRightBorder: true, + onPressed: onSave != null + ? () { + ga.select(screenId, gac.saveFile); + onSave!.call(SaveFormat.devtools); + } + : null, + ) + : _DropdownSaveButton( + screenId: screenId, + onSave: onSave, + saveFormats: saveFormats, + gaItemForSaveFormatSelection: + gaItemForSaveFormatSelection, + ), ), ], ), @@ -204,15 +203,14 @@ class __DropdownSaveButtonState extends State<_DropdownSaveButton> { ) .toList(); }, - items: - widget.saveFormats - .map( - (f) => DropdownMenuItem( - value: f, - child: Text(f.display), - ), - ) - .toList(), + items: widget.saveFormats + .map( + (f) => DropdownMenuItem( + value: f, + child: Text(f.display), + ), + ) + .toList(), ), ); } @@ -373,10 +371,9 @@ class _FileImportContainerState extends State { gaSelection: widget.gaSelectionAction!, label: widget.actionText!, elevated: true, - onPressed: - importedFile != null - ? () => widget.onAction!(importedFile!) - : null, + onPressed: importedFile != null + ? () => widget.onAction!(importedFile!) + : null, ), ], ), @@ -600,14 +597,13 @@ class _DualFileImportContainerState extends State { label: widget.actionText, icon: Icons.highlight, elevated: true, - onPressed: - firstImportedFile != null && secondImportedFile != null - ? () => widget.onAction( - firstImportedFile!, - secondImportedFile!, - (error) => notificationService.push(error), - ) - : null, + onPressed: firstImportedFile != null && secondImportedFile != null + ? () => widget.onAction( + firstImportedFile!, + secondImportedFile!, + (error) => notificationService.push(error), + ) + : null, ), ], ), diff --git a/packages/devtools_app/lib/src/shared/ui/filter.dart b/packages/devtools_app/lib/src/shared/ui/filter.dart index 47e4190dc9e..78d0aa5e8ad 100644 --- a/packages/devtools_app/lib/src/shared/ui/filter.dart +++ b/packages/devtools_app/lib/src/shared/ui/filter.dart @@ -51,14 +51,13 @@ mixin FilterControllerMixin on DisposableController void setActiveFilter({String? query, SettingFilters? settingFilters}) { _activeFilter.value = Filter( - queryFilter: - query != null - ? QueryFilter.parse( - query, - args: queryFilterArgs, - useRegExp: useRegExp.value, - ) - : QueryFilter.empty(args: queryFilterArgs), + queryFilter: query != null + ? QueryFilter.parse( + query, + args: queryFilterArgs, + useRegExp: useRegExp.value, + ) + : QueryFilter.empty(args: queryFilterArgs), settingFilters: settingFilters ?? this.settingFilters, ); } @@ -127,8 +126,9 @@ mixin FilterControllerMixin on DisposableController final filter = _activeFilter.value; return FilterTag( query: filter.queryFilter.query, - settingFilterValues: - settingFilters.map((filter) => filter.valueAsJson).toList(), + settingFilterValues: settingFilters + .map((filter) => filter.valueAsJson) + .toList(), useRegExp: useRegExp.value, ).tag; } @@ -492,12 +492,11 @@ class QueryFilter { for (final arg in args.values.where((arg) => arg.matchesKey(part))) { arg ..isNegative = part.startsWith(QueryFilterArgument.negativePrefix) - ..values = - useRegExp - ? valueStrings - .map((v) => RegExp(v, caseSensitive: false)) - .toList() - : valueStrings; + ..values = useRegExp + ? valueStrings + .map((v) => RegExp(v, caseSensitive: false)) + .toList() + : valueStrings; } } else { substringExpressions.add( @@ -530,13 +529,12 @@ class QueryFilter { final bool isEmpty; - String get query => - isEmpty - ? '' - : [ - ...substringExpressions.toStringList(), - for (final arg in filterArguments) arg.display, - ].join(' ').trim(); + String get query => isEmpty + ? '' + : [ + ...substringExpressions.toStringList(), + for (final arg in filterArguments) arg.display, + ].join(' ').trim(); } class QueryFilterArgument { @@ -590,10 +588,9 @@ class QueryFilterArgument { var matches = false; for (final value in values) { - matches = - substringMatch - ? dataValue.caseInsensitiveContains(value) - : dataValue.caseInsensitiveEquals(value); + matches = substringMatch + ? dataValue.caseInsensitiveContains(value) + : dataValue.caseInsensitiveEquals(value); if (matches) break; } return isNegative ? !matches : matches; @@ -663,37 +660,34 @@ class _StandaloneFilterFieldState extends State> autofocus: true, hintText: 'Filter', controller: queryTextFieldController, - prefixIcon: - widget.controller.settingFilters.isNotEmpty - ? Container( - height: inputDecorationElementHeight, - padding: const EdgeInsets.only( - left: densePadding, - right: denseSpacing, - ), - child: ValueListenableBuilder( - valueListenable: widget.controller.activeFilter, - builder: (context, _, _) { - return DevToolsFilterButton( - message: 'More filters', - onPressed: () { - unawaited( - showDialog( - context: context, - builder: - (context) => FilterDialog( - controller: widget.controller, - ), + prefixIcon: widget.controller.settingFilters.isNotEmpty + ? Container( + height: inputDecorationElementHeight, + padding: const EdgeInsets.only( + left: densePadding, + right: denseSpacing, + ), + child: ValueListenableBuilder( + valueListenable: widget.controller.activeFilter, + builder: (context, _, _) { + return DevToolsFilterButton( + message: 'More filters', + onPressed: () { + unawaited( + showDialog( + context: context, + builder: (context) => FilterDialog( + controller: widget.controller, ), - ); - }, - isFilterActive: - widget.controller.isFilterActive, - ); - }, - ), - ) - : null, + ), + ); + }, + isFilterActive: widget.controller.isFilterActive, + ); + }, + ), + ) + : null, additionalSuffixActions: [ if (widget.controller.queryFilterArgs.isNotEmpty) InputDecorationSuffixButton.help( @@ -819,8 +813,8 @@ class FilterTag { try { final useRegExp = parts.last == useRegExpTag; final query = parts[0].trim(); - final settingFilterValues = - (jsonDecode(parts[1]) as List).cast>(); + final settingFilterValues = (jsonDecode(parts[1]) as List) + .cast>(); return FilterTag( query: query, settingFilterValues: settingFilterValues, diff --git a/packages/devtools_app/lib/src/shared/ui/history_viewport.dart b/packages/devtools_app/lib/src/shared/ui/history_viewport.dart index 9497632f365..aad6cf45fde 100644 --- a/packages/devtools_app/lib/src/shared/ui/history_viewport.dart +++ b/packages/devtools_app/lib/src/shared/ui/history_viewport.dart @@ -62,26 +62,24 @@ class _HistoryViewportState extends State> { @override Widget build(BuildContext context) { - final titleIcon = - widget.titleIcon != null - ? Padding( - padding: const EdgeInsets.only(right: densePadding), - child: Icon( - widget.titleIcon, - size: defaultIconSize, - color: _iconColor, - ), - ) - : const SizedBox.shrink(); + final titleIcon = widget.titleIcon != null + ? Padding( + padding: const EdgeInsets.only(right: densePadding), + child: Icon( + widget.titleIcon, + size: defaultIconSize, + color: _iconColor, + ), + ) + : const SizedBox.shrink(); return ValueListenableBuilder( valueListenable: widget.history.current, builder: (context, T? current, _) { final theme = Theme.of(context); - final title = - widget.generateTitle == null - ? ' ' - : widget.generateTitle!(current); + final title = widget.generateTitle == null + ? ' ' + : widget.generateTitle!(current); final defaultTitleStyle = theme.textTheme.titleMedium!; final titleWidget = debuggerSectionTitle( theme, @@ -90,77 +88,74 @@ class _HistoryViewportState extends State> { if (widget.historyEnabled) ...[ ToolbarAction( icon: Icons.chevron_left, - onPressed: - widget.history.hasPrevious - ? () { - widget.history.moveBack(); - if (widget.onChange != null) { - widget.onChange!( - widget.history.current.value, - widget.history.peekNext(), - ); - } + onPressed: widget.history.hasPrevious + ? () { + widget.history.moveBack(); + if (widget.onChange != null) { + widget.onChange!( + widget.history.current.value, + widget.history.peekNext(), + ); } - : null, + } + : null, ), ToolbarAction( icon: Icons.chevron_right, - onPressed: - widget.history.hasNext - ? () { - final current = widget.history.current.value as T; - widget.history.moveForward(); - if (widget.onChange != null) { - widget.onChange!( - widget.history.current.value, - current, - ); - } + onPressed: widget.history.hasNext + ? () { + final current = widget.history.current.value as T; + widget.history.moveForward(); + if (widget.onChange != null) { + widget.onChange!( + widget.history.current.value, + current, + ); } - : null, + } + : null, ), const SizedBox(width: denseSpacing), const VerticalDivider(thickness: 1.0), const SizedBox(width: defaultSpacing), ], Expanded( - child: - widget.onTitleTap == null - ? Row( - children: [ - titleIcon, - Text(title, style: defaultTitleStyle), - ], - ) - : MouseRegion( - cursor: SystemMouseCursors.click, - onExit: (_) { - _updateTitleStyle(defaultTitleStyle); - }, - onEnter: (_) { - _updateTitleStyle( - defaultTitleStyle.copyWith( - color: theme.colorScheme.primary, - ), - ); - }, - child: GestureDetector( - onTap: widget.onTitleTap, - child: Row( - children: [ - titleIcon, - Expanded( - child: Text( - title, - style: - _titleStyle ?? - theme.textTheme.titleMedium, - ), - ), - ], + child: widget.onTitleTap == null + ? Row( + children: [ + titleIcon, + Text(title, style: defaultTitleStyle), + ], + ) + : MouseRegion( + cursor: SystemMouseCursors.click, + onExit: (_) { + _updateTitleStyle(defaultTitleStyle); + }, + onEnter: (_) { + _updateTitleStyle( + defaultTitleStyle.copyWith( + color: theme.colorScheme.primary, ), + ); + }, + child: GestureDetector( + onTap: widget.onTitleTap, + child: Row( + children: [ + titleIcon, + Expanded( + child: Text( + title, + style: + _titleStyle ?? + theme.textTheme.titleMedium, + ), + ), + ], ), ), + ), ), if (widget.controls != null) ...[ const SizedBox(width: denseSpacing), diff --git a/packages/devtools_app/lib/src/shared/ui/hover.dart b/packages/devtools_app/lib/src/shared/ui/hover.dart index ea94bab9a6b..b43e30929b8 100644 --- a/packages/devtools_app/lib/src/shared/ui/hover.dart +++ b/packages/devtools_app/lib/src/shared/ui/hover.dart @@ -424,10 +424,9 @@ class _HoverCardTooltipState extends State { HoverCard? spinnerHoverCard; final hoverCardDataFuture = asyncGenerateHoverCardData( event: event, - isHoverStale: - () => - spinnerHoverCard != null && - !_hoverCardController.isHoverCardStillActive(spinnerHoverCard), + isHoverStale: () => + spinnerHoverCard != null && + !_hoverCardController.isHoverCardStillActive(spinnerHoverCard), ); final hoverCardDataCompleter = _hoverCardDataCompleter(hoverCardDataFuture); // If we have set the async hover card to show up only after a timeout, diff --git a/packages/devtools_app/lib/src/shared/ui/search.dart b/packages/devtools_app/lib/src/shared/ui/search.dart index 2107561794c..fb1064e65cf 100644 --- a/packages/devtools_app/lib/src/shared/ui/search.dart +++ b/packages/devtools_app/lib/src/shared/ui/search.dart @@ -122,15 +122,16 @@ mixin SearchControllerMixin searchInProgress = true; // Start new search operation - final future = Future(() { - return matchesForSearch( - _searchNotifier.value, - searchPreviousMatches: searchPreviousMatches, - ); - }).then((matches) { - searchInProgress = false; - _updateMatches(matches); - }); + final future = + Future(() { + return matchesForSearch( + _searchNotifier.value, + searchPreviousMatches: searchPreviousMatches, + ); + }).then((matches) { + searchInProgress = false; + _updateMatches(matches); + }); _searchOperation = CancelableOperation.fromFuture(future); await _searchOperation!.value; searchInProgress = false; @@ -194,8 +195,8 @@ mixin SearchControllerMixin matchIndex.value = 1; // first item because [matchIndex] us 1-based } _activeSearchMatch.value?.isActiveSearchMatch = false; - _activeSearchMatch.value = - searchMatches.value[activeMatchIndex]..isActiveSearchMatch = true; + _activeSearchMatch.value = searchMatches.value[activeMatchIndex] + ..isActiveSearchMatch = true; onMatchChanged(activeMatchIndex); } @@ -205,11 +206,10 @@ mixin SearchControllerMixin /// If [matchesForSearch] is overridden in such a way that /// [currentDataToSearchThrough] is not used, then this getter does not need /// to be implemented. - Iterable get currentDataToSearchThrough => - throw UnimplementedError( - 'Implement this getter in order to use the default' - ' [matchesForSearch] behavior.', - ); + Iterable get currentDataToSearchThrough => throw UnimplementedError( + 'Implement this getter in order to use the default' + ' [matchesForSearch] behavior.', + ); /// Default search matching logic. /// @@ -254,8 +254,8 @@ mixin SearchControllerMixin @mustCallSuper @override void init() { - _searchTextFieldController = - SearchTextEditingController()..text = _searchNotifier.value; + _searchTextFieldController = SearchTextEditingController() + ..text = _searchNotifier.value; _searchFieldFocusNode = FocusNode(debugLabel: 'search-field'); } @@ -350,25 +350,23 @@ class AutoCompleteState extends State with AutoDisposeMixin { context, ).regularTextStyle.copyWith(fontWeight: FontWeight.bold); - final tileContents = - searchAutoComplete.value - .map( - (match) => _maybeHighlightMatchText( - match, - autoCompleteTextStyle, - autoCompleteHighlightedTextStyle, - ), - ) - .toList(); + final tileContents = searchAutoComplete.value + .map( + (match) => _maybeHighlightMatchText( + match, + autoCompleteTextStyle, + autoCompleteHighlightedTextStyle, + ), + ) + .toList(); // When there are no tiles present, we don't need to display the // auto complete list. if (tileContents.isEmpty) return const SizedBox.shrink(); - final tileEntryHeight = - tileContents.isEmpty - ? 0.0 - : calculateTextSpanHeight(tileContents.first) + denseSpacing; + final tileEntryHeight = tileContents.isEmpty + ? 0.0 + : calculateTextSpanHeight(tileContents.first) + denseSpacing; // Find the searchField and place overlay below bottom of TextField and // make overlay width of TextField. This is also we decide the height of @@ -382,17 +380,15 @@ class AutoCompleteState extends State with AutoDisposeMixin { final maxAreaForPopup = areaHeight - tileEntryHeight; // TODO(terry): Scrolling doesn't work so max popup height is also total // matches to use. - topMatchesLimit = - min( - defaultTopMatchesLimit, - (maxAreaForPopup / tileEntryHeight) - 1, // zero based. - ).truncate(); + topMatchesLimit = min( + defaultTopMatchesLimit, + (maxAreaForPopup / tileEntryHeight) - 1, // zero based. + ).truncate(); // Total tiles visible. - final totalTiles = - bottom - ? searchAutoComplete.value.length - : (maxAreaForPopup / tileEntryHeight).truncateToDouble(); + final totalTiles = bottom + ? searchAutoComplete.value.length + : (maxAreaForPopup / tileEntryHeight).truncateToDouble(); final autoCompleteTiles = []; final count = min(searchAutoComplete.value.length, totalTiles); @@ -413,17 +409,17 @@ class AutoCompleteState extends State with AutoDisposeMixin { // Compute the Y position of the popup (auto-complete list). Its bottom // will be positioned at the top of the text field. Add 1 includes // the TextField border. - final yCoord = - bottom ? 0.0 : -((count * tileEntryHeight) + box.size.height + 1); + final yCoord = bottom + ? 0.0 + : -((count * tileEntryHeight) + box.size.height + 1); final xCoord = controller.xPosition; return Positioned( key: searchAutoCompleteKey, - width: - isMaxWidth - ? box.size.width - : AutoCompleteSearchControllerMixin.minPopupWidth, + width: isMaxWidth + ? box.size.width + : AutoCompleteSearchControllerMixin.minPopupWidth, height: count * tileEntryHeight, child: CompositedTransformFollower( link: controller.autoCompleteLayerLink, @@ -450,16 +446,15 @@ class AutoCompleteState extends State with AutoDisposeMixin { TextStyle highlightedTextStyle, ) { return match.transformAutoCompleteMatch( - transformMatchedSegment: - (segment) => TextSpan(text: segment, style: highlightedTextStyle), - transformUnmatchedSegment: - (segment) => TextSpan(text: segment, style: regularTextStyle), - combineSegments: - (segments) => TextSpan( - text: segments.first.text, - style: segments.first.style, - children: segments.sublist(1), - ), + transformMatchedSegment: (segment) => + TextSpan(text: segment, style: highlightedTextStyle), + transformUnmatchedSegment: (segment) => + TextSpan(text: segment, style: regularTextStyle), + combineSegments: (segments) => TextSpan( + text: segments.first.text, + style: segments.first.style, + children: segments.sublist(1), + ), ); } } @@ -500,8 +495,9 @@ class AutoCompleteTile extends StatelessWidget { valueListenable: controller.currentHoveredIndex, builder: (context, currentHoveredIndex, _) { return Container( - color: - currentHoveredIndex == index ? highlightColor : defaultColor, + color: currentHoveredIndex == index + ? highlightColor + : defaultColor, padding: const EdgeInsets.symmetric(horizontal: denseSpacing), alignment: Alignment.centerLeft, child: Text.rich(textSpan, maxLines: 1), @@ -571,10 +567,9 @@ mixin AutoCompleteSearchControllerMixin on SearchControllerMixin { final _currentHoveredIndex = ValueNotifier(0); - String? get currentHoveredText => - searchAutoComplete.value.isNotEmpty - ? searchAutoComplete.value[currentHoveredIndex.value].text - : null; + String? get currentHoveredText => searchAutoComplete.value.isNotEmpty + ? searchAutoComplete.value[currentHoveredIndex.value].text + : null; /// Last X position of caret in search field, used for pop-up position. double xPosition = 0.0; @@ -922,10 +917,10 @@ class _SearchFieldState extends State with AutoDisposeMixin { return widget._maxLines != 1 ? searchField : SizedBox( - width: widget.searchFieldWidth, - height: widget.searchFieldHeight, - child: searchField, - ); + width: widget.searchFieldWidth, + height: widget.searchFieldHeight, + child: searchField, + ); } } @@ -1048,24 +1043,23 @@ class StatelessSearchField labelText: label, labelStyle: theme.subtleTextStyle, prefixIcon: Icon(Icons.search, size: defaultIconSize), - prefix: - prefix != null - ? Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.end, - children: [ - prefix!, - SizedBox( - height: inputDecorationElementHeight, - width: defaultIconSize, - child: Transform.rotate( - angle: degToRad(90), - child: PaddedDivider.vertical(), - ), + prefix: prefix != null + ? Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.end, + children: [ + prefix!, + SizedBox( + height: inputDecorationElementHeight, + width: defaultIconSize, + child: Transform.rotate( + angle: degToRad(90), + child: PaddedDivider.vertical(), ), - ], - ) - : null, + ), + ], + ) + : null, suffix: suffix ?? _SearchFieldSuffix( @@ -1168,8 +1162,8 @@ class _AutoCompleteSearchFieldState extends State with AutoDisposeMixin { HighlightAutoComplete get _highlightDropdown => widget.onHighlightDropdown != null - ? widget.onHighlightDropdown as HighlightAutoComplete - : _highlightDropdownItem; + ? widget.onHighlightDropdown as HighlightAutoComplete + : _highlightDropdownItem; @override void initState() { @@ -1346,11 +1340,11 @@ class _SearchFieldSuffix extends StatelessWidget { return supportsNavigation ? SearchNavigationControls(controller, onClose: onClose) : InputDecorationSuffixButton.close( - onPressed: () { - controller.searchTextFieldController.clear(); - onClose?.call(); - }, - ); + onPressed: () { + controller.searchTextFieldController.clear(); + onClose?.call(); + }, + ); } } @@ -1383,14 +1377,13 @@ class SearchNavigationControls extends StatelessWidget { child: SizedBox( width: scaleByFontFactor(smallProgressSize), height: scaleByFontFactor(smallProgressSize), - child: - isSearchInProgress - ? SmallCircularProgressIndicator( - valueColor: AlwaysStoppedAnimation( - Theme.of(context).regularTextStyle.color, - ), - ) - : const SizedBox(), + child: isSearchInProgress + ? SmallCircularProgressIndicator( + valueColor: AlwaysStoppedAnimation( + Theme.of(context).regularTextStyle.color, + ), + ) + : const SizedBox(), ), ), _matchesStatus(numMatches), @@ -1451,11 +1444,10 @@ mixin SearchableDataMixin { /// [SearchControllerMixin.matchesForSearch] is overridden in such a way that /// [matchesSearchToken] is not used, then this method does not need to be /// implemented. - bool matchesSearchToken(RegExp regExpSearch) => - throw UnimplementedError( - 'Implement this method in order to use the default' - ' [SearchControllerMixin.matchesForSearch] behavior.', - ); + bool matchesSearchToken(RegExp regExpSearch) => throw UnimplementedError( + 'Implement this method in order to use the default' + ' [SearchControllerMixin.matchesForSearch] behavior.', + ); } // This mixin is used to get around the type system where a type `T` needs to diff --git a/packages/devtools_app/lib/src/shared/ui/side_panel.dart b/packages/devtools_app/lib/src/shared/ui/side_panel.dart index 2d5be926636..236d1c384e5 100644 --- a/packages/devtools_app/lib/src/shared/ui/side_panel.dart +++ b/packages/devtools_app/lib/src/shared/ui/side_panel.dart @@ -180,13 +180,12 @@ class SidePanel extends AnimatedWidget { markdownData.isNullOrEmpty ? Text(textIfMarkdownDataEmpty ?? '') : Expanded( - child: Markdown( - data: markdownData!, - onTapLink: - (text, url, title) => - unawaited(launchUrlWithErrorHandling(url!)), + child: Markdown( + data: markdownData!, + onTapLink: (text, url, title) => + unawaited(launchUrlWithErrorHandling(url!)), + ), ), - ), ], ), ), diff --git a/packages/devtools_app/lib/src/shared/ui/tree_view.dart b/packages/devtools_app/lib/src/shared/ui/tree_view.dart index dc0e3dcfbcd..bd893306d65 100644 --- a/packages/devtools_app/lib/src/shared/ui/tree_view.dart +++ b/packages/devtools_app/lib/src/shared/ui/tree_view.dart @@ -87,8 +87,8 @@ class _TreeViewState> extends State> final T item = dataFlatList[index]; return _TreeViewItem( item, - buildDisplay: - (onPressed) => widget.dataDisplayProvider(item, onPressed), + buildDisplay: (onPressed) => + widget.dataDisplayProvider(item, onPressed), onItemSelected: _onItemSelected, onItemExpanded: _onItemExpanded, ); @@ -177,21 +177,23 @@ class _TreeViewItemState> extends State<_TreeViewItem> Widget build(BuildContext context) { return Container( margin: EdgeInsets.only(left: nodeIndent(widget.data)), - color: - widget.data.isSelected - ? Theme.of(context).colorScheme.selectedRowBackgroundColor - : null, + color: widget.data.isSelected + ? Theme.of(context).colorScheme.selectedRowBackgroundColor + : null, child: Row( mainAxisSize: MainAxisSize.min, children: [ widget.data.isExpandable ? InkWell( - onTap: _onExpanded, - child: RotationTransition( - turns: expandArrowAnimation, - child: Icon(Icons.keyboard_arrow_down, size: defaultIconSize), - ), - ) + onTap: _onExpanded, + child: RotationTransition( + turns: expandArrowAnimation, + child: Icon( + Icons.keyboard_arrow_down, + size: defaultIconSize, + ), + ), + ) : SizedBox(width: defaultIconSize), Expanded(child: widget.buildDisplay(_onSelected)), ], diff --git a/packages/devtools_app/lib/src/shared/ui/utils.dart b/packages/devtools_app/lib/src/shared/ui/utils.dart index 3e0e127f1ec..d46894c7f92 100644 --- a/packages/devtools_app/lib/src/shared/ui/utils.dart +++ b/packages/devtools_app/lib/src/shared/ui/utils.dart @@ -173,10 +173,9 @@ class _OffsetScrollbarState extends State { widget.offsetController.position.viewportDimension; } } - final offset = - widget.axis == Axis.vertical - ? Offset(delta, 0.0) - : Offset(0.0, delta); + final offset = widget.axis == Axis.vertical + ? Offset(delta, 0.0) + : Offset(0.0, delta); return Transform.translate( offset: offset, child: Scrollbar( diff --git a/packages/devtools_app/lib/src/shared/ui/vm_flag_widgets.dart b/packages/devtools_app/lib/src/shared/ui/vm_flag_widgets.dart index 3cf01dc4256..fa5ca6b3b85 100644 --- a/packages/devtools_app/lib/src/shared/ui/vm_flag_widgets.dart +++ b/packages/devtools_app/lib/src/shared/ui/vm_flag_widgets.dart @@ -48,8 +48,9 @@ class CpuSamplingRateDropdown extends StatelessWidget { // dropdown list. We default to [CpuSamplingFrequency.medium] if the // flag value is not one of the three defaults in DevTools // (50, 250, 1000). - final safeValue = - CpuSamplingRateExtension.fromValue(flag.valueAsString ?? '').value; + final safeValue = CpuSamplingRateExtension.fromValue( + flag.valueAsString ?? '', + ).value; // Set the vm flag value to the [safeValue] if we get to this state. if (safeValue != flag.valueAsString) { unawaited(_onSamplingFrequencyChanged(safeValue)); @@ -175,20 +176,18 @@ class _VMFlagsDialogState extends State with AutoDisposeMixin { } void _updateFromController() { - flags = - (serviceConnection.vmFlagManager.flags.value?.flags ?? []) - .map((flag) => _DialogFlag(flag)) - .toList(); + flags = (serviceConnection.vmFlagManager.flags.value?.flags ?? []) + .map((flag) => _DialogFlag(flag)) + .toList(); _refilter(); } void _refilter() { final filter = filterController.text.trim().toLowerCase(); - filteredFlags = - filter.isEmpty - ? flags - : flags.where((flag) => flag.filterText.contains(filter)).toList(); + filteredFlags = filter.isEmpty + ? flags + : flags.where((flag) => flag.filterText.contains(filter)).toList(); } @override @@ -286,8 +285,8 @@ class _DialogFlag { _DialogFlag(this.flag) : filterText = '${flag.name?.toLowerCase()}\n' - '${flag.comment?.toLowerCase()}\n' - '${flag.valueAsString?.toLowerCase()}'; + '${flag.comment?.toLowerCase()}\n' + '${flag.valueAsString?.toLowerCase()}'; final Flag flag; final String filterText; diff --git a/packages/devtools_app/lib/src/shared/utils/utils.dart b/packages/devtools_app/lib/src/shared/utils/utils.dart index f41bf23af67..4d05451b999 100644 --- a/packages/devtools_app/lib/src/shared/utils/utils.dart +++ b/packages/devtools_app/lib/src/shared/utils/utils.dart @@ -361,7 +361,7 @@ void safeUnawaited( Future future, { void Function(Object?, StackTrace)? onError, }) { - onError ??= - (e, st) => reportError('Error in unawaited Future: $e', stack: st); + onError ??= (e, st) => + reportError('Error in unawaited Future: $e', stack: st); unawaited(future.catchError(onError)); } diff --git a/packages/devtools_app/lib/src/shared/utils/vm_utils.dart b/packages/devtools_app/lib/src/shared/utils/vm_utils.dart index 72320b8246a..91da0f0baa0 100644 --- a/packages/devtools_app/lib/src/shared/utils/vm_utils.dart +++ b/packages/devtools_app/lib/src/shared/utils/vm_utils.dart @@ -37,14 +37,16 @@ Future findInstance( return null; } - final result = (await serviceConnection.serviceManager.service!.getInstances( - isolateId, - classId, - preferences.memory.refLimit.value, - )).instances?.firstWhereOrNull( - (instance) => - (instance is InstanceRef) && (instance.identityHashCode == hashCode), - ); + final result = + (await serviceConnection.serviceManager.service!.getInstances( + isolateId, + classId, + preferences.memory.refLimit.value, + )).instances?.firstWhereOrNull( + (instance) => + (instance is InstanceRef) && + (instance.identityHashCode == hashCode), + ); if (result is InstanceRef) return result; return null; diff --git a/packages/devtools_app/lib/src/standalone_ui/ide_shared/property_editor/property_editor_controller.dart b/packages/devtools_app/lib/src/standalone_ui/ide_shared/property_editor/property_editor_controller.dart index 45ac9e49884..fb5c6aa0c6b 100644 --- a/packages/devtools_app/lib/src/standalone_ui/ide_shared/property_editor/property_editor_controller.dart +++ b/packages/devtools_app/lib/src/standalone_ui/ide_shared/property_editor/property_editor_controller.dart @@ -15,14 +15,13 @@ import '../../../shared/ui/filter.dart'; import '../../../shared/utils/utils.dart'; import 'property_editor_types.dart'; -typedef EditableWidgetData = - ({ - List properties, - String? name, - String? documentation, - String? fileUri, - EditorRange? range, - }); +typedef EditableWidgetData = ({ + List properties, + String? name, + String? documentation, + String? fileUri, + EditorRange? range, +}); typedef EditArgumentFunction = Future Function({ @@ -176,22 +175,22 @@ class PropertyEditorController extends DisposableController final range = widgetRange; return range == null ? Object.hash( - property.name, - property.type, - property.value, // Include the property value. - property.displayValue, - widgetName, - fileUri, - ) + property.name, + property.type, + property.value, // Include the property value. + property.displayValue, + widgetName, + fileUri, + ) : Object.hash( - property.name, - property.type, - property.displayValue, - fileUri, - widgetName, - range.start.line, // Include the start position of the property. - range.start.character, - ); + property.name, + property.type, + property.displayValue, + fileUri, + widgetName, + range.start.line, // Include the start position of the property. + range.start.character, + ); } Future _updateWithEditableArgs({ @@ -205,13 +204,12 @@ class PropertyEditorController extends DisposableController textDocument: textDocument, position: cursorPosition, ); - final properties = - (result?.args ?? []) - .map(argToProperty) - .nonNulls - // Filter out any deprecated properties that aren't set. - .where((property) => !property.isDeprecated || property.hasArgument) - .toList(); + final properties = (result?.args ?? []) + .map(argToProperty) + .nonNulls + // Filter out any deprecated properties that aren't set. + .where((property) => !property.isDeprecated || property.hasArgument) + .toList(); final name = result?.name; final range = result?.range; @@ -257,8 +255,10 @@ class PropertyEditorController extends DisposableController setActiveFilter(); if (editableArgsResult != null) { _editableWidgetData.value = ( - properties: - editableArgsResult.args.map(argToProperty).nonNulls.toList(), + properties: editableArgsResult.args + .map(argToProperty) + .nonNulls + .toList(), name: editableArgsResult.name, documentation: editableArgsResult.documentation, fileUri: document?.uriAsString, diff --git a/packages/devtools_app/lib/src/standalone_ui/ide_shared/property_editor/property_editor_inputs.dart b/packages/devtools_app/lib/src/standalone_ui/ide_shared/property_editor/property_editor_inputs.dart index 59ad8b0252e..4c1b68eafd5 100644 --- a/packages/devtools_app/lib/src/standalone_ui/ide_shared/property_editor/property_editor_inputs.dart +++ b/packages/devtools_app/lib/src/standalone_ui/ide_shared/property_editor/property_editor_inputs.dart @@ -130,8 +130,8 @@ class _DropdownInputState extends State<_DropdownInput> padding: denseSpacing, ), isExpanded: true, - selectedItemBuilder: - (context) => _dropdownItems(withDefaultLabels: false), + selectedItemBuilder: (context) => + _dropdownItems(withDefaultLabels: false), items: _dropdownItems(withDefaultLabels: true), onChanged: (newValue) async { if (newValue != widget.property.valueDisplay) { @@ -283,9 +283,9 @@ class _TextInputState extends State<_TextInput> // set the empty selection at the end of the string. final newSelection = (newValue.length < previousSelection.end || - newValue.length < previousSelection.start) - ? TextSelection.collapsed(offset: newValue.length) - : previousSelection; + newValue.length < previousSelection.start) + ? TextSelection.collapsed(offset: newValue.length) + : previousSelection; // Set the new value in the controller with the new selection. _controller.value = TextEditingValue( text: newValue, @@ -315,10 +315,9 @@ mixin _PropertyInputMixin on State { ), ); final editToNull = property.isNullable && property.isNully(valueAsString); - final value = - editToNull - ? null - : property.convertFromInputString(valueAsString) as U?; + final value = editToNull + ? null + : property.convertFromInputString(valueAsString) as U?; final response = await editPropertyCallback(name: argName, value: value); _handleServerResponse(response, property: property); } diff --git a/packages/devtools_app/lib/src/standalone_ui/ide_shared/property_editor/property_editor_messages.dart b/packages/devtools_app/lib/src/standalone_ui/ide_shared/property_editor/property_editor_messages.dart index 8039bf0b878..e3cf4530149 100644 --- a/packages/devtools_app/lib/src/standalone_ui/ide_shared/property_editor/property_editor_messages.dart +++ b/packages/devtools_app/lib/src/standalone_ui/ide_shared/property_editor/property_editor_messages.dart @@ -55,8 +55,9 @@ class HowToUseMessage extends StatelessWidget { ); TextSpan highlight(TextSpan original) => _highlight( original, - highlighterColor: - theme.isDarkTheme ? _darkHighlighterColor : _lightHighlighterColor, + highlighterColor: theme.isDarkTheme + ? _darkHighlighterColor + : _lightHighlighterColor, ); return Text.rich( @@ -110,7 +111,10 @@ class HowToUseMessage extends StatelessWidget { String text, { required TextStyle style, required Color color, - }) => TextSpan(text: text, style: style.copyWith(color: color)); + }) => TextSpan( + text: text, + style: style.copyWith(color: color), + ); TextSpan _highlight(TextSpan original, {required Color highlighterColor}) => TextSpan( diff --git a/packages/devtools_app/lib/src/standalone_ui/ide_shared/property_editor/property_editor_panel.dart b/packages/devtools_app/lib/src/standalone_ui/ide_shared/property_editor/property_editor_panel.dart index 368e6a4160a..fafac06fba0 100644 --- a/packages/devtools_app/lib/src/standalone_ui/ide_shared/property_editor/property_editor_panel.dart +++ b/packages/devtools_app/lib/src/standalone_ui/ide_shared/property_editor/property_editor_panel.dart @@ -61,11 +61,8 @@ class _PropertyEditorPanelState extends State { alignment: Alignment.topCenter, child: FutureBuilder( future: _editor, - builder: - (context, snapshot) => switch (( - snapshot.connectionState, - snapshot.data, - )) { + builder: (context, snapshot) => + switch ((snapshot.connectionState, snapshot.data)) { (ConnectionState.done, final editor?) => _PropertyEditorConnectedPanel( editor, diff --git a/packages/devtools_app/lib/src/standalone_ui/ide_shared/property_editor/property_editor_types.dart b/packages/devtools_app/lib/src/standalone_ui/ide_shared/property_editor/property_editor_types.dart index a5c72d5d000..21a4af54dc9 100644 --- a/packages/devtools_app/lib/src/standalone_ui/ide_shared/property_editor/property_editor_types.dart +++ b/packages/devtools_app/lib/src/standalone_ui/ide_shared/property_editor/property_editor_types.dart @@ -33,13 +33,16 @@ class EditableBool extends EditableProperty with FiniteValuesProperty { @override Object? convertFromInputString(String? valueAsString) => valueAsString == 'true' || valueAsString == 'false' - ? valueAsString == 'true' - : valueAsString; // The boolean value might be an expression. + ? valueAsString == 'true' + : valueAsString; // The boolean value might be an expression. @override Set get propertyOptions { - final shouldIncludeValueDisplay = - !['true', 'false', 'null'].contains(valueDisplay); + final shouldIncludeValueDisplay = ![ + 'true', + 'false', + 'null', + ].contains(valueDisplay); return { (text: 'true', isDefault: defaultValue == true), diff --git a/packages/devtools_app/lib/src/standalone_ui/ide_shared/property_editor/property_editor_view.dart b/packages/devtools_app/lib/src/standalone_ui/ide_shared/property_editor/property_editor_view.dart index f4b73157ce9..810d55e16f3 100644 --- a/packages/devtools_app/lib/src/standalone_ui/ide_shared/property_editor/property_editor_view.dart +++ b/packages/devtools_app/lib/src/standalone_ui/ide_shared/property_editor/property_editor_view.dart @@ -50,10 +50,9 @@ class PropertyEditorView extends StatelessWidget { List _propertyEditorContents(EditableWidgetData? editableWidgetData) { if (editableWidgetData == null) { - final introSentence = - controller.waitingForFirstEvent - ? const WelcomeMessage() - : const NoWidgetAtLocationMessage(); + final introSentence = controller.waitingForFirstEvent + ? const WelcomeMessage() + : const NoWidgetAtLocationMessage(); return [introSentence, const HowToUseMessage()]; } @@ -297,20 +296,19 @@ class _InfoTooltip extends StatelessWidget { ), ]; - final defaultValueSpans = - property.hasDefault - ? [ - TextSpan(text: '\n\nDefault value: ', style: boldFontStyle), - TextSpan( - text: property.defaultValue.toString(), - style: fixedFontStyle, - ), - ] - : [ - TextSpan(text: '\n\nDefault value:\n', style: boldFontStyle), - TextSpan(text: property.name, style: fixedFontStyle), - TextSpan(text: ' has no default value.', style: regularFontStyle), - ]; + final defaultValueSpans = property.hasDefault + ? [ + TextSpan(text: '\n\nDefault value: ', style: boldFontStyle), + TextSpan( + text: property.defaultValue.toString(), + style: fixedFontStyle, + ), + ] + : [ + TextSpan(text: '\n\nDefault value:\n', style: boldFontStyle), + TextSpan(text: property.name, style: fixedFontStyle), + TextSpan(text: ' has no default value.', style: regularFontStyle), + ]; final spans = [...propertyNameSpans, ...defaultValueSpans]; diff --git a/packages/devtools_app/lib/src/standalone_ui/ide_shared/property_editor/utils/utils.dart b/packages/devtools_app/lib/src/standalone_ui/ide_shared/property_editor/utils/utils.dart index 79707c8ece6..c8877868dee 100644 --- a/packages/devtools_app/lib/src/standalone_ui/ide_shared/property_editor/utils/utils.dart +++ b/packages/devtools_app/lib/src/standalone_ui/ide_shared/property_editor/utils/utils.dart @@ -104,10 +104,9 @@ class DartDocConverter { int templateIndex; if (startTemplateIndex != -1 && endTemplateIndex != -1) { - templateIndex = - (startTemplateIndex < endTemplateIndex) - ? startTemplateIndex - : endTemplateIndex; + templateIndex = (startTemplateIndex < endTemplateIndex) + ? startTemplateIndex + : endTemplateIndex; } else if (startTemplateIndex != -1) { templateIndex = startTemplateIndex; } else if (endTemplateIndex != -1) { @@ -126,8 +125,8 @@ class DartDocConverter { } final closingChars = input.substring(closingIndex).startsWith('$closingCurlyBrace$newLine') - ? '$closingCurlyBrace$newLine' - : closingCurlyBrace; + ? '$closingCurlyBrace$newLine' + : closingCurlyBrace; currentIndex = closingIndex + closingChars.length; } diff --git a/packages/devtools_app/lib/src/standalone_ui/vs_code/debug_sessions.dart b/packages/devtools_app/lib/src/standalone_ui/vs_code/debug_sessions.dart index 00c53662ead..46799af2115 100644 --- a/packages/devtools_app/lib/src/standalone_ui/vs_code/debug_sessions.dart +++ b/packages/devtools_app/lib/src/standalone_ui/vs_code/debug_sessions.dart @@ -61,33 +61,30 @@ class DebugSessions extends StatelessWidget { final isDebug = mode == 'debug'; final isFlutter = session.debuggerType?.contains('Flutter') ?? false; - final label = - session.flutterMode != null - ? '${session.name} (${session.flutterMode})' - : session.name; + final label = session.flutterMode != null + ? '${session.name} (${session.flutterMode})' + : session.name; return TableRow( children: [ Text(label, style: Theme.of(context).regularTextStyle), IconButton( - onPressed: - editor.supportsHotReload && (isDebug || !isFlutter) - ? () { - ga.select(editor.gaId, gac.hotReload); - unawaited(editor.hotReload(session.id)); - } - : null, + onPressed: editor.supportsHotReload && (isDebug || !isFlutter) + ? () { + ga.select(editor.gaId, gac.hotReload); + unawaited(editor.hotReload(session.id)); + } + : null, tooltip: 'Hot Reload', icon: Icon(hotReloadIcon, size: actionsIconSize), ), IconButton( - onPressed: - editor.supportsHotRestart && (isDebug || !isFlutter) - ? () { - ga.select(editor.gaId, gac.hotRestart); - unawaited(editor.hotRestart(session.id)); - } - : null, + onPressed: editor.supportsHotRestart && (isDebug || !isFlutter) + ? () { + ga.select(editor.gaId, gac.hotRestart); + unawaited(editor.hotRestart(session.id)); + } + : null, tooltip: 'Hot Restart', icon: Icon(hotRestartIcon, size: actionsIconSize), ), diff --git a/packages/devtools_app/lib/src/standalone_ui/vs_code/devices.dart b/packages/devtools_app/lib/src/standalone_ui/vs_code/devices.dart index 0ab30df1ea4..6c1a3ea73f4 100644 --- a/packages/devtools_app/lib/src/standalone_ui/vs_code/devices.dart +++ b/packages/devtools_app/lib/src/standalone_ui/vs_code/devices.dart @@ -22,12 +22,11 @@ class Devices extends StatelessWidget { for (final MapEntry(key: id, value: device) in devices.entries) if (device.supported) id: device, }, - unsupportedDevicePlatformTypes = - devices.values - .where((device) => !device.supported) - .map((device) => device.platformType) - .nonNulls - .toSet(); + unsupportedDevicePlatformTypes = devices.values + .where((device) => !device.supported) + .map((device) => device.platformType) + .nonNulls + .toSet(); final EditorClient editor; final Map supportedDevices; @@ -67,10 +66,9 @@ class Devices extends StatelessWidget { required bool isSelected, }) { final backgroundColor = isSelected ? theme.colorScheme.secondary : null; - final foregroundColor = - isSelected - ? theme.colorScheme.onSecondary - : theme.colorScheme.onSurface; + final foregroundColor = isSelected + ? theme.colorScheme.onSecondary + : theme.colorScheme.onSurface; return TableRow( decoration: BoxDecoration(color: backgroundColor), diff --git a/packages/devtools_app/lib/src/standalone_ui/vs_code/devtools/devtools_view.dart b/packages/devtools_app/lib/src/standalone_ui/vs_code/devtools/devtools_view.dart index e5ada2f64fa..87a8fd58469 100644 --- a/packages/devtools_app/lib/src/standalone_ui/vs_code/devtools/devtools_view.dart +++ b/packages/devtools_app/lib/src/standalone_ui/vs_code/devtools/devtools_view.dart @@ -96,13 +96,12 @@ class SidebarDevToolsScreens extends StatelessWidget { ), Table( defaultVerticalAlignment: TableCellVerticalAlignment.middle, - columnWidths: - singleColumn - ? null - : const { - 0: FlexColumnWidth(), - 1: FlexColumnWidth(), - }, + columnWidths: singleColumn + ? null + : const { + 0: FlexColumnWidth(), + 1: FlexColumnWidth(), + }, children: generateRows(singleColumn), ), ], @@ -110,8 +109,9 @@ class SidebarDevToolsScreens extends StatelessWidget { } List generateRows(bool singleColumn) { - final devtoolsScreens = - ScreenMetaData.values.where(includeInSidebar).toList(); + final devtoolsScreens = ScreenMetaData.values + .where(includeInSidebar) + .toList(); if (singleColumn) { return devtoolsScreens .map( @@ -121,13 +121,12 @@ class SidebarDevToolsScreens extends StatelessWidget { editor: editor, singleColumn: singleColumn, hasDebugSessions: debugSessions.isNotEmpty, - onPressed: - (data) => openDevToolsScreen( - screenId: data.screenId, - requiresDebugSession: data.requiresDebugSession, - prefersDebugSession: data.prefersDebugSession, - editor: editor, - ), + onPressed: (data) => openDevToolsScreen( + screenId: data.screenId, + requiresDebugSession: data.requiresDebugSession, + prefersDebugSession: data.prefersDebugSession, + editor: editor, + ), ), ) .toList(); @@ -144,13 +143,12 @@ class SidebarDevToolsScreens extends StatelessWidget { editor: editor, singleColumn: singleColumn, hasDebugSessions: debugSessions.isNotEmpty, - onPressed: - (data) => openDevToolsScreen( - screenId: data.screenId, - requiresDebugSession: data.requiresDebugSession, - prefersDebugSession: data.prefersDebugSession, - editor: editor, - ), + onPressed: (data) => openDevToolsScreen( + screenId: data.screenId, + requiresDebugSession: data.requiresDebugSession, + prefersDebugSession: data.prefersDebugSession, + editor: editor, + ), ), ); } diff --git a/packages/devtools_app/lib/src/standalone_ui/vs_code/devtools/shared.dart b/packages/devtools_app/lib/src/standalone_ui/vs_code/devtools/shared.dart index 1117ab3eebb..10ec203df28 100644 --- a/packages/devtools_app/lib/src/standalone_ui/vs_code/devtools/shared.dart +++ b/packages/devtools_app/lib/src/standalone_ui/vs_code/devtools/shared.dart @@ -11,15 +11,14 @@ import '../../../shared/analytics/analytics.dart' as ga; import '../../../shared/analytics/constants.dart' as gac; import '../../../shared/editor/editor_client.dart'; -typedef DevToolsButtonData = - ({ - String label, - IconData? icon, - String? iconAsset, - String screenId, - bool requiresDebugSession, - bool prefersDebugSession, - }); +typedef DevToolsButtonData = ({ + String label, + IconData? icon, + String? iconAsset, + String screenId, + bool requiresDebugSession, + bool prefersDebugSession, +}); TableRow createDevToolsScreenRow({ required DevToolsButtonData dataLeft, @@ -33,15 +32,14 @@ TableRow createDevToolsScreenRow({ !singleColumn || dataRight == null, 'dataRight must be null is singleColumn is true', ); - final cellRight = - dataRight != null - ? _DevToolsScreenButton( - data: dataRight, - editor: editor, - hasDebugSessions: hasDebugSessions, - onPressed: onPressed, - ) - : const SizedBox(); + final cellRight = dataRight != null + ? _DevToolsScreenButton( + data: dataRight, + editor: editor, + hasDebugSessions: hasDebugSessions, + onPressed: onPressed, + ) + : const SizedBox(); return TableRow( children: [ _DevToolsScreenButton( @@ -78,8 +76,9 @@ class _DevToolsScreenButton extends StatelessWidget { return SizedBox( width: double.infinity, child: maybeWrapWithTooltip( - tooltip: - disableButton ? 'This tool requires an active debug session' : null, + tooltip: disableButton + ? 'This tool requires an active debug session' + : null, child: TextButton.icon( style: TextButton.styleFrom( alignment: Alignment.centerLeft, @@ -93,8 +92,9 @@ class _DevToolsScreenButton extends StatelessWidget { ), label: Text( data.label, - style: - disableButton ? theme.subtleTextStyle : theme.regularTextStyle, + style: disableButton + ? theme.subtleTextStyle + : theme.regularTextStyle, ), onPressed: disableButton ? null : () => onPressed(data), ), diff --git a/packages/devtools_app/lib/src/standalone_ui/vs_code/devtools/sidebar_extensions_controller.dart b/packages/devtools_app/lib/src/standalone_ui/vs_code/devtools/sidebar_extensions_controller.dart index a2878384575..1dc6e7e63dd 100644 --- a/packages/devtools_app/lib/src/standalone_ui/vs_code/devtools/sidebar_extensions_controller.dart +++ b/packages/devtools_app/lib/src/standalone_ui/vs_code/devtools/sidebar_extensions_controller.dart @@ -163,16 +163,15 @@ class SidebarDevToolsExtensionsController extends DisposableController // watch event from the IDE or analysis server to signal when any // package_config.json file in the workspace changes. Future _detectExtensions(Uri? projectRootUri) async { - final extensionService = - projectRootUri == null - ? - // A null [projectRootUri] indicates that this is an extensions lookup - // for the entire workspace, not a debug session with a fixed root URI. - ExtensionService(ignoreServiceConnection: true) - : ExtensionService( - fixedAppRoot: projectRootUri, - ignoreServiceConnection: true, - ); + final extensionService = projectRootUri == null + ? + // A null [projectRootUri] indicates that this is an extensions lookup + // for the entire workspace, not a debug session with a fixed root URI. + ExtensionService(ignoreServiceConnection: true) + : ExtensionService( + fixedAppRoot: projectRootUri, + ignoreServiceConnection: true, + ); assert( !_extensionServiceByRootUri.containsKey(projectRootUri), 'The initialization for the ExtensionService for root uri ' @@ -210,13 +209,12 @@ class SidebarDevToolsExtensionsController extends DisposableController extensionType: 'all', ); - final deduped = - allExtensions - .where( - (ext) => - !_ignoredExtensionsByHashCode.contains(identityHashCode(ext)), - ) - .toList(); + final deduped = allExtensions + .where( + (ext) => + !_ignoredExtensionsByHashCode.contains(identityHashCode(ext)), + ) + .toList(); _uniqueExtensions.value = deduped..sort(); } diff --git a/packages/devtools_app/lib/src/standalone_ui/vs_code/flutter_panel.dart b/packages/devtools_app/lib/src/standalone_ui/vs_code/flutter_panel.dart index 1b535fac0f4..abfba5e72b3 100644 --- a/packages/devtools_app/lib/src/standalone_ui/vs_code/flutter_panel.dart +++ b/packages/devtools_app/lib/src/standalone_ui/vs_code/flutter_panel.dart @@ -51,11 +51,8 @@ class _EditorSidebarPanelState extends State { Expanded( child: FutureBuilder( future: _editor, - builder: - (context, snapshot) => switch (( - snapshot.connectionState, - snapshot.data, - )) { + builder: (context, snapshot) => + switch ((snapshot.connectionState, snapshot.data)) { (ConnectionState.done, final editor?) => _EditorConnectedPanel(editor), _ => const CenteredCircularProgressIndicator(), diff --git a/packages/devtools_app/test/extensions/extension_settings_test.dart b/packages/devtools_app/test/extensions/extension_settings_test.dart index 41c46b8a6fb..9c5ac53e4dd 100644 --- a/packages/devtools_app/test/extensions/extension_settings_test.dart +++ b/packages/devtools_app/test/extensions/extension_settings_test.dart @@ -133,46 +133,38 @@ void main() { ExtensionEnabledState.none, ); - final barSetting = - tester - .widgetList(find.byType(ExtensionSetting)) - .where( - (setting) => - setting.extension.name.caseInsensitiveEquals('bar'), - ) - .first; - final bazSetting = - tester - .widgetList(find.byType(ExtensionSetting)) - .where( - (setting) => - setting.extension.name.caseInsensitiveEquals('baz'), - ) - .first; - final fooSetting = - tester - .widgetList(find.byType(ExtensionSetting)) - .where( - (setting) => - setting.extension.name.caseInsensitiveEquals('foo'), - ) - .first; - final providerSetting = - tester - .widgetList(find.byType(ExtensionSetting)) - .where( - (setting) => - setting.extension.name.caseInsensitiveEquals('provider'), - ) - .first; - final someToolSetting = - tester - .widgetList(find.byType(ExtensionSetting)) - .where( - (setting) => - setting.extension.name.caseInsensitiveEquals('some_tool'), - ) - .first; + final barSetting = tester + .widgetList(find.byType(ExtensionSetting)) + .where( + (setting) => setting.extension.name.caseInsensitiveEquals('bar'), + ) + .first; + final bazSetting = tester + .widgetList(find.byType(ExtensionSetting)) + .where( + (setting) => setting.extension.name.caseInsensitiveEquals('baz'), + ) + .first; + final fooSetting = tester + .widgetList(find.byType(ExtensionSetting)) + .where( + (setting) => setting.extension.name.caseInsensitiveEquals('foo'), + ) + .first; + final providerSetting = tester + .widgetList(find.byType(ExtensionSetting)) + .where( + (setting) => + setting.extension.name.caseInsensitiveEquals('provider'), + ) + .first; + final someToolSetting = tester + .widgetList(find.byType(ExtensionSetting)) + .where( + (setting) => + setting.extension.name.caseInsensitiveEquals('some_tool'), + ) + .first; // Disable the 'bar' extension. await tester.tap( diff --git a/packages/devtools_app/test/framework/observer/memory_observer_test.dart b/packages/devtools_app/test/framework/observer/memory_observer_test.dart index 0679976c6e5..2572d3be6ae 100644 --- a/packages/devtools_app/test/framework/observer/memory_observer_test.dart +++ b/packages/devtools_app/test/framework/observer/memory_observer_test.dart @@ -64,8 +64,11 @@ void main() { test( 'does not add banner message when memory limit is not reached', () async { - memoryUsageBytes = - convertBytes(1, from: ByteUnit.gb, to: ByteUnit.byte).round(); + memoryUsageBytes = convertBytes( + 1, + from: ByteUnit.gb, + to: ByteUnit.byte, + ).round(); observer.init(); await measurementComplete.future; @@ -75,15 +78,19 @@ void main() { // used instead of `gac.devToolsMain`. expect(DevToolsRouterDelegate.currentPage, isNull); - final messages = - bannerMessages.messagesForScreen(universalScreenId).value; + final messages = bannerMessages + .messagesForScreen(universalScreenId) + .value; expect(messages, isEmpty); }, ); test('adds banner message when memory limit is reached', () async { - memoryUsageBytes = - convertBytes(3.1, from: ByteUnit.gb, to: ByteUnit.byte).round(); + memoryUsageBytes = convertBytes( + 3.1, + from: ByteUnit.gb, + to: ByteUnit.byte, + ).round(); observer.init(); await measurementComplete.future; @@ -93,8 +100,9 @@ void main() { // used instead of `gac.devToolsMain`. expect(DevToolsRouterDelegate.currentPage, isNull); - final messages = - bannerMessages.messagesForScreen(universalScreenId).value; + final messages = bannerMessages + .messagesForScreen(universalScreenId) + .value; expect(messages, isNotEmpty); }); @@ -124,8 +132,11 @@ void main() { screenControllers.lookup(); DevToolsRouterDelegate.currentPage = screenController1.screenId; - memoryUsageBytes = - convertBytes(3.1, from: ByteUnit.gb, to: ByteUnit.byte).round(); + memoryUsageBytes = convertBytes( + 3.1, + from: ByteUnit.gb, + to: ByteUnit.byte, + ).round(); var result = await MemoryObserver.reduceMemory( debugMeasureUsageInBytes: testMeasureMemoryUsage, ); @@ -135,8 +146,11 @@ void main() { expect(screenController2.releaseMemoryCallCount, 1); expect(screenController2.partialReleaseMemoryCallCount, 0); - memoryUsageBytes = - convertBytes(1, from: ByteUnit.gb, to: ByteUnit.byte).round(); + memoryUsageBytes = convertBytes( + 1, + from: ByteUnit.gb, + to: ByteUnit.byte, + ).round(); result = await MemoryObserver.reduceMemory( debugMeasureUsageInBytes: testMeasureMemoryUsage, ); @@ -151,8 +165,11 @@ void main() { test('skips uninitialized screen controllers', () async { DevToolsRouterDelegate.currentPage = screenController1.screenId; - memoryUsageBytes = - convertBytes(3.1, from: ByteUnit.gb, to: ByteUnit.byte).round(); + memoryUsageBytes = convertBytes( + 3.1, + from: ByteUnit.gb, + to: ByteUnit.byte, + ).round(); var result = await MemoryObserver.reduceMemory( debugMeasureUsageInBytes: testMeasureMemoryUsage, ); @@ -165,8 +182,11 @@ void main() { // Lookup to force initialization. screenControllers.lookup(); - memoryUsageBytes = - convertBytes(3.1, from: ByteUnit.gb, to: ByteUnit.byte).round(); + memoryUsageBytes = convertBytes( + 3.1, + from: ByteUnit.gb, + to: ByteUnit.byte, + ).round(); result = await MemoryObserver.reduceMemory( debugMeasureUsageInBytes: testMeasureMemoryUsage, ); diff --git a/packages/devtools_app/test/screens/cpu_profiler/cpu_profiler_controller_test.dart b/packages/devtools_app/test/screens/cpu_profiler/cpu_profiler_controller_test.dart index d64a744463e..1331d3ab404 100644 --- a/packages/devtools_app/test/screens/cpu_profiler/cpu_profiler_controller_test.dart +++ b/packages/devtools_app/test/screens/cpu_profiler/cpu_profiler_controller_test.dart @@ -105,10 +105,9 @@ void main() { extentMicros: 100, processId: 'test', ); - final originalData = - controller.cpuProfileStore.lookupProfile( - label: CpuProfilerController.userTagNone, - )!; + final originalData = controller.cpuProfileStore.lookupProfile( + label: CpuProfilerController.userTagNone, + )!; expect( originalData.functionProfile.stackFrames.values.length, equals(17), @@ -118,12 +117,15 @@ void main() { expect(filteredData.stackFrames.values.length, equals(12)); // The native frame filter is applied by default. - final originalNativeFrames = - originalData.functionProfile.stackFrames.values - .where((sf) => sf.isNative) - .toList(); - final filteredNativeFrames = - filteredData.stackFrames.values.where((sf) => sf.isNative).toList(); + final originalNativeFrames = originalData + .functionProfile + .stackFrames + .values + .where((sf) => sf.isNative) + .toList(); + final filteredNativeFrames = filteredData.stackFrames.values + .where((sf) => sf.isNative) + .toList(); expect(originalNativeFrames.length, equals(5)); expect(filteredNativeFrames, isEmpty); }); @@ -135,10 +137,9 @@ void main() { extentMicros: 100, processId: 'test', ); - final originalData = - controller.cpuProfileStore.lookupProfile( - label: CpuProfilerController.userTagNone, - )!; + final originalData = controller.cpuProfileStore.lookupProfile( + label: CpuProfilerController.userTagNone, + )!; expect( originalData.functionProfile.stackFrames.values.length, equals(17), @@ -190,10 +191,9 @@ void main() { extentMicros: 100, processId: 'test', ); - final originalData = - controller.cpuProfileStore.lookupProfile( - label: CpuProfilerController.userTagNone, - )!; + final originalData = controller.cpuProfileStore.lookupProfile( + label: CpuProfilerController.userTagNone, + )!; expect( originalData.functionProfile.stackFrames.values.length, equals(17), diff --git a/packages/devtools_app/test/screens/cpu_profiler/cpu_profiler_test.dart b/packages/devtools_app/test/screens/cpu_profiler/cpu_profiler_test.dart index 7ddef68faba..c3ef60e50b5 100644 --- a/packages/devtools_app/test/screens/cpu_profiler/cpu_profiler_test.dart +++ b/packages/devtools_app/test/screens/cpu_profiler/cpu_profiler_test.dart @@ -659,10 +659,9 @@ void main() { sampleCount: 100, samplePeriod: 100, stackDepth: 128, - time: - TimeRange() - ..start = const Duration() - ..end = const Duration(microseconds: 10000), + time: TimeRange() + ..start = const Duration() + ..end = const Duration(microseconds: 10000), ); await tester.pumpWidget(wrap(CpuProfileStats(metadata: metadata))); await tester.pumpAndSettle(); @@ -699,10 +698,9 @@ void main() { sampleCount: 100, samplePeriod: 0, stackDepth: 128, - time: - TimeRange() - ..start = const Duration() - ..end = const Duration(microseconds: 10000), + time: TimeRange() + ..start = const Duration() + ..end = const Duration(microseconds: 10000), ); await tester.pumpWidget(wrap(CpuProfileStats(metadata: metadata))); await tester.pumpAndSettle(); diff --git a/packages/devtools_app/test/screens/cpu_profiler/method_table/method_table_model_test.dart b/packages/devtools_app/test/screens/cpu_profiler/method_table/method_table_model_test.dart index 5913253f311..ebe54bde1fc 100644 --- a/packages/devtools_app/test/screens/cpu_profiler/method_table/method_table_model_test.dart +++ b/packages/devtools_app/test/screens/cpu_profiler/method_table/method_table_model_test.dart @@ -18,10 +18,9 @@ void main() { profileMetaData: ProfileMetaData( sampleCount: 10, samplePeriod: 250, - time: - TimeRange() - ..start = Duration.zero - ..end = const Duration(seconds: 1), + time: TimeRange() + ..start = Duration.zero + ..end = const Duration(seconds: 1), ), stackFrameIds: {'1'}, ); @@ -34,10 +33,9 @@ void main() { profileMetaData: ProfileMetaData( sampleCount: 10, samplePeriod: 250, - time: - TimeRange() - ..start = Duration.zero - ..end = const Duration(seconds: 1), + time: TimeRange() + ..start = Duration.zero + ..end = const Duration(seconds: 1), ), stackFrameIds: {'2'}, ); @@ -50,10 +48,9 @@ void main() { profileMetaData: ProfileMetaData( sampleCount: 10, samplePeriod: 250, - time: - TimeRange() - ..start = Duration.zero - ..end = const Duration(seconds: 1), + time: TimeRange() + ..start = Duration.zero + ..end = const Duration(seconds: 1), ), stackFrameIds: {'3'}, ); @@ -66,10 +63,9 @@ void main() { profileMetaData: ProfileMetaData( sampleCount: 10, samplePeriod: 250, - time: - TimeRange() - ..start = Duration.zero - ..end = const Duration(seconds: 1), + time: TimeRange() + ..start = Duration.zero + ..end = const Duration(seconds: 1), ), stackFrameIds: {'4'}, ); diff --git a/packages/devtools_app/test/screens/debugger/debugger_screen_call_stack_test.dart b/packages/devtools_app/test/screens/debugger/debugger_screen_call_stack_test.dart index cbe4abe8038..d7379bb9756 100644 --- a/packages/devtools_app/test/screens/debugger/debugger_screen_call_stack_test.dart +++ b/packages/devtools_app/test/screens/debugger/debugger_screen_call_stack_test.dart @@ -145,8 +145,8 @@ void main() { ), ]; - final stackFramesWithLocation = - stackFrames.map((frame) { + final stackFramesWithLocation = stackFrames + .map((frame) { return StackFrameAndSourcePosition( frame, position: SourcePosition( @@ -154,7 +154,8 @@ void main() { column: 10, ), ); - }).toList(); + }) + .toList(); when( debuggerController.stackFramesWithLocation, diff --git a/packages/devtools_app/test/screens/debugger/eval_field_test.dart b/packages/devtools_app/test/screens/debugger/eval_field_test.dart index f2c5280333a..959cb92a901 100644 --- a/packages/devtools_app/test/screens/debugger/eval_field_test.dart +++ b/packages/devtools_app/test/screens/debugger/eval_field_test.dart @@ -155,9 +155,8 @@ void main() { final objects = await _setupEvalFieldObjects(tester); await tester.enterText(objects.textField, 'someValue.'); - objects - .searchTextEditingController - .selection = const TextSelection.collapsed(offset: 0); + objects.searchTextEditingController.selection = + const TextSelection.collapsed(offset: 0); await tester.pumpAndSettle(); expect(objects.searchTextEditingController.text, 'someValue.'); diff --git a/packages/devtools_app/test/screens/debugger/file_search_test.dart b/packages/devtools_app/test/screens/debugger/file_search_test.dart index 68839a4feef..7693fde1d81 100644 --- a/packages/devtools_app/test/screens/debugger/file_search_test.dart +++ b/packages/devtools_app/test/screens/debugger/file_search_test.dart @@ -388,10 +388,10 @@ List getAutoCompleteMatch( return matches .map( (match) => match.transformAutoCompleteMatch( - transformMatchedSegment: - (segment) => preserveCases ? segment : segment.toUpperCase(), - transformUnmatchedSegment: - (segment) => preserveCases ? segment : segment.toLowerCase(), + transformMatchedSegment: (segment) => + preserveCases ? segment : segment.toUpperCase(), + transformUnmatchedSegment: (segment) => + preserveCases ? segment : segment.toLowerCase(), combineSegments: (segments) => segments.join(), ), ) diff --git a/packages/devtools_app/test/screens/debugger/span_parser_test.dart b/packages/devtools_app/test/screens/debugger/span_parser_test.dart index b2201a663bd..42f64641373 100644 --- a/packages/devtools_app/test/screens/debugger/span_parser_test.dart +++ b/packages/devtools_app/test/screens/debugger/span_parser_test.dart @@ -32,14 +32,12 @@ void main() { final grammarFile = File(path.join('assets', 'dart_syntax.json')).absolute; late Grammar grammar; - final testDataDirectory = - Directory( - path.join('test', 'test_infra', 'test_data', 'syntax_highlighting'), - ).absolute; - final goldenDirectory = - Directory( - path.join('test', 'test_infra', 'goldens', 'syntax_highlighting'), - ).absolute; + final testDataDirectory = Directory( + path.join('test', 'test_infra', 'test_data', 'syntax_highlighting'), + ).absolute; + final goldenDirectory = Directory( + path.join('test', 'test_infra', 'goldens', 'syntax_highlighting'), + ).absolute; setUpAll(() async { expect(grammarFile.existsSync(), true); diff --git a/packages/devtools_app/test/screens/deep_link_validation/deep_links_screen_test.dart b/packages/devtools_app/test/screens/deep_link_validation/deep_links_screen_test.dart index e9d339d6b19..b124c1ab9c3 100644 --- a/packages/devtools_app/test/screens/deep_link_validation/deep_links_screen_test.dart +++ b/packages/devtools_app/test/screens/deep_link_validation/deep_links_screen_test.dart @@ -107,8 +107,9 @@ void main() { expect(find.byType(ProjectRootTextField), findsOneWidget); // Verify the project roots dropdown contains paths in the correct format. - final firstDropdownItemFinder = - find.byType(DropdownMenuItem).first; + final firstDropdownItemFinder = find + .byType(DropdownMenuItem) + .first; expect(firstDropdownItemFinder, findsWidgets); final firstDropdownItem = tester.widget>( firstDropdownItemFinder, diff --git a/packages/devtools_app/test/screens/inspector/diagnostics_test.dart b/packages/devtools_app/test/screens/inspector/diagnostics_test.dart index 9400f2ead69..1e1bb3e2457 100644 --- a/packages/devtools_app/test/screens/inspector/diagnostics_test.dart +++ b/packages/devtools_app/test/screens/inspector/diagnostics_test.dart @@ -201,15 +201,14 @@ void main() { final diagnosticsNodeFind = find.byType(DiagnosticsNodeDescription); // The icon is part of the clickable width, so we include it. - final measuredIconWidth = - tester - .getSize( - find.descendant( - of: diagnosticsNodeFind, - matching: find.byType(AssetImageIcon), - ), - ) - .width; + final measuredIconWidth = tester + .getSize( + find.descendant( + of: diagnosticsNodeFind, + matching: find.byType(AssetImageIcon), + ), + ) + .width; // There is only one rich text widget, containing the description. final richTextWidget = diff --git a/packages/devtools_app/test/screens/inspector/inspector_tree_test.dart b/packages/devtools_app/test/screens/inspector/inspector_tree_test.dart index 9d099ec2ae0..159e87c6241 100644 --- a/packages/devtools_app/test/screens/inspector/inspector_tree_test.dart +++ b/packages/devtools_app/test/screens/inspector/inspector_tree_test.dart @@ -53,8 +53,9 @@ void main() { bool isSummaryTree = false, }) async { final debuggerController = DebuggerController(); - final summaryTreeController = - isSummaryTree ? null : InspectorTreeController(); + final summaryTreeController = isSummaryTree + ? null + : InspectorTreeController(); await tester.pumpWidget( wrapWithControllers( debugger: debuggerController, @@ -73,12 +74,11 @@ void main() { testWidgets('Row with negative index regression test', ( WidgetTester tester, ) async { - final treeController = - InspectorTreeController() - ..config = InspectorTreeConfig( - onNodeAdded: (_, _) {}, - onClientActiveChange: (_) {}, - ); + final treeController = InspectorTreeController() + ..config = InspectorTreeConfig( + onNodeAdded: (_, _) {}, + onClientActiveChange: (_) {}, + ); await pumpInspectorTree(tester, treeController: treeController); expect(treeController.getRow(const Offset(0, -100.0)), isNull); @@ -87,8 +87,8 @@ void main() { expect(treeController.getRow(const Offset(0, 0.0)), isNull); expect(treeController.getRowOffset(0), equals(0)); - treeController.root = - InspectorTreeNode()..appendChild(InspectorTreeNode()); + treeController.root = InspectorTreeNode() + ..appendChild(InspectorTreeNode()); await pumpInspectorTree(tester, treeController: treeController); @@ -119,7 +119,12 @@ void main() { testWidgets('Shows preview from Text.rich', (WidgetTester tester) async { final diagnosticNode = await widgetToInspectorTreeDiagnosticsNode( widget: const Text.rich( - TextSpan(children: [TextSpan(text: 'Rich '), TextSpan(text: 'text')]), + TextSpan( + children: [ + TextSpan(text: 'Rich '), + TextSpan(text: 'text'), + ], + ), ), tester: tester, ); diff --git a/packages/devtools_app/test/screens/inspector/layout_explorer/inspector_data_models_test.dart b/packages/devtools_app/test/screens/inspector/layout_explorer/inspector_data_models_test.dart index 213eb84054f..a8e0cd0d86a 100644 --- a/packages/devtools_app/test/screens/inspector/layout_explorer/inspector_data_models_test.dart +++ b/packages/devtools_app/test/screens/inspector/layout_explorer/inspector_data_models_test.dart @@ -224,12 +224,12 @@ void main() { required MainAxisAlignment mainAxisAlignment, }) => Row( textDirection: flipMainAxis ? TextDirection.rtl : TextDirection.ltr, - mainAxisAlignment: - flipMainAxis ? mainAxisAlignment.reversed : mainAxisAlignment, - children: - flipMainAxis - ? childrenWidgets.reversed.toList() - : childrenWidgets, + mainAxisAlignment: flipMainAxis + ? mainAxisAlignment.reversed + : mainAxisAlignment, + children: flipMainAxis + ? childrenWidgets.reversed.toList() + : childrenWidgets, ); for (final mainAxisAlignment in MainAxisAlignment.values) { final originalWidgetRenderProperties = childrenRenderProperties( diff --git a/packages/devtools_app/test/screens/inspector/utils/inspector_tree.dart b/packages/devtools_app/test/screens/inspector/utils/inspector_tree.dart index b9492d42c56..88963611a34 100644 --- a/packages/devtools_app/test/screens/inspector/utils/inspector_tree.dart +++ b/packages/devtools_app/test/screens/inspector/utils/inspector_tree.dart @@ -12,15 +12,14 @@ import 'package:flutter_test/flutter_test.dart'; InspectorTreeController inspectorTreeControllerFromNode( RemoteDiagnosticsNode node, ) { - final controller = - InspectorTreeController() - ..config = InspectorTreeConfig( - onNodeAdded: (_, _) {}, - onClientActiveChange: (_) {}, - ); - - controller.root = - InspectorTreeNode()..appendChild(InspectorTreeNode()..diagnostic = node); + final controller = InspectorTreeController() + ..config = InspectorTreeConfig( + onNodeAdded: (_, _) {}, + onClientActiveChange: (_) {}, + ); + + controller.root = InspectorTreeNode() + ..appendChild(InspectorTreeNode()..diagnostic = node); return controller; } diff --git a/packages/devtools_app/test/screens/inspector_v2/diagnostics_test.dart b/packages/devtools_app/test/screens/inspector_v2/diagnostics_test.dart index 7da2b9a18bb..97f24b660f7 100644 --- a/packages/devtools_app/test/screens/inspector_v2/diagnostics_test.dart +++ b/packages/devtools_app/test/screens/inspector_v2/diagnostics_test.dart @@ -203,15 +203,14 @@ void main() { final diagnosticsNodeFind = find.byType(DiagnosticsNodeDescription); // The icon is part of the clickable width, so we include it. - final measuredIconWidth = - tester - .getSize( - find.descendant( - of: diagnosticsNodeFind, - matching: find.byType(AssetImageIcon), - ), - ) - .width; + final measuredIconWidth = tester + .getSize( + find.descendant( + of: diagnosticsNodeFind, + matching: find.byType(AssetImageIcon), + ), + ) + .width; // There is only one rich text widget, containing the description. final richTextWidget = diff --git a/packages/devtools_app/test/screens/inspector_v2/inspector_integration_test.dart b/packages/devtools_app/test/screens/inspector_v2/inspector_integration_test.dart index 879ba23ee19..8d69f8614a9 100644 --- a/packages/devtools_app/test/screens/inspector_v2/inspector_integration_test.dart +++ b/packages/devtools_app/test/screens/inspector_v2/inspector_integration_test.dart @@ -301,8 +301,9 @@ void main() { final diagnostics = state.controller.inspectorTree.rowsInTree.value.map( (row) => row!.node.diagnostic, ); - final textDiagnostic = - diagnostics.firstWhere((d) => d?.description == 'Text')!; + final textDiagnostic = diagnostics.firstWhere( + (d) => d?.description == 'Text', + )!; expect(textDiagnostic.isCreatedByLocalProject, isTrue); // Toggle implementation widgets off. diff --git a/packages/devtools_app/test/screens/inspector_v2/inspector_screen_test.dart b/packages/devtools_app/test/screens/inspector_v2/inspector_screen_test.dart index fb6b7743cdb..303e1cfe8f6 100644 --- a/packages/devtools_app/test/screens/inspector_v2/inspector_screen_test.dart +++ b/packages/devtools_app/test/screens/inspector_v2/inspector_screen_test.dart @@ -316,10 +316,9 @@ void main() { 'should render StoryOfYourFlexWidget', windowSize, (WidgetTester tester) async { - final controller = - TestInspectorV2Controller() - ..setSelectedNode(treeNode) - ..setSelectedDiagnostic(diagnostic); + final controller = TestInspectorV2Controller() + ..setSelectedNode(treeNode) + ..setSelectedDiagnostic(diagnostic); await tester.pumpWidget( MaterialApp( home: Scaffold(body: WidgetDetails(controller: controller)), diff --git a/packages/devtools_app/test/screens/inspector_v2/inspector_tree_test.dart b/packages/devtools_app/test/screens/inspector_v2/inspector_tree_test.dart index 0b01565c5e6..f134241186b 100644 --- a/packages/devtools_app/test/screens/inspector_v2/inspector_tree_test.dart +++ b/packages/devtools_app/test/screens/inspector_v2/inspector_tree_test.dart @@ -74,12 +74,11 @@ void main() { testWidgets('Row with negative index regression test', ( WidgetTester tester, ) async { - final treeController = - InspectorTreeController() - ..config = InspectorTreeConfig( - onNodeAdded: (_, _) {}, - onClientActiveChange: (_) {}, - ); + final treeController = InspectorTreeController() + ..config = InspectorTreeConfig( + onNodeAdded: (_, _) {}, + onClientActiveChange: (_) {}, + ); await pumpInspectorTree(tester, treeController: treeController); expect(treeController.rowForOffset(const Offset(0, -100.0)), isNull); @@ -88,8 +87,8 @@ void main() { expect(treeController.rowForOffset(const Offset(0, 0.0)), isNull); expect(treeController.rowOffset(0), equals(0)); - treeController.root = - InspectorTreeNode()..appendChild(InspectorTreeNode()); + treeController.root = InspectorTreeNode() + ..appendChild(InspectorTreeNode()); await pumpInspectorTree(tester, treeController: treeController); @@ -120,7 +119,12 @@ void main() { testWidgets('Shows preview from Text.rich', (WidgetTester tester) async { final diagnosticNode = await widgetToInspectorTreeDiagnosticsNode( widget: const Text.rich( - TextSpan(children: [TextSpan(text: 'Rich '), TextSpan(text: 'text')]), + TextSpan( + children: [ + TextSpan(text: 'Rich '), + TextSpan(text: 'text'), + ], + ), ), tester: tester, ); diff --git a/packages/devtools_app/test/screens/inspector_v2/layout_explorer/inspector_data_models_test.dart b/packages/devtools_app/test/screens/inspector_v2/layout_explorer/inspector_data_models_test.dart index f08c1a1ea36..6c8302d73df 100644 --- a/packages/devtools_app/test/screens/inspector_v2/layout_explorer/inspector_data_models_test.dart +++ b/packages/devtools_app/test/screens/inspector_v2/layout_explorer/inspector_data_models_test.dart @@ -224,12 +224,12 @@ void main() { required MainAxisAlignment mainAxisAlignment, }) => Row( textDirection: flipMainAxis ? TextDirection.rtl : TextDirection.ltr, - mainAxisAlignment: - flipMainAxis ? mainAxisAlignment.reversed : mainAxisAlignment, - children: - flipMainAxis - ? childrenWidgets.reversed.toList() - : childrenWidgets, + mainAxisAlignment: flipMainAxis + ? mainAxisAlignment.reversed + : mainAxisAlignment, + children: flipMainAxis + ? childrenWidgets.reversed.toList() + : childrenWidgets, ); for (final mainAxisAlignment in MainAxisAlignment.values) { final originalWidgetRenderProperties = childrenRenderProperties( diff --git a/packages/devtools_app/test/screens/inspector_v2/utils/inspector_tree.dart b/packages/devtools_app/test/screens/inspector_v2/utils/inspector_tree.dart index 0a30a4b982c..d2aac2767d3 100644 --- a/packages/devtools_app/test/screens/inspector_v2/utils/inspector_tree.dart +++ b/packages/devtools_app/test/screens/inspector_v2/utils/inspector_tree.dart @@ -15,15 +15,14 @@ import 'package:flutter_test/flutter_test.dart'; InspectorTreeController inspectorTreeControllerFromNode( RemoteDiagnosticsNode node, ) { - final controller = - InspectorTreeController() - ..config = InspectorTreeConfig( - onNodeAdded: (_, _) {}, - onClientActiveChange: (_) {}, - ); - - controller.root = - InspectorTreeNode()..appendChild(InspectorTreeNode()..diagnostic = node); + final controller = InspectorTreeController() + ..config = InspectorTreeConfig( + onNodeAdded: (_, _) {}, + onClientActiveChange: (_) {}, + ); + + controller.root = InspectorTreeNode() + ..appendChild(InspectorTreeNode()..diagnostic = node); return controller; } diff --git a/packages/devtools_app/test/screens/logging/logging_screen_data_test.dart b/packages/devtools_app/test/screens/logging/logging_screen_data_test.dart index 0b675e5d8ab..968ef191e1c 100644 --- a/packages/devtools_app/test/screens/logging/logging_screen_data_test.dart +++ b/packages/devtools_app/test/screens/logging/logging_screen_data_test.dart @@ -295,13 +295,10 @@ LogData _generate(int i) { break; } - final detailsComputer = - computedDetails == null - ? null - : () => Future.delayed( - const Duration(seconds: 1), - () => computedDetails!, - ); + final detailsComputer = computedDetails == null + ? null + : () => + Future.delayed(const Duration(seconds: 1), () => computedDetails!); return LogData(kind, details, i, detailsComputer: detailsComputer); } diff --git a/packages/devtools_app/test/screens/logging/metadata_test.dart b/packages/devtools_app/test/screens/logging/metadata_test.dart index 55b9f82d374..7844d0a40d4 100644 --- a/packages/devtools_app/test/screens/logging/metadata_test.dart +++ b/packages/devtools_app/test/screens/logging/metadata_test.dart @@ -92,15 +92,14 @@ void main() { wrapSimple( Column( key: testKey, - children: - testLogs.map((log) { - return Flexible( - child: Padding( - padding: const EdgeInsets.all(8.0), - child: MetadataChips(data: log), - ), - ); - }).toList(), + children: testLogs.map((log) { + return Flexible( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: MetadataChips(data: log), + ), + ); + }).toList(), ), ), ); diff --git a/packages/devtools_app/test/screens/memory/diff/controller/diff_pane_controller_test.dart b/packages/devtools_app/test/screens/memory/diff/controller/diff_pane_controller_test.dart index c571a4dc499..8531dde587a 100644 --- a/packages/devtools_app/test/screens/memory/diff/controller/diff_pane_controller_test.dart +++ b/packages/devtools_app/test/screens/memory/diff/controller/diff_pane_controller_test.dart @@ -46,8 +46,8 @@ void main() { final controller = scene.controller.diff; - final snapshots = - controller.core.snapshots.value.whereType(); + final snapshots = controller.core.snapshots.value + .whereType(); expect(snapshots.length, 2); snapshots.first.diffWith.value = snapshots.last; @@ -59,8 +59,8 @@ void main() { ); final fromJson = DiffPaneController.fromJson(json); - final snapshotsFromJson = - fromJson.core.snapshots.value.whereType(); + final snapshotsFromJson = fromJson.core.snapshots.value + .whereType(); expect(snapshotsFromJson.length, 2); expect( diff --git a/packages/devtools_app/test/screens/memory/diff/controller/heap_diff_test.dart b/packages/devtools_app/test/screens/memory/diff/controller/heap_diff_test.dart index 1ee2cbdc5cd..e8e0bec4090 100644 --- a/packages/devtools_app/test/screens/memory/diff/controller/heap_diff_test.dart +++ b/packages/devtools_app/test/screens/memory/diff/controller/heap_diff_test.dart @@ -56,13 +56,12 @@ void main() { created2, ], graphAfter); - final diff = - DiffClassData.compare( - before: classBefore, - dataBefore: await testHeapData(graphBefore), - after: classAfter, - dataAfter: await testHeapData(graphAfter), - )!; + final diff = DiffClassData.compare( + before: classBefore, + dataBefore: await testHeapData(graphBefore), + after: classAfter, + dataAfter: await testHeapData(graphAfter), + )!; expect(diff.className, className); expect(diff.diff.created.instanceCount, 2); @@ -82,13 +81,12 @@ void main() { final classBefore = testClassData(className, [deleted], graphBefore); - final diff = - DiffClassData.compare( - before: classBefore, - dataBefore: await testHeapData(graphBefore), - after: null, - dataAfter: await testHeapData(), - )!; + final diff = DiffClassData.compare( + before: classBefore, + dataBefore: await testHeapData(graphBefore), + after: null, + dataAfter: await testHeapData(), + )!; expect(diff.className, className); expect(diff.diff.created.instanceCount, 0); diff --git a/packages/devtools_app/test/screens/memory/diff/widgets/class_filter_test.dart b/packages/devtools_app/test/screens/memory/diff/widgets/class_filter_test.dart index 2cd45424b06..72d18a519d3 100644 --- a/packages/devtools_app/test/screens/memory/diff/widgets/class_filter_test.dart +++ b/packages/devtools_app/test/screens/memory/diff/widgets/class_filter_test.dart @@ -59,10 +59,9 @@ void main() { hasLength(2), ); - final diffWith = - test.isDiff - ? scene.diffController.core.snapshots.value[1] as SnapshotDataItem - : null; + final diffWith = test.isDiff + ? scene.diffController.core.snapshots.value[1] as SnapshotDataItem + : null; scene.diffController.setDiffing( scene.diffController.derived.selectedItem.value as SnapshotDataItem, diff --git a/packages/devtools_app/test/screens/memory/framework/memory_controller_test.dart b/packages/devtools_app/test/screens/memory/framework/memory_controller_test.dart index 081b0b010ff..3ae0e033662 100644 --- a/packages/devtools_app/test/screens/memory/framework/memory_controller_test.dart +++ b/packages/devtools_app/test/screens/memory/framework/memory_controller_test.dart @@ -63,10 +63,9 @@ void main() { late final CpuSamples allocationTracingProfile; setUpAll(() { - final rawProfile = - File( - 'test/test_infra/test_data/memory/allocation_tracing/allocation_trace.json', - ).readAsStringSync(); + final rawProfile = File( + 'test/test_infra/test_data/memory/allocation_tracing/allocation_trace.json', + ).readAsStringSync(); allocationTracingProfile = CpuSamples.parse(jsonDecode(rawProfile))!; }); diff --git a/packages/devtools_app/test/screens/memory/shared/heap/heap_analyzer_test.dart b/packages/devtools_app/test/screens/memory/shared/heap/heap_analyzer_test.dart index d37cefb2eb9..45e96c3aa81 100644 --- a/packages/devtools_app/test/screens/memory/shared/heap/heap_analyzer_test.dart +++ b/packages/devtools_app/test/screens/memory/shared/heap/heap_analyzer_test.dart @@ -39,23 +39,23 @@ final _sizeTests = [ ), _SizeTest( name: 'Two objects heap', - heap: - FakeHeapSnapshotGraph()..setObjects({ - 1: [2], - 2: [], - }), + heap: FakeHeapSnapshotGraph() + ..setObjects({ + 1: [2], + 2: [], + }), rootRetainedSize: 2, unreachableSize: 0, ), _SizeTest( name: 'Four objects heap', - heap: - FakeHeapSnapshotGraph()..setObjects({ - 1: [2, 3, 4], - 2: [], - 3: [], - 4: [], - }), + heap: FakeHeapSnapshotGraph() + ..setObjects({ + 1: [2, 3, 4], + 2: [], + 3: [], + 4: [], + }), rootRetainedSize: 4, unreachableSize: 0, ), @@ -69,20 +69,20 @@ final _sizeTests = [ ), _SizeTest( name: 'Many unreachable objects heap', - heap: - FakeHeapSnapshotGraph()..setObjects({ - // Reachable: - 1: [2, 3, 4], - 2: [], - 3: [], - 4: [], + heap: FakeHeapSnapshotGraph() + ..setObjects({ + // Reachable: + 1: [2, 3, 4], + 2: [], + 3: [], + 4: [], - // Unreachable: - 5: [6, 7, 8], - 6: [], - 7: [], - 8: [], - }), + // Unreachable: + 5: [6, 7, 8], + 6: [], + 7: [], + 8: [], + }), rootRetainedSize: 4, unreachableSize: 4, ), @@ -95,15 +95,14 @@ final _sizeTests = [ // 2w 3 // | // 4 - heap: - FakeHeapSnapshotGraph() - ..setObjects({ - 1: [2, 3], - }) - ..addObjects({ - 2: [4], - }, weak: true) - ..addObjects({3: [], 4: []}), + heap: FakeHeapSnapshotGraph() + ..setObjects({ + 1: [2, 3], + }) + ..addObjects({ + 2: [4], + }, weak: true) + ..addObjects({3: [], 4: []}), rootRetainedSize: 3, unreachableSize: 1, ), @@ -114,16 +113,15 @@ final _sizeTests = [ // 2w 3w // | \ // 4 5 - heap: - FakeHeapSnapshotGraph() - ..setObjects({ - 1: [2, 3], - }) - ..addObjects({ - 2: [4], - 3: [5], - }, weak: true) - ..addObjects({4: [], 5: []}), + heap: FakeHeapSnapshotGraph() + ..setObjects({ + 1: [2, 3], + }) + ..addObjects({ + 2: [4], + 3: [5], + }, weak: true) + ..addObjects({4: [], 5: []}), rootRetainedSize: 3, unreachableSize: 2, ), @@ -133,13 +131,13 @@ final _sizeTests = [ name: 'Diamond', // |\ // \| - heap: - FakeHeapSnapshotGraph()..setObjects({ - 1: [2, 3], - 2: [4], - 3: [4], - 4: [], - }), + heap: FakeHeapSnapshotGraph() + ..setObjects({ + 1: [2, 3], + 2: [4], + 3: [4], + 4: [], + }), rootRetainedSize: 4, unreachableSize: 0, ), @@ -148,14 +146,14 @@ final _sizeTests = [ // \ // |\ // \| - heap: - FakeHeapSnapshotGraph()..setObjects({ - 1: [2], - 2: [3, 4], - 3: [5], - 4: [5], - 5: [], - }), + heap: FakeHeapSnapshotGraph() + ..setObjects({ + 1: [2], + 2: [3, 4], + 3: [5], + 4: [5], + 5: [], + }), rootRetainedSize: 5, unreachableSize: 0, ), @@ -164,19 +162,18 @@ final _sizeTests = [ // \ // |\ // \| - heap: - FakeHeapSnapshotGraph() - ..setObjects({ - 1: [2], - 2: [3, 4], - }) - ..addObjects({ - 3: [5], - }, weak: true) - ..addObjects({ - 4: [5], - 5: [], - }), + heap: FakeHeapSnapshotGraph() + ..setObjects({ + 1: [2], + 2: [3, 4], + }) + ..addObjects({ + 3: [5], + }, weak: true) + ..addObjects({ + 4: [5], + 5: [], + }), rootRetainedSize: 5, unreachableSize: 0, ), @@ -185,17 +182,16 @@ final _sizeTests = [ // \ // |\ // \| - heap: - FakeHeapSnapshotGraph() - ..setObjects({ - 1: [2], - 2: [3, 4], - }) - ..addObjects({ - 3: [5], - 4: [5], - }, weak: true) - ..addObjects({5: []}), + heap: FakeHeapSnapshotGraph() + ..setObjects({ + 1: [2], + 2: [3, 4], + }) + ..addObjects({ + 3: [5], + 4: [5], + }, weak: true) + ..addObjects({5: []}), rootRetainedSize: 4, unreachableSize: 1, ), diff --git a/packages/devtools_app/test/screens/memory/shared/heap/heap_test.dart b/packages/devtools_app/test/screens/memory/shared/heap/heap_test.dart index 7bc221c1e2c..9e6527be19c 100644 --- a/packages/devtools_app/test/screens/memory/shared/heap/heap_test.dart +++ b/packages/devtools_app/test/screens/memory/shared/heap/heap_test.dart @@ -28,59 +28,59 @@ final _classB = HeapClassName.fromPath(className: 'B', library: 'l'); final _classSizeTests = <_ClassSizeTest>[ _ClassSizeTest( name: 'separate', - heap: - FakeHeapSnapshotGraph()..setObjects( - { - 1: [2, 3, 4], - 2: [], - 3: [], - 4: [], - }, - classes: {1: _root, 2: _classA, 3: _classA, 4: _classA}, - ), + heap: FakeHeapSnapshotGraph() + ..setObjects( + { + 1: [2, 3, 4], + 2: [], + 3: [], + 4: [], + }, + classes: {1: _root, 2: _classA, 3: _classA, 4: _classA}, + ), expectedClassARetainedSize: 3, ), _ClassSizeTest( name: 'linked', - heap: - FakeHeapSnapshotGraph()..setObjects( - { - 1: [2], - 2: [3], - 3: [4], - 4: [], - }, - classes: {1: _root, 2: _classA, 3: _classA, 4: _classA}, - ), + heap: FakeHeapSnapshotGraph() + ..setObjects( + { + 1: [2], + 2: [3], + 3: [4], + 4: [], + }, + classes: {1: _root, 2: _classA, 3: _classA, 4: _classA}, + ), expectedClassARetainedSize: 3, ), _ClassSizeTest( name: 'full graph', - heap: - FakeHeapSnapshotGraph()..setObjects( - { - 1: [2], - 2: [3, 4], - 3: [2, 4], - 4: [2, 3], - }, - classes: {1: _root, 2: _classA, 3: _classA, 4: _classA}, - ), + heap: FakeHeapSnapshotGraph() + ..setObjects( + { + 1: [2], + 2: [3, 4], + 3: [2, 4], + 4: [2, 3], + }, + classes: {1: _root, 2: _classA, 3: _classA, 4: _classA}, + ), expectedClassARetainedSize: 3, ), _ClassSizeTest( name: 'with global B', - heap: - FakeHeapSnapshotGraph()..setObjects( - { - 1: [2], - 2: [3, 5], - 3: [4, 5], - 4: [2, 3], - 5: [], - }, - classes: {1: _root, 2: _classA, 3: _classA, 4: _classA, 5: _classB}, - ), + heap: FakeHeapSnapshotGraph() + ..setObjects( + { + 1: [2], + 2: [3, 5], + 3: [4, 5], + 4: [2, 3], + 5: [], + }, + classes: {1: _root, 2: _classA, 3: _classA, 4: _classA, 5: _classB}, + ), expectedClassARetainedSize: 4, ), ]; diff --git a/packages/devtools_app/test/screens/memory/tracing/tracing_view_test.dart b/packages/devtools_app/test/screens/memory/tracing/tracing_view_test.dart index 0c8ddf9e17d..3d850ab2645 100644 --- a/packages/devtools_app/test/screens/memory/tracing/tracing_view_test.dart +++ b/packages/devtools_app/test/screens/memory/tracing/tracing_view_test.dart @@ -65,10 +65,9 @@ void main() { } setUpAll(() { - final rawProfile = - File( - 'test/test_infra/test_data/memory/allocation_tracing/allocation_trace.json', - ).readAsStringSync(); + final rawProfile = File( + 'test/test_infra/test_data/memory/allocation_tracing/allocation_trace.json', + ).readAsStringSync(); allocationTracingProfile = CpuSamples.parse(jsonDecode(rawProfile))!; }); @@ -395,10 +394,9 @@ void main() { await tester.tap(checkboxes.first); await tester.pumpAndSettle(); - final tracedClassList = - state.filteredClassList.value - .where((e) => e.traceAllocations) - .toList(); + final tracedClassList = state.filteredClassList.value + .where((e) => e.traceAllocations) + .toList(); expect(tracedClassList.length, 1); expect(tracedClassList.first.clazz, classList.classes!.first); @@ -413,10 +411,9 @@ void main() { await clearFilter(tester, controller); // Check tracing state wasn't corrupted - final updatedTracedClassList = - state.filteredClassList.value - .where((e) => e.traceAllocations) - .toList(); + final updatedTracedClassList = state.filteredClassList.value + .where((e) => e.traceAllocations) + .toList(); expect(updatedTracedClassList, containsAll(tracedClassList)); expect(updatedTracedClassList.first.traceAllocations, true); }); diff --git a/packages/devtools_app/test/screens/network/network_controller_test.dart b/packages/devtools_app/test/screens/network/network_controller_test.dart index 256df4407ea..a66bffae707 100644 --- a/packages/devtools_app/test/screens/network/network_controller_test.dart +++ b/packages/devtools_app/test/screens/network/network_controller_test.dart @@ -300,26 +300,31 @@ void main() { }; final request1Pending = HttpProfileRequest.parse(httpBaseObject)!; - final request1Done = - HttpProfileRequest.parse({ - ...httpBaseObject, - 'endTime': endTime, - 'response': { - 'startTime': startTime, - 'endTime': endTime, - 'redirects': [], - 'statusCode': 200, - }, - })!; - final request2Pending = - HttpProfileRequest.parse({...httpBaseObject, 'id': '102'})!; + final request1Done = HttpProfileRequest.parse({ + ...httpBaseObject, + 'endTime': endTime, + 'response': { + 'startTime': startTime, + 'endTime': endTime, + 'redirects': [], + 'statusCode': 200, + }, + })!; + final request2Pending = HttpProfileRequest.parse({ + ...httpBaseObject, + 'id': '102', + })!; final socketStats1Pending = SocketStatistic.parse({...socketStatObject})!; - final socketStats1Done = - SocketStatistic.parse({...socketStatObject, 'endTime': endTime})!; - - final socketStats2Pending = - SocketStatistic.parse({...socketStatObject, 'id': '22'})!; + final socketStats1Done = SocketStatistic.parse({ + ...socketStatObject, + 'endTime': endTime, + })!; + + final socketStats2Pending = SocketStatistic.parse({ + ...socketStatObject, + 'id': '22', + })!; test( 'adding multiple socket and http requests notifies listeners only once', diff --git a/packages/devtools_app/test/screens/network/network_profiler_test.dart b/packages/devtools_app/test/screens/network/network_profiler_test.dart index c3f640c081a..15253ee4cf9 100644 --- a/packages/devtools_app/test/screens/network/network_profiler_test.dart +++ b/packages/devtools_app/test/screens/network/network_profiler_test.dart @@ -314,8 +314,8 @@ void main() { ) .first, ); - final selectableTextWidget = - textElement.findAncestorWidgetOfExactType()!; + final selectableTextWidget = textElement + .findAncestorWidgetOfExactType()!; await tester.tap(find.byWidget(selectableTextWidget)); await tester.pumpAndSettle(); diff --git a/packages/devtools_app/test/screens/performance/timeline_events/timeline_event_processor_test.dart b/packages/devtools_app/test/screens/performance/timeline_events/timeline_event_processor_test.dart index 42951ceb30e..5189e08ddad 100644 --- a/packages/devtools_app/test/screens/performance/timeline_events/timeline_event_processor_test.dart +++ b/packages/devtools_app/test/screens/performance/timeline_events/timeline_event_processor_test.dart @@ -52,18 +52,16 @@ void main() { when( mockPerformanceController.timelineEventsController, ).thenReturn(timelineEventsController); - processor = - timelineEventsController.perfettoController.processor - ..primeTrackIds(ui: testUiTrackId, raster: testRasterTrackId); - - trackEvents = - allTrackEventPackets - .map( - (packetJson) => PerfettoTrackEvent.fromPacket( - TracePacket.fromJson(jsonEncode(packetJson)), - ), - ) - .toList(); + processor = timelineEventsController.perfettoController.processor + ..primeTrackIds(ui: testUiTrackId, raster: testRasterTrackId); + + trackEvents = allTrackEventPackets + .map( + (packetJson) => PerfettoTrackEvent.fromPacket( + TracePacket.fromJson(jsonEncode(packetJson)), + ), + ) + .toList(); }); test('slice events form timeline event tree', () { diff --git a/packages/devtools_app/test/shared/analytics/analytics_test.dart b/packages/devtools_app/test/shared/analytics/analytics_test.dart index 475b1cc1683..4504b0f3172 100644 --- a/packages/devtools_app/test/shared/analytics/analytics_test.dart +++ b/packages/devtools_app/test/shared/analytics/analytics_test.dart @@ -11,8 +11,9 @@ import 'package:test/test.dart'; void main() { group('createStackTraceForAnalytics for stack trace', () { - final fileUriBase = - Platform.isWindows ? 'file:///c:/b/s/w' : 'file:///b/s/w'; + final fileUriBase = Platform.isWindows + ? 'file:///c:/b/s/w' + : 'file:///b/s/w'; test( 'with DevTools stack frames near the top', () { diff --git a/packages/devtools_app/test/shared/ansi_output_test.dart b/packages/devtools_app/test/shared/ansi_output_test.dart index ab8d24753c4..e0de53d7af3 100644 --- a/packages/devtools_app/test/shared/ansi_output_test.dart +++ b/packages/devtools_app/test/shared/ansi_output_test.dart @@ -142,13 +142,12 @@ void main() { break; } - final detailsComputer = - computedDetails == null - ? null - : () => Future.delayed( - const Duration(seconds: 1), - () => computedDetails!, - ); + final detailsComputer = computedDetails == null + ? null + : () => Future.delayed( + const Duration(seconds: 1), + () => computedDetails!, + ); return LogData(kind, details, i, detailsComputer: detailsComputer); } diff --git a/packages/devtools_app/test/shared/charts/flame_chart_test.dart b/packages/devtools_app/test/shared/charts/flame_chart_test.dart index b9354bc63e5..01fbe08e25a 100644 --- a/packages/devtools_app/test/shared/charts/flame_chart_test.dart +++ b/packages/devtools_app/test/shared/charts/flame_chart_test.dart @@ -715,18 +715,17 @@ void main() { node ??= testNode; await tester.pumpWidget( Builder( - builder: - (context) => Directionality( - textDirection: TextDirection.ltr, - child: node!.buildWidget( - selected: selected, - searchMatch: false, - activeSearchMatch: false, - hovered: hovered, - zoom: zoom, - theme: Theme.of(context), - ), - ), + builder: (context) => Directionality( + textDirection: TextDirection.ltr, + child: node!.buildWidget( + selected: selected, + searchMatch: false, + activeSearchMatch: false, + hovered: hovered, + zoom: zoom, + theme: Theme.of(context), + ), + ), ), ); } diff --git a/packages/devtools_app/test/shared/charts/treemap_test.dart b/packages/devtools_app/test/shared/charts/treemap_test.dart index 7946de69a29..65805f87548 100644 --- a/packages/devtools_app/test/shared/charts/treemap_test.dart +++ b/packages/devtools_app/test/shared/charts/treemap_test.dart @@ -64,10 +64,11 @@ void main() { final grandchild2 = TreemapNode(name: 'package:grandchild2'); final greatGrandchild1 = TreemapNode(name: 'package:greatGrandchild1'); final greatGrandchild2 = TreemapNode(name: 'package:greatGrandchild2'); - final testRoot = TreemapNode(name: 'libapp.so (Dart AOT)')..addAllChildren([ - child1..addChild(grandchild1..addChild(greatGrandchild1)), - child2..addChild(grandchild2..addChild(greatGrandchild2)), - ]); + final testRoot = TreemapNode(name: 'libapp.so (Dart AOT)') + ..addAllChildren([ + child1..addChild(grandchild1..addChild(greatGrandchild1)), + child2..addChild(grandchild2..addChild(greatGrandchild2)), + ]); final nodeWithDuplicatePackageNameGrandchild = TreemapNode( name: 'grandchild', diff --git a/packages/devtools_app/test/shared/diagnostics/inspector_service_test.dart b/packages/devtools_app/test/shared/diagnostics/inspector_service_test.dart index 43aee756de2..e761817975f 100644 --- a/packages/devtools_app/test/shared/diagnostics/inspector_service_test.dart +++ b/packages/devtools_app/test/shared/diagnostics/inspector_service_test.dart @@ -88,8 +88,8 @@ void main() { const testPubRootDirectory = '/alpha/bravo/charlie'; // Empty the pubroot directories. - final initialPubRootDirectories = - await inspectorServiceLocal.getPubRootDirectories(); + final initialPubRootDirectories = await inspectorServiceLocal + .getPubRootDirectories(); await inspectorServiceLocal.removePubRootDirectories( initialPubRootDirectories!, ); @@ -128,9 +128,8 @@ void main() { await inspectorServiceLocal.isWidgetCreationTracked(), isTrue, ); - final rootLibrary = - await serviceConnection.serviceManager - .mainIsolateRootLibraryUriAsString(); + final rootLibrary = await serviceConnection.serviceManager + .mainIsolateRootLibraryUriAsString(); await inspectorServiceLocal.addPubRootDirectories([rootLibrary!]); final rootDirectories = await inspectorServiceLocal.getPubRootDirectories() ?? @@ -205,8 +204,8 @@ void main() { // These tests are moot if widget creation is not tracked. expect(await inspectorServiceLocal.isWidgetCreationTracked(), isTrue); await inspectorServiceLocal.addPubRootDirectories([]); - final originalRootDirectories = - await inspectorServiceLocal.getPubRootDirectories(); + final originalRootDirectories = await inspectorServiceLocal + .getPubRootDirectories(); try { await inspectorServiceLocal.addPubRootDirectories([ '/usr/me/clients/google3/foo/bar/baz/lib/src/bla', @@ -266,11 +265,10 @@ void main() { test('isSummaryTree = true', () async { await env.setupEnvironment(); final group = inspectorService!.createObjectGroup('test-group'); - final root = - (await group.getRoot( - FlutterTreeType.widget, - isSummaryTree: true, - ))!; + final root = (await group.getRoot( + FlutterTreeType.widget, + isSummaryTree: true, + ))!; // Tree only contains widgets from local app. expect( treeToDebugString(root), @@ -327,18 +325,19 @@ void main() { // First get a node in the summary tree: final group = inspectorService!.createObjectGroup('test-group'); - final root = - (await group.getRoot( - FlutterTreeType.widget, - isSummaryTree: true, - ))!; - RemoteDiagnosticsNode nodeInSummaryTree = - findNodeMatching(root, 'MaterialApp')!; + final root = (await group.getRoot( + FlutterTreeType.widget, + isSummaryTree: true, + ))!; + RemoteDiagnosticsNode nodeInSummaryTree = findNodeMatching( + root, + 'MaterialApp', + )!; expect(nodeInSummaryTree, isNotNull); // Then get the details tree for the node in the summary tree: - RemoteDiagnosticsNode nodeInDetailsTree = - (await group.getDetailsSubtree(nodeInSummaryTree))!; + RemoteDiagnosticsNode nodeInDetailsTree = (await group + .getDetailsSubtree(nodeInSummaryTree))!; // When flutter rolls, this string may sometimes change due to // implementation details. @@ -354,8 +353,9 @@ void main() { equalsIgnoringHashCodes('Text\n'), ); - nodeInDetailsTree = - (await group.getDetailsSubtree(nodeInSummaryTree))!; + nodeInDetailsTree = (await group.getDetailsSubtree( + nodeInSummaryTree, + ))!; expect( treeToDebugString(nodeInDetailsTree), @@ -370,8 +370,10 @@ void main() { ); await group.setSelectionInspector(nodeInDetailsTree.valueRef, true); - final selection = - (await group.getSelection(null, FlutterTreeType.widget))!; + final selection = (await group.getSelection( + null, + FlutterTreeType.widget, + ))!; expect(selection, isNotNull); expect(selection.valueRef, equals(nodeInDetailsTree.valueRef)); expect( diff --git a/packages/devtools_app/test/shared/eval_integration_test.dart b/packages/devtools_app/test/shared/eval_integration_test.dart index ebd96fc8de3..36be55665f8 100644 --- a/packages/devtools_app/test/shared/eval_integration_test.dart +++ b/packages/devtools_app/test/shared/eval_integration_test.dart @@ -59,8 +59,10 @@ void main() { final instance = (await eval.asyncEval('42', isAlive: isAlive))!; expect(instance.valueAsString, '42'); - final instance2 = - (await eval.asyncEval('Future.value(42)', isAlive: isAlive))!; + final instance2 = (await eval.asyncEval( + 'Future.value(42)', + isAlive: isAlive, + ))!; expect(instance2.classRef!.name, '_Future'); }, timeout: const Timeout.factor(2), @@ -84,12 +86,11 @@ void main() { isolate: mainIsolate, ); - final instance = - (await eval.asyncEval( - // The delay asserts that there is no issue with garbage collection - 'await Future.delayed(const Duration(milliseconds: 500), () => 42)', - isAlive: isAlive, - ))!; + final instance = (await eval.asyncEval( + // The delay asserts that there is no issue with garbage collection + 'await Future.delayed(const Duration(milliseconds: 500), () => 42)', + isAlive: isAlive, + ))!; expect(instance.valueAsString, '42'); }, @@ -116,10 +117,9 @@ void main() { isAlive: isAlive, ) .then( - (_) => - throw Exception( - 'The FutureFailedException was not thrown as expected.', - ), + (_) => throw Exception( + 'The FutureFailedException was not thrown as expected.', + ), onError: (Object? err) => err, ); diff --git a/packages/devtools_app/test/shared/framework/screens_test.dart b/packages/devtools_app/test/shared/framework/screens_test.dart index f980c351e34..14bf1d36f9e 100644 --- a/packages/devtools_app/test/shared/framework/screens_test.dart +++ b/packages/devtools_app/test/shared/framework/screens_test.dart @@ -21,8 +21,9 @@ void main() { group('ScreenMetaData', () { test('values matches order of screens', () { final enumOrder = ScreenMetaData.values.map((s) => s.id).toList(); - final screenOrder = - defaultScreens().map((screen) => screen.screen.screenId).toList(); + final screenOrder = defaultScreens() + .map((screen) => screen.screen.screenId) + .toList(); // Remove any items that don't exist in both - we can't verify // the order of those. @@ -43,14 +44,12 @@ void main() { setUp(() { screen1 = SimpleScreen(const Placeholder()); screen2 = SimpleScreen(const Placeholder()); - extensionScreen1 = - DevToolsScreen( - ExtensionScreen(StubDevToolsExtensions.someToolExtension), - ).screen; - extensionScreen2 = - DevToolsScreen( - ExtensionScreen(StubDevToolsExtensions.barExtension), - ).screen; + extensionScreen1 = DevToolsScreen( + ExtensionScreen(StubDevToolsExtensions.someToolExtension), + ).screen; + extensionScreen2 = DevToolsScreen( + ExtensionScreen(StubDevToolsExtensions.barExtension), + ).screen; screens = [screen1, screen2, extensionScreen1, extensionScreen2]; }); diff --git a/packages/devtools_app/test/shared/framework/visible_screens_test.dart b/packages/devtools_app/test/shared/framework/visible_screens_test.dart index 01e6fda04f8..08fa495760d 100644 --- a/packages/devtools_app/test/shared/framework/visible_screens_test.dart +++ b/packages/devtools_app/test/shared/framework/visible_screens_test.dart @@ -270,9 +270,8 @@ void main() { }); } -List get visibleScreenTypes => - defaultScreens() - .map((s) => s.screen) - .where((s) => shouldShowScreen(s).show) - .map((s) => s.runtimeType) - .toList(); +List get visibleScreenTypes => defaultScreens() + .map((s) => s.screen) + .where((s) => shouldShowScreen(s).show) + .map((s) => s.runtimeType) + .toList(); diff --git a/packages/devtools_app/test/shared/import_export_test.dart b/packages/devtools_app/test/shared/import_export_test.dart index 61e31771a41..409531bfd3a 100644 --- a/packages/devtools_app/test/shared/import_export_test.dart +++ b/packages/devtools_app/test/shared/import_export_test.dart @@ -26,15 +26,14 @@ void main() { ExportController.generateFileName(time: t, type: ExportFileType.json), ); - final sortedByFileName = - dates - .map( - (t) => ExportController.generateFileName( - time: t, - type: ExportFileType.json, - ), - ) - .sorted(); + final sortedByFileName = dates + .map( + (t) => ExportController.generateFileName( + time: t, + type: ExportFileType.json, + ), + ) + .sorted(); expect(sortedByTime, sortedByFileName); }); diff --git a/packages/devtools_app/test/shared/memory/retaining_path_test.dart b/packages/devtools_app/test/shared/memory/retaining_path_test.dart index 8ccafbd86f0..13794071b79 100644 --- a/packages/devtools_app/test/shared/memory/retaining_path_test.dart +++ b/packages/devtools_app/test/shared/memory/retaining_path_test.dart @@ -33,16 +33,16 @@ void main() { final classB = HeapClassName.fromPath(className: 'B', library: 'l'); final classC = HeapClassName.fromPath(className: 'C', library: 'l'); - final graph = - FakeHeapSnapshotGraph()..setObjects( - { - 1: [2], - 2: [3], - 3: [4], - 4: [], - }, - classes: {1: root, 2: classA, 3: classB, 4: classC}, - ); + final graph = FakeHeapSnapshotGraph() + ..setObjects( + { + 1: [2], + 2: [3], + 3: [4], + 4: [], + }, + classes: {1: root, 2: classA, 3: classB, 4: classC}, + ); const shortestRetainers = [0, 0, 1, 2, 3]; PathFromRoot objectPath(int index) => PathFromRoot.forObject( diff --git a/packages/devtools_app/test/shared/preferences/preferences_controller_test.dart b/packages/devtools_app/test/shared/preferences/preferences_controller_test.dart index de1078317b8..84c19eb95a7 100644 --- a/packages/devtools_app/test/shared/preferences/preferences_controller_test.dart +++ b/packages/devtools_app/test/shared/preferences/preferences_controller_test.dart @@ -206,8 +206,8 @@ void main() { 'custom pub root directories are cached across multiple connections', () async { var directories = controller.pubRootDirectories.value; - var cachedDirectories = - await controller.readCachedPubRootDirectories(); + var cachedDirectories = await controller + .readCachedPubRootDirectories(); expect(directories, containsAll(customPubRootDirectories)); expect(cachedDirectories, containsAll(customPubRootDirectories)); @@ -228,8 +228,8 @@ void main() { 'test_dir/fake_app/custom_dir3', ], shouldCache: true); - final cachedDirectories = - await controller.readCachedPubRootDirectories(); + final cachedDirectories = await controller + .readCachedPubRootDirectories(); expect( cachedDirectories, @@ -246,8 +246,8 @@ void main() { () async { const notRemoved = 'test_dir/fake_app/custom_dir1'; const removed = 'test_dir/fake_app/custom_dir2'; - var cachedDirectories = - await controller.readCachedPubRootDirectories(); + var cachedDirectories = await controller + .readCachedPubRootDirectories(); expect(cachedDirectories, containsAll([notRemoved, removed])); @@ -266,8 +266,8 @@ void main() { }); test('does not save inferred directory to local cache', () async { - final cachedDirectories = - await controller.readCachedPubRootDirectories(); + final cachedDirectories = await controller + .readCachedPubRootDirectories(); expect(cachedDirectories, isNot(contains('test_dir/fake_app/'))); }); @@ -278,8 +278,8 @@ void main() { await controller.addPubRootDirectories([ 'test_dir/fake_app/do_not_cache_dir', ]); - final cachedDirectories = - await controller.readCachedPubRootDirectories(); + final cachedDirectories = await controller + .readCachedPubRootDirectories(); expect( cachedDirectories, diff --git a/packages/devtools_app/test/shared/primitives/trees_test.dart b/packages/devtools_app/test/shared/primitives/trees_test.dart index 898b1c56270..35046f75d34 100644 --- a/packages/devtools_app/test/shared/primitives/trees_test.dart +++ b/packages/devtools_app/test/shared/primitives/trees_test.dart @@ -327,17 +327,17 @@ void main() { treeNodeI = TraversalTestTreeNode('I'); treeNodeJ = TraversalTestTreeNode('J'); - tree = - treeNodeA..addAllChildren([ - treeNodeB..addAllChildren([ - treeNodeE..addAllChildren([treeNodeH]), - treeNodeF, - ]), - treeNodeC, - treeNodeD..addAllChildren([ - treeNodeG..addAllChildren([treeNodeI, treeNodeJ]), - ]), - ]); + tree = treeNodeA + ..addAllChildren([ + treeNodeB..addAllChildren([ + treeNodeE..addAllChildren([treeNodeH]), + treeNodeF, + ]), + treeNodeC, + treeNodeD..addAllChildren([ + treeNodeG..addAllChildren([treeNodeI, treeNodeJ]), + ]), + ]); }); group('BFS', () { @@ -361,11 +361,10 @@ void main() { }); test('finds the correct node', () { - final node = - breadthFirstTraversal( - tree, - returnCondition: (node) => node.id == 'H', - )!; + final node = breadthFirstTraversal( + tree, + returnCondition: (node) => node.id == 'H', + )!; expect(node.id, equals('H')); }); }); @@ -391,11 +390,10 @@ void main() { }); test('finds the correct node', () { - final node = - depthFirstTraversal( - tree, - returnCondition: (node) => node.id == 'H', - )!; + final node = depthFirstTraversal( + tree, + returnCondition: (node) => node.id == 'H', + )!; expect(node.id, equals('H')); }); @@ -436,15 +434,15 @@ final treeNode9 = TestTreeNode(9, tag: 'test-tag'); final treeNode10 = TestTreeNode(10); final treeNode11 = TestTreeNode(11); final treeNode12 = TestTreeNode(12); -final testTreeNode = - treeNode0..addAllChildren([ - treeNode1, - treeNode2..addAllChildren([treeNode10, treeNode11, treeNode12]), - treeNode3..addAllChildren([ - treeNode4, - treeNode5..addAllChildren([treeNode6, treeNode7, treeNode8, treeNode9]), - ]), - ]); +final testTreeNode = treeNode0 + ..addAllChildren([ + treeNode1, + treeNode2..addAllChildren([treeNode10, treeNode11, treeNode12]), + treeNode3..addAllChildren([ + treeNode4, + treeNode5..addAllChildren([treeNode6, treeNode7, treeNode8, treeNode9]), + ]), + ]); class TestTreeNode extends TreeNode { TestTreeNode(this.id, {this.tag}); diff --git a/packages/devtools_app/test/shared/primitives/utils_test.dart b/packages/devtools_app/test/shared/primitives/utils_test.dart index 3cdbdb2a772..267b22f7c3f 100644 --- a/packages/devtools_app/test/shared/primitives/utils_test.dart +++ b/packages/devtools_app/test/shared/primitives/utils_test.dart @@ -269,30 +269,24 @@ void main() { }); test('overlaps', () { - final t = - TimeRange() - ..start = const Duration(milliseconds: 100) - ..end = const Duration(milliseconds: 200); - final overlapBeginning = - TimeRange() - ..start = const Duration(milliseconds: 50) - ..end = const Duration(milliseconds: 150); - final overlapMiddle = - TimeRange() - ..start = const Duration(milliseconds: 125) - ..end = const Duration(milliseconds: 175); - final overlapEnd = - TimeRange() - ..start = const Duration(milliseconds: 150) - ..end = const Duration(milliseconds: 250); - final overlapAll = - TimeRange() - ..start = const Duration(milliseconds: 50) - ..end = const Duration(milliseconds: 250); - final noOverlap = - TimeRange() - ..start = const Duration(milliseconds: 300) - ..end = const Duration(milliseconds: 400); + final t = TimeRange() + ..start = const Duration(milliseconds: 100) + ..end = const Duration(milliseconds: 200); + final overlapBeginning = TimeRange() + ..start = const Duration(milliseconds: 50) + ..end = const Duration(milliseconds: 150); + final overlapMiddle = TimeRange() + ..start = const Duration(milliseconds: 125) + ..end = const Duration(milliseconds: 175); + final overlapEnd = TimeRange() + ..start = const Duration(milliseconds: 150) + ..end = const Duration(milliseconds: 250); + final overlapAll = TimeRange() + ..start = const Duration(milliseconds: 50) + ..end = const Duration(milliseconds: 250); + final noOverlap = TimeRange() + ..start = const Duration(milliseconds: 300) + ..end = const Duration(milliseconds: 400); expect(t.overlaps(t), isTrue); expect(t.overlaps(overlapBeginning), isTrue); @@ -303,30 +297,24 @@ void main() { }); test('containsRange', () { - final t = - TimeRange() - ..start = const Duration(milliseconds: 100) - ..end = const Duration(milliseconds: 200); - final containsStart = - TimeRange() - ..start = const Duration(milliseconds: 50) - ..end = const Duration(milliseconds: 150); - final containsStartAndEnd = - TimeRange() - ..start = const Duration(milliseconds: 125) - ..end = const Duration(milliseconds: 175); - final containsEnd = - TimeRange() - ..start = const Duration(milliseconds: 150) - ..end = const Duration(milliseconds: 250); - final invertedContains = - TimeRange() - ..start = const Duration(milliseconds: 50) - ..end = const Duration(milliseconds: 250); - final containsNeither = - TimeRange() - ..start = const Duration(milliseconds: 300) - ..end = const Duration(milliseconds: 400); + final t = TimeRange() + ..start = const Duration(milliseconds: 100) + ..end = const Duration(milliseconds: 200); + final containsStart = TimeRange() + ..start = const Duration(milliseconds: 50) + ..end = const Duration(milliseconds: 150); + final containsStartAndEnd = TimeRange() + ..start = const Duration(milliseconds: 125) + ..end = const Duration(milliseconds: 175); + final containsEnd = TimeRange() + ..start = const Duration(milliseconds: 150) + ..end = const Duration(milliseconds: 250); + final invertedContains = TimeRange() + ..start = const Duration(milliseconds: 50) + ..end = const Duration(milliseconds: 250); + final containsNeither = TimeRange() + ..start = const Duration(milliseconds: 300) + ..end = const Duration(milliseconds: 400); expect(t.containsRange(containsStart), isFalse); expect(t.containsRange(containsStartAndEnd), isTrue); @@ -377,10 +365,9 @@ void main() { group('offset', () { test('from well formed time range', () { - final t = - TimeRange() - ..start = const Duration(milliseconds: 100) - ..end = const Duration(milliseconds: 200); + final t = TimeRange() + ..start = const Duration(milliseconds: 100) + ..end = const Duration(milliseconds: 200); final offset = TimeRange.offset( original: t, offset: const Duration(milliseconds: 300), diff --git a/packages/devtools_app/test/shared/table/table_test.dart b/packages/devtools_app/test/shared/table/table_test.dart index 3998b5973f0..62ba9c32d95 100644 --- a/packages/devtools_app/test/shared/table/table_test.dart +++ b/packages/devtools_app/test/shared/table/table_test.dart @@ -1152,27 +1152,25 @@ void main() { setUp(() { treeColumn = _NameColumn(); _NumberColumn(); - tree1 = - TestData('Foo', 0) + tree1 = TestData('Foo', 0) + ..children.addAll([ + TestData('Bar', 1) ..children.addAll([ - TestData('Bar', 1) - ..children.addAll([ - TestData('Baz', 2), - TestData('Qux', 3), - TestData('Snap', 4), - TestData('Crackle', 5), - TestData('Pop', 5), - ]), - TestData('Baz', 7), - TestData('Qux', 6), - ]) - ..expandCascading(); - tree2 = - TestData('Foo_2', 0) - ..children.add( - TestData('Bar_2', 1)..children.add(TestData('Snap_2', 2)), - ) - ..expandCascading(); + TestData('Baz', 2), + TestData('Qux', 3), + TestData('Snap', 4), + TestData('Crackle', 5), + TestData('Pop', 5), + ]), + TestData('Baz', 7), + TestData('Qux', 6), + ]) + ..expandCascading(); + tree2 = TestData('Foo_2', 0) + ..children.add( + TestData('Bar_2', 1)..children.add(TestData('Snap_2', 2)), + ) + ..expandCascading(); }); testWidgets('displays with simple content', (WidgetTester tester) async { @@ -1574,18 +1572,17 @@ void main() { testWidgets('properly colors rows with alternating colors', ( WidgetTester tester, ) async { - final data = - TestData('Foo', 0) + final data = TestData('Foo', 0) + ..children.addAll([ + TestData('Bar', 1) ..children.addAll([ - TestData('Bar', 1) - ..children.addAll([ - TestData('Baz', 2), - TestData('Qux', 3), - TestData('Snap', 4), - ]), - TestData('Crackle', 5), - ]) - ..expandCascading(); + TestData('Baz', 2), + TestData('Qux', 3), + TestData('Snap', 4), + ]), + TestData('Crackle', 5), + ]) + ..expandCascading(); final table = TreeTable( columns: [_NumberColumn(), treeColumn], dataRoots: [data], diff --git a/packages/devtools_app/test/shared/ui/filter_test.dart b/packages/devtools_app/test/shared/ui/filter_test.dart index b5de27beee1..6d5ac0417b4 100644 --- a/packages/devtools_app/test/shared/ui/filter_test.dart +++ b/packages/devtools_app/test/shared/ui/filter_test.dart @@ -397,9 +397,8 @@ class _TestController extends DisposableController SettingFilter<_TestDataClass, int>( id: 'min-rating-level', name: 'Hide items below the minimum rating level', - includeCallback: - (_TestDataClass element, int currentFilterValue) => - element.rating >= currentFilterValue, + includeCallback: (_TestDataClass element, int currentFilterValue) => + element.rating >= currentFilterValue, enabledCallback: (int filterValue) => filterValue > 1, possibleValues: [1, 2, 3, 4, 5], defaultValue: 2, diff --git a/packages/devtools_app/test/shared/ui/hover_test.dart b/packages/devtools_app/test/shared/ui/hover_test.dart index 06483ddc6e3..b5181d5de37 100644 --- a/packages/devtools_app/test/shared/ui/hover_test.dart +++ b/packages/devtools_app/test/shared/ui/hover_test.dart @@ -8,15 +8,24 @@ import 'package:flutter_test/flutter_test.dart'; const _textSpan = TextSpan( children: [ - TextSpan(text: 'hello', style: TextStyle(fontWeight: FontWeight.bold)), + TextSpan( + text: 'hello', + style: TextStyle(fontWeight: FontWeight.bold), + ), TextSpan(text: ' '), TextSpan(text: 'world'), TextSpan(text: ' '), - TextSpan(text: 'foo', style: TextStyle(fontWeight: FontWeight.bold)), + TextSpan( + text: 'foo', + style: TextStyle(fontWeight: FontWeight.bold), + ), TextSpan(text: '.'), TextSpan(text: 'bar'), TextSpan(text: '.'), - TextSpan(text: 'baz', style: TextStyle(fontWeight: FontWeight.w100)), + TextSpan( + text: 'baz', + style: TextStyle(fontWeight: FontWeight.w100), + ), TextSpan(text: ' '), TextSpan(text: 'blah'), ], diff --git a/packages/devtools_app/test/shared/ui/ui_utils_test.dart b/packages/devtools_app/test/shared/ui/ui_utils_test.dart index 59cab3b5089..16982a068e1 100644 --- a/packages/devtools_app/test/shared/ui/ui_utils_test.dart +++ b/packages/devtools_app/test/shared/ui/ui_utils_test.dart @@ -105,9 +105,18 @@ void main() { text: 'parent', style: TextStyle(color: Colors.red), children: [ - TextSpan(text: 'foo', style: TextStyle(color: Colors.blue)), - TextSpan(text: 'bar', style: TextStyle(color: Colors.green)), - TextSpan(text: 'baz', style: TextStyle(color: Colors.yellow)), + TextSpan( + text: 'foo', + style: TextStyle(color: Colors.blue), + ), + TextSpan( + text: 'bar', + style: TextStyle(color: Colors.green), + ), + TextSpan( + text: 'baz', + style: TextStyle(color: Colors.yellow), + ), ], ); expect( diff --git a/packages/devtools_app/test/shared/ui/vm_flag_widgets_test.dart b/packages/devtools_app/test/shared/ui/vm_flag_widgets_test.dart index 94d72448b73..e35bd05d7f1 100644 --- a/packages/devtools_app/test/shared/ui/vm_flag_widgets_test.dart +++ b/packages/devtools_app/test/shared/ui/vm_flag_widgets_test.dart @@ -34,8 +34,9 @@ void main() { await fakeServiceConnection.serviceManager.flagsInitialized.future; dropdown = CpuSamplingRateDropdown( screenId: ProfilerScreen.id, - profilePeriodFlagNotifier: - fakeServiceConnection.vmFlagManager.flag(profilePeriod)!, + profilePeriodFlagNotifier: fakeServiceConnection.vmFlagManager.flag( + profilePeriod, + )!, ); }); @@ -85,8 +86,9 @@ void main() { ); expect(dropdownButton.value, equals(CpuSamplingRate.medium.value)); - var profilePeriodFlag = - (await getProfileGranularityFlag(fakeServiceConnection))!; + var profilePeriodFlag = (await getProfileGranularityFlag( + fakeServiceConnection, + ))!; expect( profilePeriodFlag.valueAsString, equals(CpuSamplingRate.medium.value), @@ -102,8 +104,9 @@ void main() { ); expect(dropdownButton.value, equals(CpuSamplingRate.high.value)); - profilePeriodFlag = - (await getProfileGranularityFlag(fakeServiceConnection))!; + profilePeriodFlag = (await getProfileGranularityFlag( + fakeServiceConnection, + ))!; expect(profilePeriodFlag.name, equals(profilePeriod)); expect( profilePeriodFlag.valueAsString, @@ -125,8 +128,9 @@ void main() { ); expect(dropdownButton.value, equals(CpuSamplingRate.low.value)); - profilePeriodFlag = - (await getProfileGranularityFlag(fakeServiceConnection))!; + profilePeriodFlag = (await getProfileGranularityFlag( + fakeServiceConnection, + ))!; expect(profilePeriodFlag.name, equals(profilePeriod)); expect( profilePeriodFlag.valueAsString, diff --git a/packages/devtools_app/test/standalone_ui/vs_code/devtools_test.dart b/packages/devtools_app/test/standalone_ui/vs_code/devtools_test.dart index d1fcbd38429..eb549f8d601 100644 --- a/packages/devtools_app/test/standalone_ui/vs_code/devtools_test.dart +++ b/packages/devtools_app/test/standalone_ui/vs_code/devtools_test.dart @@ -74,17 +74,16 @@ void main() { group('$DevToolsSidebarOptions', () { for (final hasDebugSessions in [true, false]) { - final debugSessions = - hasDebugSessions - ? { - 'test session': generateDebugSession( - debuggerType: 'Flutter', - deviceId: 'macos', - flutterMode: 'debug', - projectRootPath: testDtdProjectRoot, - ), - } - : {}; + final debugSessions = hasDebugSessions + ? { + 'test session': generateDebugSession( + debuggerType: 'Flutter', + deviceId: 'macos', + flutterMode: 'debug', + projectRootPath: testDtdProjectRoot, + ), + } + : {}; testWidgetsWithWindowSize( 'pumps DevTools screens ${hasDebugSessions ? 'with' : 'without'} debug ' diff --git a/packages/devtools_app/test/test_infra/fixtures/networking_app/bin/main.dart b/packages/devtools_app/test/test_infra/fixtures/networking_app/bin/main.dart index 48dd5da9214..29c00d88ce1 100644 --- a/packages/devtools_app/test/test_infra/fixtures/networking_app/bin/main.dart +++ b/packages/devtools_app/test/test_infra/fixtures/networking_app/bin/main.dart @@ -147,11 +147,10 @@ class _HttpClient { void packageHttpPostStreamed() async { print('Sending streamed package:http POST...'); - final request = - http.StreamedRequest('POST', _uri) - ..contentLength = 20 - ..sink.add([11, 12, 13, 14, 15, 16, 17, 18, 19, 20]) - ..sink.add([21, 22, 23, 24, 25, 26, 27, 28, 29, 30]); + final request = http.StreamedRequest('POST', _uri) + ..contentLength = 20 + ..sink.add([11, 12, 13, 14, 15, 16, 17, 18, 19, 20]) + ..sink.add([21, 22, 23, 24, 25, 26, 27, 28, 29, 30]); unawaited(request.sink.close()); final response = await request.send(); diff --git a/packages/devtools_app/test/test_infra/flutter_test_driver.dart b/packages/devtools_app/test/test_infra/flutter_test_driver.dart index 8d1c602c4a9..99eda70e734 100644 --- a/packages/devtools_app/test/test_infra/flutter_test_driver.dart +++ b/packages/devtools_app/test/test_infra/flutter_test_driver.dart @@ -56,8 +56,9 @@ abstract class FlutterTestDriver { String _debugPrint(String msg) { const maxLength = 500; - final truncatedMsg = - msg.length > maxLength ? '${msg.substring(0, maxLength)}...' : msg; + final truncatedMsg = msg.length > maxLength + ? '${msg.substring(0, maxLength)}...' + : msg; _allMessages.add(truncatedMsg); if (_printDebugOutputToStdOut) { print('$_logPrefix$truncatedMsg'); @@ -223,10 +224,9 @@ abstract class FlutterTestDriver { return _timeoutWithMessages>( () => response.future, timeout: timeout, - message: - event != null - ? 'Did not receive expected $event event.' - : 'Did not receive response to request "$id".', + message: event != null + ? 'Did not receive expected $event event.' + : 'Did not receive response to request "$id".', ).whenComplete(() => sub.cancel()); } diff --git a/packages/devtools_app/test/test_infra/scenes/memory/default.dart b/packages/devtools_app/test/test_infra/scenes/memory/default.dart index 2ce1ef5db17..0e6002392e2 100644 --- a/packages/devtools_app/test/test_infra/scenes/memory/default.dart +++ b/packages/devtools_app/test/test_infra/scenes/memory/default.dart @@ -56,14 +56,19 @@ abstract class MemoryDefaultSceneHeaps { {'B': 1, 'C': 2, 'D': 3}, {'B': 1, 'C': 2, 'D': 3}, ] - .map((e) => () async => FakeHeapSnapshotGraph()..addClassInstances(e)) + .map( + (e) => + () async => FakeHeapSnapshotGraph()..addClassInstances(e), + ) .toList(); - static final golden = - goldenHeapTests - // ignore: avoid-redundant-async, match signature - .map((e) => () async => e.loadHeap()) - .toList(); + static final golden = goldenHeapTests + // ignore: avoid-redundant-async, match signature + .map( + (e) => + () async => e.loadHeap(), + ) + .toList(); static List get all => [ ...forDiffTesting, @@ -154,11 +159,11 @@ class MemoryDefaultScene extends Scene { final profileController = ProfilePaneController(rootPackage: 'root') ..setFilter(showAllFilter); - controller = - MemoryController()..init( - connectedDiff: diffController, - connectedProfile: profileController, - ); + controller = MemoryController() + ..init( + connectedDiff: diffController, + connectedProfile: profileController, + ); await controller.initialized; diff --git a/packages/devtools_app/test/test_infra/scenes/standalone_ui/editor_service/simulated_editor.dart b/packages/devtools_app/test/test_infra/scenes/standalone_ui/editor_service/simulated_editor.dart index fb82ee270c6..41c7eeec437 100644 --- a/packages/devtools_app/test/test_infra/scenes/standalone_ui/editor_service/simulated_editor.dart +++ b/packages/devtools_app/test/test_infra/scenes/standalone_ui/editor_service/simulated_editor.dart @@ -282,11 +282,10 @@ class SimulatedEditor { FutureOr enablePlatformType(String platformType) { for (var MapEntry(key: id, value: device) in devices.entries) { if (!device.supported && device.platformType == platformType) { - device = - devices[id] = EditorDevice.fromJson({ - ...device.toJson(), - 'supported': true, - }); + device = devices[id] = EditorDevice.fromJson({ + ...device.toJson(), + 'supported': true, + }); sendDeviceChanged(device); } } diff --git a/packages/devtools_app/test/test_infra/scenes/standalone_ui/mock_editor_widget.dart b/packages/devtools_app/test/test_infra/scenes/standalone_ui/mock_editor_widget.dart index 7ebbc86602d..196401e8bad 100644 --- a/packages/devtools_app/test/test_infra/scenes/standalone_ui/mock_editor_widget.dart +++ b/packages/devtools_app/test/test_infra/scenes/standalone_ui/mock_editor_widget.dart @@ -136,18 +136,16 @@ class _MockEditorWidgetState extends State children: [ const Text('Editor: '), ElevatedButton( - onPressed: - editor.connected - ? null - : _withUpdate(editor.connectEditor), + onPressed: editor.connected + ? null + : _withUpdate(editor.connectEditor), child: const Text('Connect'), ), const SizedBox(width: denseSpacing), ElevatedButton( - onPressed: - editor.connected - ? _withUpdate(editor.disconnectEditor) - : null, + onPressed: editor.connected + ? _withUpdate(editor.disconnectEditor) + : null, child: const Text('Disconnect'), ), ], @@ -173,42 +171,38 @@ class _MockEditorWidgetState extends State Row( children: [ ElevatedButton( - onPressed: - () => editor.startSession( - debuggerType: 'Flutter', - deviceId: 'macos', - flutterMode: 'debug', - ), + onPressed: () => editor.startSession( + debuggerType: 'Flutter', + deviceId: 'macos', + flutterMode: 'debug', + ), child: const Text('Desktop debug'), ), const SizedBox(width: denseSpacing), ElevatedButton( - onPressed: - () => editor.startSession( - debuggerType: 'Flutter', - deviceId: 'macos', - flutterMode: 'profile', - ), + onPressed: () => editor.startSession( + debuggerType: 'Flutter', + deviceId: 'macos', + flutterMode: 'profile', + ), child: const Text('Desktop profile'), ), const SizedBox(width: denseSpacing), ElevatedButton( - onPressed: - () => editor.startSession( - debuggerType: 'Flutter', - deviceId: 'macos', - flutterMode: 'release', - ), + onPressed: () => editor.startSession( + debuggerType: 'Flutter', + deviceId: 'macos', + flutterMode: 'release', + ), child: const Text('Desktop release'), ), const SizedBox(width: denseSpacing), ElevatedButton( - onPressed: - () => editor.startSession( - debuggerType: 'Flutter', - deviceId: 'macos', - flutterMode: 'jit_release', - ), + onPressed: () => editor.startSession( + debuggerType: 'Flutter', + deviceId: 'macos', + flutterMode: 'jit_release', + ), child: const Text('Desktop jit_release'), ), ], @@ -217,32 +211,29 @@ class _MockEditorWidgetState extends State Row( children: [ ElevatedButton( - onPressed: - () => editor.startSession( - debuggerType: 'Flutter', - deviceId: 'chrome', - flutterMode: 'debug', - ), + onPressed: () => editor.startSession( + debuggerType: 'Flutter', + deviceId: 'chrome', + flutterMode: 'debug', + ), child: const Text('Web debug'), ), const SizedBox(width: denseSpacing), ElevatedButton( - onPressed: - () => editor.startSession( - debuggerType: 'Flutter', - deviceId: 'chrome', - flutterMode: 'profile', - ), + onPressed: () => editor.startSession( + debuggerType: 'Flutter', + deviceId: 'chrome', + flutterMode: 'profile', + ), child: const Text('Web profile'), ), const SizedBox(width: denseSpacing), ElevatedButton( - onPressed: - () => editor.startSession( - debuggerType: 'Flutter', - deviceId: 'chrome', - flutterMode: 'release', - ), + onPressed: () => editor.startSession( + debuggerType: 'Flutter', + deviceId: 'chrome', + flutterMode: 'release', + ), child: const Text('Web release'), ), ], @@ -251,11 +242,10 @@ class _MockEditorWidgetState extends State Row( children: [ ElevatedButton( - onPressed: - () => editor.startSession( - debuggerType: 'Dart', - deviceId: 'macos', - ), + onPressed: () => editor.startSession( + debuggerType: 'Dart', + deviceId: 'macos', + ), child: const Text('Dart CLI'), ), ], @@ -294,24 +284,21 @@ class _MockEditorWidgetState extends State builder: (context, logRing, _) { return ListView.builder( itemCount: logRing.length, - itemBuilder: - (context, index) => - OutlineDecoration.onlyBottom( - child: Container( - width: double.infinity, - padding: - const EdgeInsets.symmetric( - vertical: denseSpacing, - ), - child: Text( - logRing.elementAt(index), - style: - Theme.of( - context, - ).fixedFontStyle, - ), - ), + itemBuilder: (context, index) => + OutlineDecoration.onlyBottom( + child: Container( + width: double.infinity, + padding: const EdgeInsets.symmetric( + vertical: denseSpacing, + ), + child: Text( + logRing.elementAt(index), + style: Theme.of( + context, + ).fixedFontStyle, ), + ), + ), ); }, ), diff --git a/packages/devtools_app/test/test_infra/scenes/standalone_ui/property_editor_sidebar.dart b/packages/devtools_app/test/test_infra/scenes/standalone_ui/property_editor_sidebar.dart index 8d1a8feccb1..6346811359d 100644 --- a/packages/devtools_app/test/test_infra/scenes/standalone_ui/property_editor_sidebar.dart +++ b/packages/devtools_app/test/test_infra/scenes/standalone_ui/property_editor_sidebar.dart @@ -66,17 +66,16 @@ class _PropertyEditorState extends State<_PropertyEditorSidebar> { Widget build(BuildContext context) { return IdeThemedMaterialApp( home: Scaffold( - body: - clientLog != null && clientDtd != null && editor != null - ? MockEditorWidget( - editor: editor!, - clientLog: clientLog!, - child: PropertyEditorPanel(clientDtd!), - ) - : _DtdUriForm( - onSaved: _connectToDtd, - formKey: GlobalKey(), - ), + body: clientLog != null && clientDtd != null && editor != null + ? MockEditorWidget( + editor: editor!, + clientLog: clientLog!, + child: PropertyEditorPanel(clientDtd!), + ) + : _DtdUriForm( + onSaved: _connectToDtd, + formKey: GlobalKey(), + ), ), ); } diff --git a/packages/devtools_app/test/test_infra/test_data/cpu_profiler/cpu_profile.dart b/packages/devtools_app/test/test_infra/test_data/cpu_profiler/cpu_profile.dart index 23f3e500d44..df193d74ece 100644 --- a/packages/devtools_app/test/test_infra/test_data/cpu_profiler/cpu_profile.dart +++ b/packages/devtools_app/test/test_infra/test_data/cpu_profiler/cpu_profile.dart @@ -678,60 +678,62 @@ final goldenResolvedUriMap = { 'package:flutter/widgets/binding.dart', }; -final goldenCpuProfileStackFrames = Map.from(subProfileStackFrames)..addAll({ - '140357727781376-12': { - 'category': 'Dart', - 'name': 'RenderPhysicalModel.paint', - 'parent': '140357727781376-9', - 'resolvedUrl': - 'path/to/flutter/packages/flutter/lib/src/rendering/proxy_box.dart', - 'packageUri': 'package:flutter/lib/src/rendering/proxy_box.dart', - 'sourceLine': null, - }, - '140357727781376-13': { - 'category': 'Dart', - 'name': 'RenderCustomMultiChildLayoutBox.paint', - 'parent': '140357727781376-12', - 'resolvedUrl': - 'path/to/flutter/packages/flutter/lib/src/rendering/custom_layout.dart', - 'packageUri': 'package:flutter/rendering/custom_layout.dart', - 'sourceLine': null, - }, - '140357727781376-14': { - 'category': 'Dart', - 'name': '_RenderCustomMultiChildLayoutBox.defaultPaint', - 'parent': '140357727781376-13', - 'resolvedUrl': 'org-dartlang-sdk:///third_party/dart/sdk/lib/vm/hash.dart', - 'packageUri': 'dart:vm/hash.dart', - 'sourceLine': null, - }, - '140357727781376-15': { - 'category': 'Dart', - 'name': 'RenderObject._paintWithContext', - 'parent': '140357727781376-14', - 'resolvedUrl': - 'path/to/flutter/packages/flutter/lib/src/rendering/object.dart', - 'packageUri': 'package:flutter/rendering/object.dart', - 'sourceLine': null, - }, - '140357727781376-16': { - 'category': 'Dart', - 'name': 'RenderStack.paintStack', - 'parent': '140357727781376-14', - 'resolvedUrl': - 'path/to/flutter/packages/flutter/lib/src/rendering/stack.dart', - 'packageUri': 'package:flutter/rendering/stack.dart', - 'sourceLine': null, - }, - '140357727781376-17': { - 'category': 'Dart', - 'name': '_WidgetsFlutterBinding&BindingBase&Gesture._invokeFrameCallback', - 'parent': '140357727781376-16', - 'resolvedUrl': '', - 'packageUri': '', - 'sourceLine': null, - }, -}); +final goldenCpuProfileStackFrames = Map.from(subProfileStackFrames) + ..addAll({ + '140357727781376-12': { + 'category': 'Dart', + 'name': 'RenderPhysicalModel.paint', + 'parent': '140357727781376-9', + 'resolvedUrl': + 'path/to/flutter/packages/flutter/lib/src/rendering/proxy_box.dart', + 'packageUri': 'package:flutter/lib/src/rendering/proxy_box.dart', + 'sourceLine': null, + }, + '140357727781376-13': { + 'category': 'Dart', + 'name': 'RenderCustomMultiChildLayoutBox.paint', + 'parent': '140357727781376-12', + 'resolvedUrl': + 'path/to/flutter/packages/flutter/lib/src/rendering/custom_layout.dart', + 'packageUri': 'package:flutter/rendering/custom_layout.dart', + 'sourceLine': null, + }, + '140357727781376-14': { + 'category': 'Dart', + 'name': '_RenderCustomMultiChildLayoutBox.defaultPaint', + 'parent': '140357727781376-13', + 'resolvedUrl': + 'org-dartlang-sdk:///third_party/dart/sdk/lib/vm/hash.dart', + 'packageUri': 'dart:vm/hash.dart', + 'sourceLine': null, + }, + '140357727781376-15': { + 'category': 'Dart', + 'name': 'RenderObject._paintWithContext', + 'parent': '140357727781376-14', + 'resolvedUrl': + 'path/to/flutter/packages/flutter/lib/src/rendering/object.dart', + 'packageUri': 'package:flutter/rendering/object.dart', + 'sourceLine': null, + }, + '140357727781376-16': { + 'category': 'Dart', + 'name': 'RenderStack.paintStack', + 'parent': '140357727781376-14', + 'resolvedUrl': + 'path/to/flutter/packages/flutter/lib/src/rendering/stack.dart', + 'packageUri': 'package:flutter/rendering/stack.dart', + 'sourceLine': null, + }, + '140357727781376-17': { + 'category': 'Dart', + 'name': '_WidgetsFlutterBinding&BindingBase&Gesture._invokeFrameCallback', + 'parent': '140357727781376-16', + 'resolvedUrl': '', + 'packageUri': '', + 'sourceLine': null, + }, + }); final subProfileStackFrames = { '140357727781376-1': { @@ -1045,58 +1047,59 @@ final filteredCpuSampleTraceEvents = [ }, ]; -final goldenCpuProfileTraceEvents = List.of(subProfileTraceEvents)..addAll([ - { - 'ph': 'P', - 'name': '', - 'pid': 77616, - 'tid': 42247, - 'ts': 47377800363, - 'cat': 'Dart', - 'args': {'userTag': 'Default', 'vmTag': 'VM'}, - 'sf': '140357727781376-14', - }, - { - 'ph': 'P', - 'name': '', - 'pid': 77616, - 'tid': 42247, - 'ts': 47377800463, - 'cat': 'Dart', - 'args': {'userTag': 'Default', 'vmTag': 'VM'}, - 'sf': '140357727781376-14', - }, - { - 'ph': 'P', - 'name': '', - 'pid': 77616, - 'tid': 42247, - 'ts': 47377800563, - 'cat': 'Dart', - 'args': {'userTag': 'Default', 'vmTag': 'VM'}, - 'sf': '140357727781376-14', - }, - { - 'ph': 'P', - 'name': '', - 'pid': 77616, - 'tid': 42247, - 'ts': 47377800663, - 'cat': 'Dart', - 'args': {'userTag': 'Default', 'vmTag': 'VM'}, - 'sf': '140357727781376-15', - }, - { - 'ph': 'P', - 'name': '', - 'pid': 77616, - 'tid': 42247, - 'ts': 47377800763, - 'cat': 'Dart', - 'args': {'userTag': 'Default', 'vmTag': 'VM'}, - 'sf': '140357727781376-17', - }, -]); +final goldenCpuProfileTraceEvents = List.of(subProfileTraceEvents) + ..addAll([ + { + 'ph': 'P', + 'name': '', + 'pid': 77616, + 'tid': 42247, + 'ts': 47377800363, + 'cat': 'Dart', + 'args': {'userTag': 'Default', 'vmTag': 'VM'}, + 'sf': '140357727781376-14', + }, + { + 'ph': 'P', + 'name': '', + 'pid': 77616, + 'tid': 42247, + 'ts': 47377800463, + 'cat': 'Dart', + 'args': {'userTag': 'Default', 'vmTag': 'VM'}, + 'sf': '140357727781376-14', + }, + { + 'ph': 'P', + 'name': '', + 'pid': 77616, + 'tid': 42247, + 'ts': 47377800563, + 'cat': 'Dart', + 'args': {'userTag': 'Default', 'vmTag': 'VM'}, + 'sf': '140357727781376-14', + }, + { + 'ph': 'P', + 'name': '', + 'pid': 77616, + 'tid': 42247, + 'ts': 47377800663, + 'cat': 'Dart', + 'args': {'userTag': 'Default', 'vmTag': 'VM'}, + 'sf': '140357727781376-15', + }, + { + 'ph': 'P', + 'name': '', + 'pid': 77616, + 'tid': 42247, + 'ts': 47377800763, + 'cat': 'Dart', + 'args': {'userTag': 'Default', 'vmTag': 'VM'}, + 'sf': '140357727781376-17', + }, + ]); final subProfileTraceEvents = [ { @@ -1208,12 +1211,11 @@ final profileMetaData = CpuProfileMetaData( sampleCount: 10, samplePeriod: 1000, stackDepth: 128, - time: - TimeRange() - ..start = const Duration() - // Note this intentionally adds 10000 microseconds more than what - // was measured, regression test for Issue #8870. - ..end = const Duration(microseconds: 20000), + time: TimeRange() + ..start = const Duration() + // Note this intentionally adds 10000 microseconds more than what + // was measured, regression test for Issue #8870. + ..end = const Duration(microseconds: 20000), ); final tagFrameA = CpuStackFrame( @@ -1382,18 +1384,16 @@ final stackFrameG = CpuStackFrame( final testStackFrameWithRoot = CpuStackFrame.root(profileMetaData) ..addChild(testStackFrame.deepCopy()); -final testStackFrame = - stackFrameA..addChild( - stackFrameB - ..addChild(stackFrameC) - ..addChild( - stackFrameD - ..addChild( - stackFrameE..addChild(stackFrameF..addChild(stackFrameC2)), - ) - ..addChild(stackFrameF2..addChild(stackFrameC3)), - ), - ); +final testStackFrame = stackFrameA + ..addChild( + stackFrameB + ..addChild(stackFrameC) + ..addChild( + stackFrameD + ..addChild(stackFrameE..addChild(stackFrameF..addChild(stackFrameC2))) + ..addChild(stackFrameF2..addChild(stackFrameC3)), + ), + ); final testTagRootedStackFrame = tagFrameA..addChild(testStackFrame.deepCopy()); @@ -1529,10 +1529,9 @@ final zeroProfileMetaData = CpuProfileMetaData( sampleCount: 0, samplePeriod: 50, stackDepth: 128, - time: - TimeRange() - ..start = const Duration() - ..end = const Duration(microseconds: 100), + time: TimeRange() + ..start = const Duration() + ..end = const Duration(microseconds: 100), ); final zeroStackFrame = CpuStackFrame( diff --git a/packages/devtools_app/test/test_infra/test_data/debugger/vm_service_object_tree.dart b/packages/devtools_app/test/test_infra/test_data/debugger/vm_service_object_tree.dart index f23c9315845..8ad6c416cc4 100644 --- a/packages/devtools_app/test/test_infra/test_data/debugger/vm_service_object_tree.dart +++ b/packages/devtools_app/test/test_infra/test_data/debugger/vm_service_object_tree.dart @@ -43,19 +43,18 @@ final testClass = Class( ); // We need to invoke `Script.parse` to build the internal token position table. -final testScript = - Script.parse( - Script( - uri: 'fooScript.dart', - library: testLibRef, - id: '1234', - tokenPosTable: [ - [10, 10, 1], - [20, 20, 1], - [30, 30, 1], - ], - ).toJson(), - )!; +final testScript = Script.parse( + Script( + uri: 'fooScript.dart', + library: testLibRef, + id: '1234', + tokenPosTable: [ + [10, 10, 1], + [20, 20, 1], + [30, 30, 1], + ], + ).toJson(), +)!; final testFunction = Func( name: 'fooFunction', diff --git a/packages/devtools_app/test/test_infra/test_data/memory/heap/heap_data.dart b/packages/devtools_app/test/test_infra/test_data/memory/heap/heap_data.dart index d8392e640d0..7d955a9fd77 100644 --- a/packages/devtools_app/test/test_infra/test_data/memory/heap/heap_data.dart +++ b/packages/devtools_app/test/test_infra/test_data/memory/heap/heap_data.dart @@ -23,8 +23,9 @@ class GoldenHeapTest extends HeapTest { @override Future loadHeap() async { - final (graph, _) = - await HeapGraphLoaderFile.fromPath('$_dataDir$fileName').load(); + final (graph, _) = await HeapGraphLoaderFile.fromPath( + '$_dataDir$fileName', + ).load(); return graph; } } diff --git a/packages/devtools_app/test/test_infra/test_data/performance/sample_performance_data.dart b/packages/devtools_app/test/test_infra/test_data/performance/sample_performance_data.dart index a6a373587e3..12894d799cd 100644 --- a/packages/devtools_app/test/test_infra/test_data/performance/sample_performance_data.dart +++ b/packages/devtools_app/test/test_infra/test_data/performance/sample_performance_data.dart @@ -17,16 +17,14 @@ import '../../utils/test_utils.dart'; part '_perfetto_events_raw.dart'; -PerfettoTimeline perfettoVmTimeline = - PerfettoTimeline.parse({ - 'trace': base64Encode( - (rawPerformanceData[OfflinePerformanceData.traceBinaryKey] - as List) - .cast(), - ), - 'timeOriginMicros': 0, - 'timeExtentMicros': 800000000000, - })!; +PerfettoTimeline perfettoVmTimeline = PerfettoTimeline.parse({ + 'trace': base64Encode( + (rawPerformanceData[OfflinePerformanceData.traceBinaryKey] as List) + .cast(), + ), + 'timeOriginMicros': 0, + 'timeExtentMicros': 800000000000, +})!; Map rawPerformanceData = (samplePerformanceData[ScreenMetaData.performance.id] as Map) @@ -180,34 +178,34 @@ abstract class FlutterFrame2 { endMicros: 713834379102, ); - static final rasterEvent = - rasterizerDoDrawEvent..addChild( - rasterizerDrawToSurfacesEvent..addAllChildren([ - gpuSurfaceMetalImpellerAcquireFrameEvent..addChild( - surfaceMTLWrapCurrentMetalLayerDrawableEvent - ..addChild(waitForNextDrawableEvent), - ), - compositorContextScopedFrameRasterEvent..addAllChildren([ - layerTreePrerollEvent, - iOSExternalViewEmbedderPostPrerollActionEvent, - layerTreePaintEvent, - ]), - surfaceFrameSubmitEvent..addAllChildren([ - surfaceFrameBuildDisplayListEvent, - displayListDispatcherEndRecordingAsPictureEvent, - rendererRenderEvent..addChild( - entityPassOnRenderEvent..addChild( - createGlyphAtlasEvent..addAllChildren([ - canAppendToExistingAtlasEvent, - optimumAtlasSizeForFontGlyphPairsEvent, - createAtlasBitmapEvent, - uploadGlyphTextureAtlasEvent, - ]), - ), + static final rasterEvent = rasterizerDoDrawEvent + ..addChild( + rasterizerDrawToSurfacesEvent..addAllChildren([ + gpuSurfaceMetalImpellerAcquireFrameEvent..addChild( + surfaceMTLWrapCurrentMetalLayerDrawableEvent + ..addChild(waitForNextDrawableEvent), + ), + compositorContextScopedFrameRasterEvent..addAllChildren([ + layerTreePrerollEvent, + iOSExternalViewEmbedderPostPrerollActionEvent, + layerTreePaintEvent, + ]), + surfaceFrameSubmitEvent..addAllChildren([ + surfaceFrameBuildDisplayListEvent, + displayListDispatcherEndRecordingAsPictureEvent, + rendererRenderEvent..addChild( + entityPassOnRenderEvent..addChild( + createGlyphAtlasEvent..addAllChildren([ + canAppendToExistingAtlasEvent, + optimumAtlasSizeForFontGlyphPairsEvent, + createAtlasBitmapEvent, + uploadGlyphTextureAtlasEvent, + ]), ), - ]), + ), ]), - ); + ]), + ); static final rasterizerDoDrawEvent = testTimelineEvent( name: 'Rasterizer::DoDraw', type: TimelineEventType.raster, @@ -367,20 +365,18 @@ abstract class FlutterFrame2 { /// Data for Frame (id: 4) abstract class FlutterFrame4 { - static final frame = - FlutterFrame.fromJson(_frameJson) - ..setEventFlow(uiEvent) - ..setEventFlow(rasterEvent); + static final frame = FlutterFrame.fromJson(_frameJson) + ..setEventFlow(uiEvent) + ..setEventFlow(rasterEvent); /// A frame with extra timeline events for the purpose of testing. /// /// Some events included in [uiEventWithExtras] (and `rasterEventWithExtras` /// if un-commented) are not part of the original trace from with /// [FlutterFrame4] was formed. - static final frameWithExtras = - FlutterFrame.fromJson(_frameJson) - ..setEventFlow(uiEventWithExtras) - ..setEventFlow(rasterEvent); + static final frameWithExtras = FlutterFrame.fromJson(_frameJson) + ..setEventFlow(uiEventWithExtras) + ..setEventFlow(rasterEvent); static final _frameJson = { 'number': 4, @@ -425,17 +421,16 @@ abstract class FlutterFrame4 { CreateGlyphAtlas [713836210893 μs - 713836210899 μs] '''; - static final uiEvent = - animatorBeginFrameEvent..addAllChildren([ - layoutRootEvent..addChild(layoutEvent), - updatingCompositingBitsRootEvent - ..addChild(updatingCompositingBitsEvent), - paintRootEvent..addChild(paintEvent), - compositingEvent..addChild(animatorRenderEvent), - semanticsRootEvent..addChild(semanticsEvent), - finalizeTreeEvent, - postFrameEvent, - ]); + static final uiEvent = animatorBeginFrameEvent + ..addAllChildren([ + layoutRootEvent..addChild(layoutEvent), + updatingCompositingBitsRootEvent..addChild(updatingCompositingBitsEvent), + paintRootEvent..addChild(paintEvent), + compositingEvent..addChild(animatorRenderEvent), + semanticsRootEvent..addChild(semanticsEvent), + finalizeTreeEvent, + postFrameEvent, + ]); static FlutterTimelineEvent uiEventWithExtras = animatorBeginFrameEvent.shallowCopy()..addAllChildren([ @@ -751,27 +746,27 @@ abstract class FlutterFrame4 { endMicros: 713836202360, ); - static final rasterEvent = - rasterizerDoDrawEvent..addChild( - rasterizerDrawToSurfacesEvent..addAllChildren([ - gpuSurfaceMetalImpellerAcquireFrameEvent..addChild( - surfaceMTLWrapCurrentMetalLayerDrawableEvent - ..addChild(waitForNextDrawableEvent), + static final rasterEvent = rasterizerDoDrawEvent + ..addChild( + rasterizerDrawToSurfacesEvent..addAllChildren([ + gpuSurfaceMetalImpellerAcquireFrameEvent..addChild( + surfaceMTLWrapCurrentMetalLayerDrawableEvent + ..addChild(waitForNextDrawableEvent), + ), + compositorContextScopedFrameRasterEvent..addAllChildren([ + layerTreePrerollEvent, + iOSExternalViewEmbedderPostPrerollActionEvent, + layerTreePaintEvent, + ]), + surfaceFrameSubmitEvent..addAllChildren([ + surfaceFrameBuildDisplayListEvent, + displayListDispatcherEndRecordingAsPictureEvent, + rendererRenderEvent..addChild( + entityPassOnRenderEvent..addChild(createGlyphAtlasEvent), ), - compositorContextScopedFrameRasterEvent..addAllChildren([ - layerTreePrerollEvent, - iOSExternalViewEmbedderPostPrerollActionEvent, - layerTreePaintEvent, - ]), - surfaceFrameSubmitEvent..addAllChildren([ - surfaceFrameBuildDisplayListEvent, - displayListDispatcherEndRecordingAsPictureEvent, - rendererRenderEvent..addChild( - entityPassOnRenderEvent..addChild(createGlyphAtlasEvent), - ), - ]), ]), - ); + ]), + ); // static final rasterEventWithExtras = rasterizerDoDrawEvent.shallowCopy() // ..addChild( @@ -935,10 +930,9 @@ abstract class FlutterFrame4 { /// Data for Frame (id: 6) abstract class FlutterFrame6 { - static final frame = - FlutterFrame.fromJson(_frameJson) - ..setEventFlow(uiEvent) - ..setEventFlow(rasterEvent); + static final frame = FlutterFrame.fromJson(_frameJson) + ..setEventFlow(uiEvent) + ..setEventFlow(rasterEvent); static final frameWithoutTimelineEvents = FlutterFrame.fromJson(_frameJson); @@ -985,17 +979,16 @@ abstract class FlutterFrame6 { CreateGlyphAtlas [713836331499 μs - 713836331505 μs] '''; - static final uiEvent = - animatorBeginFrameEvent..addAllChildren([ - layoutRootEvent..addChild(layoutEvent), - updatingCompositingBitsRootEvent - ..addChild(updatingCompositingBitsEvent), - paintRootEvent..addChild(paintEvent), - compositingEvent..addChild(animatorRenderEvent), - semanticsRootEvent..addChild(semanticsEvent), - finalizeTreeEvent, - postFrameEvent, - ]); + static final uiEvent = animatorBeginFrameEvent + ..addAllChildren([ + layoutRootEvent..addChild(layoutEvent), + updatingCompositingBitsRootEvent..addChild(updatingCompositingBitsEvent), + paintRootEvent..addChild(paintEvent), + compositingEvent..addChild(animatorRenderEvent), + semanticsRootEvent..addChild(semanticsEvent), + finalizeTreeEvent, + postFrameEvent, + ]); static final animatorBeginFrameEvent = testTimelineEvent( name: 'Animator::BeginFrame', @@ -1209,27 +1202,27 @@ abstract class FlutterFrame6 { endMicros: 713836330989, ); - static final rasterEvent = - rasterizerDoDrawEvent..addChild( - rasterizerDrawToSurfacesEvent..addAllChildren([ - gpuSurfaceMetalImpellerAcquireFrameEvent..addChild( - surfaceMTLWrapCurrentMetalLayerDrawableEvent - ..addChild(waitForNextDrawableEvent), + static final rasterEvent = rasterizerDoDrawEvent + ..addChild( + rasterizerDrawToSurfacesEvent..addAllChildren([ + gpuSurfaceMetalImpellerAcquireFrameEvent..addChild( + surfaceMTLWrapCurrentMetalLayerDrawableEvent + ..addChild(waitForNextDrawableEvent), + ), + compositorContextScopedFrameRasterEvent..addAllChildren([ + layerTreePrerollEvent, + iOSExternalViewEmbedderPostPrerollActionEvent, + layerTreePaintEvent, + ]), + surfaceFrameSubmitEvent..addAllChildren([ + surfaceFrameBuildDisplayListEvent, + displayListDispatcherEndRecordingAsPictureEvent, + rendererRenderEvent..addChild( + entityPassOnRenderEvent..addChild(createGlyphAtlasEvent), ), - compositorContextScopedFrameRasterEvent..addAllChildren([ - layerTreePrerollEvent, - iOSExternalViewEmbedderPostPrerollActionEvent, - layerTreePaintEvent, - ]), - surfaceFrameSubmitEvent..addAllChildren([ - surfaceFrameBuildDisplayListEvent, - displayListDispatcherEndRecordingAsPictureEvent, - rendererRenderEvent..addChild( - entityPassOnRenderEvent..addChild(createGlyphAtlasEvent), - ), - ]), ]), - ); + ]), + ); static final rasterizerDoDrawEvent = testTimelineEvent( name: 'Rasterizer::DoDraw', diff --git a/packages/devtools_app/test/test_infra/utils/ansi.dart b/packages/devtools_app/test/test_infra/utils/ansi.dart index b3e77d130ef..08a0e656c67 100644 --- a/packages/devtools_app/test/test_infra/utils/ansi.dart +++ b/packages/devtools_app/test/test_infra/utils/ansi.dart @@ -34,12 +34,11 @@ class AnsiWriter { /// Directly index the xterm 256 color palette. void xterm(int color, {bool bg = false}) { - final c = - color < 0 - ? 0 - : color > 255 - ? 255 - : color; + final c = color < 0 + ? 0 + : color > 255 + ? 255 + : color; if (bg) { _background = c; diff --git a/packages/devtools_app/test/test_infra/utils/rendering_tester.dart b/packages/devtools_app/test/test_infra/utils/rendering_tester.dart index 0e54df055c0..200b78c0933 100644 --- a/packages/devtools_app/test/test_infra/utils/rendering_tester.dart +++ b/packages/devtools_app/test/test_infra/utils/rendering_tester.dart @@ -471,8 +471,8 @@ class TestPushLayerPaintingContext extends PaintingContext { // Absorbs errors that don't have "overflowed" in their error details. void absorbOverflowedErrors() { - final errorDetails = - TestRenderingFlutterBinding.instance.takeAllFlutterErrorDetails(); + final errorDetails = TestRenderingFlutterBinding.instance + .takeAllFlutterErrorDetails(); final filtered = errorDetails.where((FlutterErrorDetails details) { return !details.toString().contains('overflowed'); }); @@ -483,8 +483,8 @@ void absorbOverflowedErrors() { // Reports any FlutterErrors. void expectNoFlutterErrors() { - final errorDetails = - TestRenderingFlutterBinding.instance.takeAllFlutterErrorDetails(); + final errorDetails = TestRenderingFlutterBinding.instance + .takeAllFlutterErrorDetails(); errorDetails.forEach(FlutterError.reportError); } diff --git a/packages/devtools_app/test/test_infra/utils/test_utils.dart b/packages/devtools_app/test/test_infra/utils/test_utils.dart index b85665b8b5b..e3898715985 100644 --- a/packages/devtools_app/test/test_infra/utils/test_utils.dart +++ b/packages/devtools_app/test/test_infra/utils/test_utils.dart @@ -29,8 +29,9 @@ FlutterTimelineEvent testTimelineEvent({ when(mockFirstTrackEvent.timestampMicros).thenReturn(startMicros); final frameNumberAsString = args[PerfettoTrackEvent.frameNumberArg] as String?; - final frameNumber = - frameNumberAsString != null ? int.tryParse(frameNumberAsString) : null; + final frameNumber = frameNumberAsString != null + ? int.tryParse(frameNumberAsString) + : null; when(mockFirstTrackEvent.flutterFrameNumber).thenReturn(frameNumber); final devToolsTag = args[PerfettoTrackEvent.devtoolsTagArg] as String?; final isShaderEvent = devToolsTag == PerfettoTrackEvent.shadersArg; diff --git a/packages/devtools_app/test_driver/integration_test.dart b/packages/devtools_app/test_driver/integration_test.dart index 520654de253..841105f01ff 100644 --- a/packages/devtools_app/test_driver/integration_test.dart +++ b/packages/devtools_app/test_driver/integration_test.dart @@ -21,79 +21,81 @@ Future main() async { final driver = await FlutterDriver.connect(); await integrationDriver( driver: driver, - onScreenshot: ( - String screenshotName, - List screenshotBytes, [ - Map? args, - ]) async { - final shouldUpdateGoldens = args?['update_goldens'] == true; - - // TODO(https://github.com/flutter/flutter/issues/118470): remove this. - // We need this to ensure all golden image checks run. Without this - // workaround, the flutter integration test framework will crash on the - // failed expectation. - final lastScreenshot = args?['last_screenshot'] == true; - - final goldenFile = File('$_goldensDirectoryPath/$screenshotName.png'); - - if (shouldUpdateGoldens) { - if (!goldenFile.existsSync()) { - // Create the goldens directory if it does not exist. - Directory(_goldensDirectoryPath).createSync(); - } - goldenFile.writeAsBytesSync(screenshotBytes, flush: true); - print('Golden image updated: $screenshotName.png'); - return true; - } - - bool equal = false; - double percentDiff = 1.0; - if (goldenFile.existsSync()) { - final goldenBytes = goldenFile.readAsBytesSync(); - equal = const DeepCollectionEquality().equals( - goldenBytes, - screenshotBytes, - ); - if (!equal) { - percentDiff = _percentDiff(goldenBytes, screenshotBytes); - } - } - - final failuresDirectory = Directory(_failuresDirectoryPath); - - if (!equal) { - final percentDiffDisplay = '${(percentDiff * 100).toStringAsFixed(4)}%'; - if (percentDiff < _defaultDiffTolerance) { - print( - 'Warning: $screenshotName.png differed from the golden image by ' - '$percentDiffDisplay. Since this is less than the acceptable ' - 'tolerance ${(_defaultDiffTolerance * 100).toStringAsFixed(4)}%, ' - 'the test still passes.', - ); + onScreenshot: + ( + String screenshotName, + List screenshotBytes, [ + Map? args, + ]) async { + final shouldUpdateGoldens = args?['update_goldens'] == true; + + // TODO(https://github.com/flutter/flutter/issues/118470): remove this. + // We need this to ensure all golden image checks run. Without this + // workaround, the flutter integration test framework will crash on the + // failed expectation. + final lastScreenshot = args?['last_screenshot'] == true; + + final goldenFile = File('$_goldensDirectoryPath/$screenshotName.png'); + + if (shouldUpdateGoldens) { + if (!goldenFile.existsSync()) { + // Create the goldens directory if it does not exist. + Directory(_goldensDirectoryPath).createSync(); + } + goldenFile.writeAsBytesSync(screenshotBytes, flush: true); + print('Golden image updated: $screenshotName.png'); + return true; + } + + bool equal = false; + double percentDiff = 1.0; + if (goldenFile.existsSync()) { + final goldenBytes = goldenFile.readAsBytesSync(); + equal = const DeepCollectionEquality().equals( + goldenBytes, + screenshotBytes, + ); + if (!equal) { + percentDiff = _percentDiff(goldenBytes, screenshotBytes); + } + } + + final failuresDirectory = Directory(_failuresDirectoryPath); + + if (!equal) { + final percentDiffDisplay = + '${(percentDiff * 100).toStringAsFixed(4)}%'; + if (percentDiff < _defaultDiffTolerance) { + print( + 'Warning: $screenshotName.png differed from the golden image by ' + '$percentDiffDisplay. Since this is less than the acceptable ' + 'tolerance ${(_defaultDiffTolerance * 100).toStringAsFixed(4)}%, ' + 'the test still passes.', + ); + return true; + } + print( + 'Golden image test failed: $screenshotName.png. The test image ' + 'differed from the golden image by $percentDiffDisplay.', + ); + + // Create the goldens and failures directories if they do not exist. + Directory(_goldensDirectoryPath).createSync(); + failuresDirectory.createSync(); + + File( + '$_failuresDirectoryPath/$screenshotName.png', + ).writeAsBytesSync(screenshotBytes); + } + + if (lastScreenshot && + failuresDirectory.existsSync() && + failuresDirectory.listSync().isNotEmpty) { + return false; + } + return true; - } - print( - 'Golden image test failed: $screenshotName.png. The test image ' - 'differed from the golden image by $percentDiffDisplay.', - ); - - // Create the goldens and failures directories if they do not exist. - Directory(_goldensDirectoryPath).createSync(); - failuresDirectory.createSync(); - - File( - '$_failuresDirectoryPath/$screenshotName.png', - ).writeAsBytesSync(screenshotBytes); - } - - if (lastScreenshot && - failuresDirectory.existsSync() && - failuresDirectory.listSync().isNotEmpty) { - return false; - } - - return true; - }, + }, ); } diff --git a/packages/devtools_app_shared/lib/src/ui/text_field.dart b/packages/devtools_app_shared/lib/src/ui/text_field.dart index 68b98d57ee9..04a0d38e770 100644 --- a/packages/devtools_app_shared/lib/src/ui/text_field.dart +++ b/packages/devtools_app_shared/lib/src/ui/text_field.dart @@ -75,19 +75,19 @@ final class DevToolsClearableTextField extends StatelessWidget { hintStyle: theme.subtleTextStyle, prefixIcon: prefixIcon, suffixIcon: SizedBox( - height: inputDecorationElementHeight, - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - ...additionalSuffixActions, - InputDecorationSuffixButton.clear( - onPressed: () { - controller.clear(); - onChanged?.call(''); - }, - ), - ], - ), + height: inputDecorationElementHeight, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + ...additionalSuffixActions, + InputDecorationSuffixButton.clear( + onPressed: () { + controller.clear(); + onChanged?.call(''); + }, + ), + ], + ), ), ), ), From ba844cd4b2f422eb84acb5082ae200a1ce3f6ea9 Mon Sep 17 00:00:00 2001 From: Kenzie Davisson Date: Thu, 1 May 2025 13:31:49 -0700 Subject: [PATCH 2/5] fix lints --- .../lib/src/service/service_manager.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/devtools_app_shared/lib/src/service/service_manager.dart b/packages/devtools_app_shared/lib/src/service/service_manager.dart index 2d39c3d719a..46852296829 100644 --- a/packages/devtools_app_shared/lib/src/service/service_manager.dart +++ b/packages/devtools_app_shared/lib/src/service/service_manager.dart @@ -293,12 +293,12 @@ class ServiceManager { await callLifecycleCallbacks( ServiceManagerLifecycle.beforeCloseVmService, - this.service, + service, ); _closeVmServiceConnection(); await callLifecycleCallbacks( ServiceManagerLifecycle.afterCloseVmService, - this.service, + service, ); resolvedUriManager.vmServiceClosed(); @@ -547,7 +547,7 @@ class ServiceManager { Future _lookupPackageRootByEval(Library rootLibrary) async { final eval = EvalOnDartLibrary( rootLibrary.uri!, - this.service! as VmService, + service! as VmService, serviceManager: this, // Swallow exceptions since this evaluation may be called on an older // version of package:test where we do not expect the evaluation to From 6ef0450d964720526d6a13981a7a17bf242ff759 Mon Sep 17 00:00:00 2001 From: Kenzie Davisson Date: Thu, 1 May 2025 13:53:25 -0700 Subject: [PATCH 3/5] update dcm and fix warnings --- .github/workflows/build.yaml | 2 +- .../devtools_app/lib/src/framework/observer/_memory_web.dart | 2 ++ packages/devtools_app/lib/src/shared/ui/filter.dart | 2 +- .../devtools_app/test/test_infra/scenes/memory/default.dart | 3 +-- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index dd3190e9d7d..a65ca853937 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -74,7 +74,7 @@ jobs: wget -qO- https://dcm.dev/pgp-key.public | sudo gpg --dearmor -o /usr/share/keyrings/dcm.gpg echo 'deb [signed-by=/usr/share/keyrings/dcm.gpg arch=amd64] https://dcm.dev/debian stable main' | sudo tee /etc/apt/sources.list.d/dart_stable.list sudo apt-get update - sudo apt-get install dcm=1.24.2-1 # To avoid errors add `-1` (build number) to the version + sudo apt-get install dcm=1.28.0-1 # To avoid errors add `-1` (build number) to the version sudo chmod +x /usr/bin/dcm echo "$(dcm --version)" - name: Setup Dart SDK diff --git a/packages/devtools_app/lib/src/framework/observer/_memory_web.dart b/packages/devtools_app/lib/src/framework/observer/_memory_web.dart index d9af70a73ff..251cfb64071 100644 --- a/packages/devtools_app/lib/src/framework/observer/_memory_web.dart +++ b/packages/devtools_app/lib/src/framework/observer/_memory_web.dart @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file or at https://developers.google.com/open-source/licenses/bsd. +// ignore_for_file: prefer-correct-type-name + import 'dart:js_interop'; import 'dart:js_interop_unsafe'; diff --git a/packages/devtools_app/lib/src/shared/ui/filter.dart b/packages/devtools_app/lib/src/shared/ui/filter.dart index 78d0aa5e8ad..5c9350da0b2 100644 --- a/packages/devtools_app/lib/src/shared/ui/filter.dart +++ b/packages/devtools_app/lib/src/shared/ui/filter.dart @@ -505,7 +505,7 @@ class QueryFilter { } } - final bool validArgumentFilter = args.values.any( + final validArgumentFilter = args.values.any( (a) => a.values.isNotEmpty, ); if (!validArgumentFilter && substringExpressions.isEmpty) { diff --git a/packages/devtools_app/test/test_infra/scenes/memory/default.dart b/packages/devtools_app/test/test_infra/scenes/memory/default.dart index 0e6002392e2..f9f15a12675 100644 --- a/packages/devtools_app/test/test_infra/scenes/memory/default.dart +++ b/packages/devtools_app/test/test_infra/scenes/memory/default.dart @@ -63,10 +63,9 @@ abstract class MemoryDefaultSceneHeaps { .toList(); static final golden = goldenHeapTests - // ignore: avoid-redundant-async, match signature .map( (e) => - () async => e.loadHeap(), + () => e.loadHeap(), ) .toList(); From 2e8aed986a65c4266cf7a27c8d85bfa05cda65f4 Mon Sep 17 00:00:00 2001 From: Kenzie Davisson Date: Thu, 1 May 2025 14:07:56 -0700 Subject: [PATCH 4/5] formatting --- packages/devtools_app/lib/src/shared/ui/filter.dart | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/devtools_app/lib/src/shared/ui/filter.dart b/packages/devtools_app/lib/src/shared/ui/filter.dart index 5c9350da0b2..0cb29166a41 100644 --- a/packages/devtools_app/lib/src/shared/ui/filter.dart +++ b/packages/devtools_app/lib/src/shared/ui/filter.dart @@ -505,9 +505,7 @@ class QueryFilter { } } - final validArgumentFilter = args.values.any( - (a) => a.values.isNotEmpty, - ); + final validArgumentFilter = args.values.any((a) => a.values.isNotEmpty); if (!validArgumentFilter && substringExpressions.isEmpty) { return QueryFilter.empty(args: args); } From 4b88b83275256c2e7ef7972472fa30baaa6d8173 Mon Sep 17 00:00:00 2001 From: Kenzie Davisson Date: Thu, 1 May 2025 15:15:36 -0700 Subject: [PATCH 5/5] goldens --- .../memory/load_offline_data_profile_tab.png | Bin 31964 -> 28761 bytes .../memory/load_offline_data_trace_tab.png | Bin 55839 -> 55838 bytes .../goldens/settings_dialog_default.png | Bin 12488 -> 12476 bytes .../goldens/settings_dialog_modified.png | Bin 12726 -> 12716 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/packages/devtools_app/test/test_infra/goldens/memory/load_offline_data_profile_tab.png b/packages/devtools_app/test/test_infra/goldens/memory/load_offline_data_profile_tab.png index f3ff3691f1da8dccd449309c52e5c02f1f2bb994..97595ba6d0fb26ed19fb67e5a80079b4642c499b 100644 GIT binary patch literal 28761 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 literal 31964 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 YA~V*eCE3e5#+{4lDGTGglg_{Y2V>Ev(*OVf diff --git a/packages/devtools_app/test/test_infra/goldens/memory/load_offline_data_trace_tab.png b/packages/devtools_app/test/test_infra/goldens/memory/load_offline_data_trace_tab.png index 97737a2505359b3046586e52a6dd2c469087b67c..bacc8c8b52adac28b8d9c7ee56c5f7455833d622 100644 GIT binary patch delta 26022 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 AkN^Mx delta 26324 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 PS{7jrd;Cm07;@$R!Mx0{ diff --git a/packages/devtools_app/test/test_infra/goldens/settings_dialog_default.png b/packages/devtools_app/test/test_infra/goldens/settings_dialog_default.png index e394284c04f7979ea057798494420df87d39a50d..0d5ba8cb7b143eb11a22cd82008f6c21d4f82617 100644 GIT binary patch delta 2906 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 E0|A^O_W%F@ diff --git a/packages/devtools_app/test/test_infra/goldens/settings_dialog_modified.png b/packages/devtools_app/test/test_infra/goldens/settings_dialog_modified.png index 5439001a8accb58cf486fc5a3c43652fe2423e6e..d73e69222e11eb2a6972fd931062ef6629ad042e 100644 GIT binary patch delta 3233 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