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/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..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'; @@ -27,8 +29,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..0cb29166a41 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( @@ -506,9 +505,7 @@ class QueryFilter { } } - final bool 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); } @@ -530,13 +527,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 +586,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 +658,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 +811,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/goldens/memory/load_offline_data_profile_tab.png b/packages/devtools_app/test/test_infra/goldens/memory/load_offline_data_profile_tab.png index f3ff3691f1d..97595ba6d0f 100644 Binary files a/packages/devtools_app/test/test_infra/goldens/memory/load_offline_data_profile_tab.png and b/packages/devtools_app/test/test_infra/goldens/memory/load_offline_data_profile_tab.png differ 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 97737a25053..bacc8c8b52a 100644 Binary files a/packages/devtools_app/test/test_infra/goldens/memory/load_offline_data_trace_tab.png and b/packages/devtools_app/test/test_infra/goldens/memory/load_offline_data_trace_tab.png differ 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 e394284c04f..0d5ba8cb7b1 100644 Binary files a/packages/devtools_app/test/test_infra/goldens/settings_dialog_default.png and b/packages/devtools_app/test/test_infra/goldens/settings_dialog_default.png differ 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 5439001a8ac..d73e69222e1 100644 Binary files a/packages/devtools_app/test/test_infra/goldens/settings_dialog_modified.png and b/packages/devtools_app/test/test_infra/goldens/settings_dialog_modified.png differ 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..f9f15a12675 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,18 @@ 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 + .map( + (e) => + () => e.loadHeap(), + ) + .toList(); static List get all => [ ...forDiffTesting, @@ -154,11 +158,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/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 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(''); + }, + ), + ], + ), ), ), ),